agent-cli 0.104.0__tar.gz → 0.105.0__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 (456) hide show
  1. {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/workflows/docker.yml +87 -1
  2. {agent_cli-0.104.0 → agent_cli-0.105.0}/PKG-INFO +1 -1
  3. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/cli.py +12 -0
  4. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/backends/base.py +1 -0
  5. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/backends/transformers.py +32 -1
  6. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/model_manager.py +2 -0
  7. {agent_cli-0.104.0 → agent_cli-0.105.0}/docker/docker-compose.yml +2 -2
  8. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/server/transcribe-proxy.md +9 -5
  9. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/server/whisper.md +3 -0
  10. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/installation/docker.md +1 -1
  11. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/appcast.xml +19 -16
  12. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_api_integration.py +38 -0
  13. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_server_whisper.py +3 -0
  14. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_transformers_backend.py +67 -2
  15. {agent_cli-0.104.0 → agent_cli-0.105.0}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  16. {agent_cli-0.104.0 → agent_cli-0.105.0}/.claude/skills/agent-cli-dev/examples.md +0 -0
  17. {agent_cli-0.104.0 → agent_cli-0.105.0}/.claude-plugin/README.md +0 -0
  18. {agent_cli-0.104.0 → agent_cli-0.105.0}/.claude-plugin/marketplace.json +0 -0
  19. {agent_cli-0.104.0 → agent_cli-0.105.0}/.claude-plugin/plugin.json +0 -0
  20. {agent_cli-0.104.0 → agent_cli-0.105.0}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  21. {agent_cli-0.104.0 → agent_cli-0.105.0}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  22. {agent_cli-0.104.0 → agent_cli-0.105.0}/.cursorrules +0 -0
  23. {agent_cli-0.104.0 → agent_cli-0.105.0}/.dockerignore +0 -0
  24. {agent_cli-0.104.0 → agent_cli-0.105.0}/.env.example +0 -0
  25. {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/logo.svg +0 -0
  26. {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/release-drafter.yml +0 -0
  27. {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/renovate.json +0 -0
  28. {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/scripts/check_extras_sync.py +0 -0
  29. {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/scripts/check_plugin_skill_sync.py +0 -0
  30. {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/scripts/normalize_appcast.py +0 -0
  31. {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/scripts/sync_extras.py +0 -0
  32. {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/scripts/sync_requirements.py +0 -0
  33. {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/workflows/automerge.yml +0 -0
  34. {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/workflows/docs.yml +0 -0
  35. {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/workflows/markdown-code-runner.yml +0 -0
  36. {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/workflows/pytest.yml +0 -0
  37. {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/workflows/release-drafter.yml +0 -0
  38. {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/workflows/release.yml +0 -0
  39. {agent_cli-0.104.0 → agent_cli-0.105.0}/.github/workflows/toc.yaml +0 -0
  40. {agent_cli-0.104.0 → agent_cli-0.105.0}/.gitignore +0 -0
  41. {agent_cli-0.104.0 → agent_cli-0.105.0}/.jscpd.json +0 -0
  42. {agent_cli-0.104.0 → agent_cli-0.105.0}/.pre-commit-config.yaml +0 -0
  43. {agent_cli-0.104.0 → agent_cli-0.105.0}/.prompts/docs-review.md +0 -0
  44. {agent_cli-0.104.0 → agent_cli-0.105.0}/.prompts/pr-review.md +0 -0
  45. {agent_cli-0.104.0 → agent_cli-0.105.0}/CLAUDE.md +0 -0
  46. {agent_cli-0.104.0 → agent_cli-0.105.0}/LICENSE +0 -0
  47. {agent_cli-0.104.0 → agent_cli-0.105.0}/LLAMA_SERVER_USAGE.md +0 -0
  48. {agent_cli-0.104.0 → agent_cli-0.105.0}/README.md +0 -0
  49. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/__init__.py +0 -0
  50. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/__main__.py +0 -0
  51. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_extras.json +0 -0
  52. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_overrides/nemo-whisper.txt +0 -0
  53. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/.gitkeep +0 -0
  54. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/audio.txt +0 -0
  55. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/diarization.txt +0 -0
  56. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/faster-whisper.txt +0 -0
  57. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/kokoro.txt +0 -0
  58. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/llm.txt +0 -0
  59. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/memory.txt +0 -0
  60. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  61. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/nemo-whisper.txt +0 -0
  62. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/piper.txt +0 -0
  63. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/rag.txt +0 -0
  64. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/server.txt +0 -0
  65. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/speed.txt +0 -0
  66. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/vad.txt +0 -0
  67. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/vectordb.txt +0 -0
  68. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  69. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_requirements/wyoming.txt +0 -0
  70. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/_tools.py +0 -0
  71. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/__init__.py +0 -0
  72. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/_voice_agent_common.py +0 -0
  73. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/assistant.py +0 -0
  74. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/autocorrect.py +0 -0
  75. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/chat.py +0 -0
  76. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/diarize_live_session.py +0 -0
  77. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/memory/__init__.py +0 -0
  78. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/memory/add.py +0 -0
  79. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/memory/proxy.py +0 -0
  80. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/rag_proxy.py +0 -0
  81. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/speak.py +0 -0
  82. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/speakers.py +0 -0
  83. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/transcribe.py +0 -0
  84. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/transcribe_live.py +0 -0
  85. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/agents/voice_edit.py +0 -0
  86. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/api.py +0 -0
  87. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/cli.py +0 -0
  88. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/config.py +0 -0
  89. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/config_cmd.py +0 -0
  90. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/constants.py +0 -0
  91. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/__init__.py +0 -0
  92. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/alignment.py +0 -0
  93. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/audio.py +0 -0
  94. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/audio_format.py +0 -0
  95. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/chroma.py +0 -0
  96. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/deps.py +0 -0
  97. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/diarization.py +0 -0
  98. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/openai_proxy.py +0 -0
  99. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/process.py +0 -0
  100. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/reranker.py +0 -0
  101. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/speaker_identity.py +0 -0
  102. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/sse.py +0 -0
  103. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/transcription_logger.py +0 -0
  104. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/utils.py +0 -0
  105. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/vad.py +0 -0
  106. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/core/watch.py +0 -0
  107. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/daemon/__init__.py +0 -0
  108. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/daemon/cli.py +0 -0
  109. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/__init__.py +0 -0
  110. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/_branch_name.py +0 -0
  111. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/_config.py +0 -0
  112. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/_output.py +0 -0
  113. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/cleanup.py +0 -0
  114. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/cli.py +0 -0
  115. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/__init__.py +0 -0
  116. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/aider.py +0 -0
  117. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/base.py +0 -0
  118. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/claude.py +0 -0
  119. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/codex.py +0 -0
  120. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  121. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/copilot.py +0 -0
  122. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  123. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/gemini.py +0 -0
  124. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/opencode.py +0 -0
  125. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/coding_agents/registry.py +0 -0
  126. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/__init__.py +0 -0
  127. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/base.py +0 -0
  128. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/cursor.py +0 -0
  129. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/emacs.py +0 -0
  130. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/jetbrains.py +0 -0
  131. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/nano.py +0 -0
  132. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/neovim.py +0 -0
  133. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/registry.py +0 -0
  134. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/sublime.py +0 -0
  135. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/vim.py +0 -0
  136. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/vscode.py +0 -0
  137. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/editors/zed.py +0 -0
  138. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/hooks.py +0 -0
  139. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/launch.py +0 -0
  140. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/project.py +0 -0
  141. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/registry.py +0 -0
  142. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/skill/SKILL.md +0 -0
  143. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/skill/examples.md +0 -0
  144. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/__init__.py +0 -0
  145. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  146. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/base.py +0 -0
  147. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/cmux.py +0 -0
  148. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/gnome.py +0 -0
  149. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/iterm2.py +0 -0
  150. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/kitty.py +0 -0
  151. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/registry.py +0 -0
  152. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/tmux.py +0 -0
  153. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/warp.py +0 -0
  154. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/terminals/zellij.py +0 -0
  155. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/dev/worktree.py +0 -0
  156. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/docs_gen.py +0 -0
  157. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/example-config.toml +0 -0
  158. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/install/__init__.py +0 -0
  159. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/install/common.py +0 -0
  160. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/install/extras.py +0 -0
  161. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/install/hotkeys.py +0 -0
  162. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/install/launchd.py +0 -0
  163. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/install/service_config.py +0 -0
  164. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/install/services.py +0 -0
  165. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/install/systemd.py +0 -0
  166. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/__init__.py +0 -0
  167. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_files.py +0 -0
  168. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_filters.py +0 -0
  169. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_git.py +0 -0
  170. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_indexer.py +0 -0
  171. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_ingest.py +0 -0
  172. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_persistence.py +0 -0
  173. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_prompt.py +0 -0
  174. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_retrieval.py +0 -0
  175. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_store.py +0 -0
  176. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_streaming.py +0 -0
  177. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/_tasks.py +0 -0
  178. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/api.py +0 -0
  179. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/client.py +0 -0
  180. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/engine.py +0 -0
  181. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/entities.py +0 -0
  182. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/memory/models.py +0 -0
  183. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/opts.py +0 -0
  184. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/py.typed +0 -0
  185. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/__init__.py +0 -0
  186. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/_indexer.py +0 -0
  187. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/_indexing.py +0 -0
  188. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/_prompt.py +0 -0
  189. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/_retriever.py +0 -0
  190. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/_store.py +0 -0
  191. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/_utils.py +0 -0
  192. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/api.py +0 -0
  193. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/client.py +0 -0
  194. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/engine.py +0 -0
  195. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/rag/models.py +0 -0
  196. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  197. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/__init__.py +0 -0
  198. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  199. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  200. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  201. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  202. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  203. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  204. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  205. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  206. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  207. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  208. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  209. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  210. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  211. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  212. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/run-openwakeword.sh +0 -0
  213. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  214. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/setup-linux.sh +0 -0
  215. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  216. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/setup-macos.sh +0 -0
  217. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/setup-windows.ps1 +0 -0
  218. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  219. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/scripts/start-all-services.sh +0 -0
  220. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/__init__.py +0 -0
  221. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/common.py +0 -0
  222. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/model_manager.py +0 -0
  223. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/model_registry.py +0 -0
  224. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/proxy/__init__.py +0 -0
  225. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/proxy/api.py +0 -0
  226. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/proxy/diarization.py +0 -0
  227. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/streaming.py +0 -0
  228. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/tts/__init__.py +0 -0
  229. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/tts/api.py +0 -0
  230. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/tts/backends/__init__.py +0 -0
  231. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/tts/backends/base.py +0 -0
  232. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/tts/backends/kokoro.py +0 -0
  233. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/tts/backends/piper.py +0 -0
  234. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/tts/model_manager.py +0 -0
  235. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/tts/model_registry.py +0 -0
  236. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/tts/wyoming_handler.py +0 -0
  237. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/__init__.py +0 -0
  238. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/api.py +0 -0
  239. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/backends/__init__.py +0 -0
  240. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  241. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/backends/mlx.py +0 -0
  242. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/backends/nemo.py +0 -0
  243. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/languages.py +0 -0
  244. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/model_registry.py +0 -0
  245. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  246. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/services/__init__.py +0 -0
  247. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/services/_wyoming_utils.py +0 -0
  248. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/services/asr.py +0 -0
  249. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/services/llm.py +0 -0
  250. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/services/tts.py +0 -0
  251. {agent_cli-0.104.0 → agent_cli-0.105.0}/agent_cli/services/wake_word.py +0 -0
  252. {agent_cli-0.104.0 → agent_cli-0.105.0}/docker/diarization.Dockerfile +0 -0
  253. {agent_cli-0.104.0 → agent_cli-0.105.0}/docker/memory-proxy.Dockerfile +0 -0
  254. {agent_cli-0.104.0 → agent_cli-0.105.0}/docker/rag-proxy.Dockerfile +0 -0
  255. {agent_cli-0.104.0 → agent_cli-0.105.0}/docker/transcribe-proxy.Dockerfile +0 -0
  256. {agent_cli-0.104.0 → agent_cli-0.105.0}/docker/tts.Dockerfile +0 -0
  257. {agent_cli-0.104.0 → agent_cli-0.105.0}/docker/whisper.Dockerfile +0 -0
  258. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/CNAME +0 -0
  259. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/architecture/index.md +0 -0
  260. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/architecture/memory.md +0 -0
  261. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/architecture/rag.md +0 -0
  262. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/assistant.md +0 -0
  263. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/autocorrect.md +0 -0
  264. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/chat.md +0 -0
  265. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/config.md +0 -0
  266. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/daemon.md +0 -0
  267. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/dev.md +0 -0
  268. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/diarize-live-session.md +0 -0
  269. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/index.md +0 -0
  270. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/install-extras.md +0 -0
  271. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/install-hotkeys.md +0 -0
  272. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/install-services.md +0 -0
  273. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/memory.md +0 -0
  274. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/rag-proxy.md +0 -0
  275. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/server/index.md +0 -0
  276. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/server/tts.md +0 -0
  277. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/speak.md +0 -0
  278. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/speakers.md +0 -0
  279. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/start-services.md +0 -0
  280. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/transcribe-live.md +0 -0
  281. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/transcribe.md +0 -0
  282. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/commands/voice-edit.md +0 -0
  283. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/configuration.md +0 -0
  284. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/getting-started.md +0 -0
  285. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/iOS_Shortcut_Guide.md +0 -0
  286. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/index.md +0 -0
  287. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/installation/index.md +0 -0
  288. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/installation/linux.md +0 -0
  289. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/installation/macos-app.md +0 -0
  290. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/installation/macos.md +0 -0
  291. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/installation/nixos.md +0 -0
  292. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/installation/windows.md +0 -0
  293. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/logo-avatar.svg +0 -0
  294. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/logo-clean.svg +0 -0
  295. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  296. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/run_markdown_code_runner.py +0 -0
  297. {agent_cli-0.104.0 → agent_cli-0.105.0}/docs/system-integration.md +0 -0
  298. {agent_cli-0.104.0 → agent_cli-0.105.0}/example.agent-cli-config.toml +0 -0
  299. {agent_cli-0.104.0 → agent_cli-0.105.0}/justfile +0 -0
  300. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Package.resolved +0 -0
  301. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Package.swift +0 -0
  302. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/README.md +0 -0
  303. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
  304. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Resources/Info.plist +0 -0
  305. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
  306. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
  307. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
  308. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +0 -0
  309. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +0 -0
  310. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
  311. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
  312. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
  313. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
  314. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
  315. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
  316. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
  317. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/LiveTranscriptionPreview.swift +0 -0
  318. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
  319. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatus.swift +0 -0
  320. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatusRow.swift +0 -0
  321. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/MenuActivityTracker.swift +0 -0
  322. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
  323. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
  324. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
  325. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
  326. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
  327. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +0 -0
  328. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +0 -0
  329. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +0 -0
  330. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
  331. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
  332. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
  333. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +0 -0
  334. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Tests/AgentCLITests/ConfigurableHotkeyControllerTests.swift +0 -0
  335. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Tests/AgentCLITests/LivePreviewSwiftTestingTests.swift +0 -0
  336. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Tests/AgentCLITests/LiveTranscriptionPreviewTests.swift +0 -0
  337. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
  338. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
  339. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +0 -0
  340. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
  341. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/AgentCLI/Tests/AgentCLITests/VoiceLevelMeterTests.swift +0 -0
  342. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/build-macos-app.sh +0 -0
  343. {agent_cli-0.104.0 → agent_cli-0.105.0}/macos/test-macos-app-e2e.sh +0 -0
  344. {agent_cli-0.104.0 → agent_cli-0.105.0}/pyproject.toml +0 -0
  345. {agent_cli-0.104.0 → agent_cli-0.105.0}/reddit.md +0 -0
  346. {agent_cli-0.104.0 → agent_cli-0.105.0}/shell.nix +0 -0
  347. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/__init__.py +0 -0
  348. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/__init__.py +0 -0
  349. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_fix_my_text.py +0 -0
  350. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_interactive.py +0 -0
  351. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_interactive_extra.py +0 -0
  352. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_memory_add.py +0 -0
  353. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_speak.py +0 -0
  354. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_speak_e2e.py +0 -0
  355. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_speakers.py +0 -0
  356. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_transcribe.py +0 -0
  357. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_transcribe_agent.py +0 -0
  358. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_transcribe_e2e.py +0 -0
  359. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_transcribe_live.py +0 -0
  360. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_transcribe_recovery.py +0 -0
  361. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_tts_common.py +0 -0
  362. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_tts_common_extra.py +0 -0
  363. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_voice_agent_common.py +0 -0
  364. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_voice_edit.py +0 -0
  365. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_voice_edit_e2e.py +0 -0
  366. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/agents/test_wake_word_assistant.py +0 -0
  367. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/conftest.py +0 -0
  368. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/core/__init__.py +0 -0
  369. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/core/test_audio.py +0 -0
  370. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/core/test_audio_format.py +0 -0
  371. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/core/test_audio_levels.py +0 -0
  372. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/core/test_chroma.py +0 -0
  373. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/core/test_sse.py +0 -0
  374. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/core/test_vad.py +0 -0
  375. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/core/test_watch.py +0 -0
  376. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/__init__.py +0 -0
  377. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_cleanup.py +0 -0
  378. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_cli.py +0 -0
  379. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_coding_agents.py +0 -0
  380. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_editors.py +0 -0
  381. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_hooks.py +0 -0
  382. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_launch.py +0 -0
  383. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_project.py +0 -0
  384. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_terminals.py +0 -0
  385. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_verification.py +0 -0
  386. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/dev/test_worktree.py +0 -0
  387. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/install/__init__.py +0 -0
  388. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/install/test_extras.py +0 -0
  389. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/install/test_launchd.py +0 -0
  390. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/__init__.py +0 -0
  391. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_api_health.py +0 -0
  392. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_api_integration_liveish.py +0 -0
  393. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_client.py +0 -0
  394. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_engine.py +0 -0
  395. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_files.py +0 -0
  396. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_filters.py +0 -0
  397. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_git_integration.py +0 -0
  398. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_indexer.py +0 -0
  399. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_memory_integration.py +0 -0
  400. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_proxy_passthrough.py +0 -0
  401. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_store.py +0 -0
  402. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/memory/test_utils.py +0 -0
  403. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/mocks/__init__.py +0 -0
  404. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/mocks/audio.py +0 -0
  405. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/mocks/llm.py +0 -0
  406. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/mocks/wyoming.py +0 -0
  407. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/__init__.py +0 -0
  408. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_api.py +0 -0
  409. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_engine.py +0 -0
  410. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_history.py +0 -0
  411. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_indexer.py +0 -0
  412. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_indexing.py +0 -0
  413. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_rag_client.py +0 -0
  414. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_rag_integration_liveish.py +0 -0
  415. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  416. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_retriever.py +0 -0
  417. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_store.py +0 -0
  418. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/rag/test_utils.py +0 -0
  419. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_alignment.py +0 -0
  420. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_api.py +0 -0
  421. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_asr.py +0 -0
  422. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_asr_recovery.py +0 -0
  423. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_audio_e2e.py +0 -0
  424. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_cli.py +0 -0
  425. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_config.py +0 -0
  426. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_config_cmd.py +0 -0
  427. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_daemon.py +0 -0
  428. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_diarization.py +0 -0
  429. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_diarize_live_session.py +0 -0
  430. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_docs_gen.py +0 -0
  431. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_env_vars.py +0 -0
  432. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_faster_whisper_backend.py +0 -0
  433. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_json_output.py +0 -0
  434. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_llm.py +0 -0
  435. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_llm_gemini.py +0 -0
  436. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_macos_app.py +0 -0
  437. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_memory_tools.py +0 -0
  438. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_mlx_backend.py +0 -0
  439. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_nemo_backend.py +0 -0
  440. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_normalize_appcast.py +0 -0
  441. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_process_manager.py +0 -0
  442. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_proxy_diarization.py +0 -0
  443. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_requires_extras.py +0 -0
  444. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_server_streaming.py +0 -0
  445. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_server_tts.py +0 -0
  446. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_server_tts_wyoming.py +0 -0
  447. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_server_whisper_wyoming.py +0 -0
  448. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_services.py +0 -0
  449. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_speaker_identity.py +0 -0
  450. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_tools.py +0 -0
  451. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_tts.py +0 -0
  452. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_utils.py +0 -0
  453. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_wake_word.py +0 -0
  454. {agent_cli-0.104.0 → agent_cli-0.105.0}/tests/test_wyoming_utils.py +0 -0
  455. {agent_cli-0.104.0 → agent_cli-0.105.0}/uv.lock +0 -0
  456. {agent_cli-0.104.0 → agent_cli-0.105.0}/zensical.toml +0 -0
@@ -90,7 +90,7 @@ jobs:
90
90
  cache-from: type=gha
91
91
  cache-to: type=gha,mode=max
92
92
 
93
- # Single-target images (transcribe-proxy)
93
+ # Single-target images (proxies and diarization)
94
94
  build-single-target:
95
95
  runs-on: ubuntu-latest
96
96
  permissions:
@@ -106,8 +106,16 @@ jobs:
106
106
  dockerfile: docker/rag-proxy.Dockerfile
107
107
  - image: memory-proxy
108
108
  dockerfile: docker/memory-proxy.Dockerfile
109
+ - image: diarization
110
+ dockerfile: docker/diarization.Dockerfile
109
111
 
110
112
  steps:
113
+ - name: Free disk space
114
+ run: |
115
+ sudo rm -rf /usr/share/dotnet
116
+ sudo rm -rf /usr/local/lib/android
117
+ df -h
118
+
111
119
  - name: Checkout repository
112
120
  uses: actions/checkout@v7.0.1
113
121
  with:
@@ -153,3 +161,81 @@ jobs:
153
161
  labels: ${{ steps.meta.outputs.labels }}
154
162
  cache-from: type=gha
155
163
  cache-to: type=gha,mode=max
164
+
165
+ smoke-diarization:
166
+ needs: build-single-target
167
+ runs-on: ubuntu-latest
168
+ timeout-minutes: 15
169
+ permissions:
170
+ contents: read
171
+ packages: read
172
+
173
+ steps:
174
+ - name: Free disk space
175
+ run: |
176
+ sudo rm -rf /usr/share/dotnet
177
+ sudo rm -rf /usr/local/lib/android
178
+ df -h
179
+
180
+ - name: Log in to Container Registry
181
+ uses: docker/login-action@v4.5.1
182
+ with:
183
+ registry: ${{ env.REGISTRY }}
184
+ username: ${{ github.actor }}
185
+ password: ${{ secrets.GITHUB_TOKEN }}
186
+
187
+ - name: Resolve image reference
188
+ id: image
189
+ run: |
190
+ tag="sha-${GITHUB_SHA::7}"
191
+ echo "ref=${REGISTRY}/${GITHUB_REPOSITORY}-diarization:${tag}" >> "$GITHUB_OUTPUT"
192
+
193
+ - name: Pull published image
194
+ run: docker pull "${{ steps.image.outputs.ref }}"
195
+
196
+ - name: Verify package version
197
+ env:
198
+ IMAGE_REF: ${{ steps.image.outputs.ref }}
199
+ RELEASE_TAG: ${{ github.event.release.tag_name }}
200
+ run: |
201
+ actual_version=$(
202
+ docker run --rm --entrypoint /app/.venv/bin/python "$IMAGE_REF" \
203
+ -c 'import importlib.metadata; print(importlib.metadata.version("agent-cli"))'
204
+ )
205
+ if [[ "$GITHUB_EVENT_NAME" == "release" ]]; then
206
+ expected_version="${RELEASE_TAG#v}"
207
+ if [[ "${actual_version%%+*}" != "$expected_version" ]]; then
208
+ echo "Expected agent-cli $expected_version, got $actual_version" >&2
209
+ exit 1
210
+ fi
211
+ fi
212
+ echo "Verified agent-cli $actual_version"
213
+
214
+ - name: Verify health and API routes
215
+ env:
216
+ IMAGE_REF: ${{ steps.image.outputs.ref }}
217
+ run: |
218
+ container_id=$(docker run --detach --publish 61337:61337 "$IMAGE_REF")
219
+ trap 'docker rm --force "$container_id" >/dev/null 2>&1 || true' EXIT
220
+
221
+ ready=false
222
+ for _ in {1..30}; do
223
+ if curl --fail --silent --connect-timeout 1 --max-time 2 \
224
+ http://localhost:61337/health | jq --exit-status '.status == "healthy"' >/dev/null; then
225
+ ready=true
226
+ break
227
+ fi
228
+ sleep 2
229
+ done
230
+ if [[ "$ready" != "true" ]]; then
231
+ docker logs "$container_id"
232
+ exit 1
233
+ fi
234
+
235
+ if ! curl --fail --silent --show-error --connect-timeout 1 --max-time 2 \
236
+ http://localhost:61337/openapi.json | jq --exit-status \
237
+ '.paths["/health"].get and .paths["/transcribe"].post and .paths["/diarize"].post' \
238
+ >/dev/null; then
239
+ docker logs "$container_id"
240
+ exit 1
241
+ fi
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: agent-cli
3
- Version: 0.104.0
3
+ Version: 0.105.0
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>
@@ -403,6 +403,17 @@ def whisper_cmd( # noqa: C901, PLR0912, PLR0915
403
403
  ),
404
404
  ),
405
405
  ] = False,
406
+ max_new_tokens: Annotated[
407
+ int,
408
+ typer.Option(
409
+ "--max-new-tokens",
410
+ min=1,
411
+ help=(
412
+ "Maximum output tokens for autoregressive transformers ASR models. "
413
+ "Increase for unusually long audio"
414
+ ),
415
+ ),
416
+ ] = 4096,
406
417
  ttl: Annotated[
407
418
  int,
408
419
  typer.Option(
@@ -602,6 +613,7 @@ def whisper_cmd( # noqa: C901, PLR0912, PLR0915
602
613
  compute_type=compute_type,
603
614
  default_language=default_language,
604
615
  trust_remote_code=trust_remote_code,
616
+ max_new_tokens=max_new_tokens,
605
617
  ttl_seconds=ttl,
606
618
  cache_dir=cache_dir,
607
619
  backend_type=resolved_backend, # type: ignore[arg-type]
@@ -32,6 +32,7 @@ class BackendConfig:
32
32
  cache_dir: Path | None = None
33
33
  default_language: str | None = None
34
34
  trust_remote_code: bool = False
35
+ max_new_tokens: int = 4096
35
36
 
36
37
 
37
38
  class InvalidAudioError(ValueError):
@@ -47,6 +47,10 @@ _MODEL_MAP: dict[str, str] = {
47
47
  _REMOTE_CODE_MODEL_PREFIXES = ("CohereLabs/cohere-transcribe",)
48
48
 
49
49
 
50
+ class TranscriptionTruncatedError(RuntimeError):
51
+ """Raised when an autoregressive ASR model exhausts its output budget."""
52
+
53
+
50
54
  def _resolve_model_name(model_name: str) -> str:
51
55
  """Resolve a model name to a HuggingFace repo."""
52
56
  if "/" in model_name:
@@ -220,6 +224,22 @@ def _move_inputs_to_device(inputs: Any) -> Any:
220
224
  return {k: v.to(_state.device) if hasattr(v, "to") else v for k, v in inputs.items()}
221
225
 
222
226
 
227
+ def _qwen_generation_was_truncated(generated_ids: Any, max_new_tokens: int) -> bool:
228
+ """Return whether Qwen exhausted its token budget without emitting EOS."""
229
+ if generated_ids.shape[1] < max_new_tokens:
230
+ return False
231
+
232
+ generation_config = getattr(_state.model, "generation_config", None)
233
+ eos_token_ids = getattr(generation_config, "eos_token_id", None)
234
+ if eos_token_ids is None:
235
+ return True
236
+ if isinstance(eos_token_ids, int):
237
+ eos_token_ids = [eos_token_ids]
238
+
239
+ last_token_id = generated_ids[:, -1:].tolist()[0][0]
240
+ return last_token_id not in eos_token_ids
241
+
242
+
223
243
  def _transcribe_cohere_asr(
224
244
  *,
225
245
  audio_array: Any,
@@ -276,6 +296,7 @@ def _transcribe_qwen3_asr(
276
296
  task: str,
277
297
  initial_prompt: str | None,
278
298
  duration: float,
299
+ max_new_tokens: int,
279
300
  ) -> dict[str, Any]:
280
301
  """Transcribe with Qwen3-ASR's native transformers interface."""
281
302
  if task != "transcribe":
@@ -294,11 +315,19 @@ def _transcribe_qwen3_asr(
294
315
  with torch.inference_mode():
295
316
  output_ids = _state.model.generate(
296
317
  **inputs,
297
- max_new_tokens=256,
318
+ max_new_tokens=max_new_tokens,
298
319
  do_sample=False,
299
320
  )
300
321
 
301
322
  generated_ids = output_ids[:, inputs["input_ids"].shape[1] :]
323
+ if _qwen_generation_was_truncated(generated_ids, max_new_tokens):
324
+ msg = (
325
+ "Qwen3-ASR transcription reached "
326
+ f"max_new_tokens={max_new_tokens} before completion. "
327
+ "Restart the server with a higher --max-new-tokens value "
328
+ "or split the audio into shorter chunks."
329
+ )
330
+ raise TranscriptionTruncatedError(msg)
302
331
  parsed = _state.processor.decode(generated_ids, return_format="parsed")[0]
303
332
  language = parsed["language"] or effective_language or "unknown"
304
333
 
@@ -416,6 +445,7 @@ def _transcribe_in_subprocess(kwargs: dict[str, Any]) -> dict[str, Any]:
416
445
  task=task,
417
446
  initial_prompt=kwargs.get("initial_prompt"),
418
447
  duration=_read_wav_duration(wav_path),
448
+ max_new_tokens=kwargs.get("max_new_tokens", 4096),
419
449
  )
420
450
 
421
451
  audio_array, sample_rate, duration = _read_wav_audio(wav_path)
@@ -548,6 +578,7 @@ class TransformersWhisperBackend:
548
578
  "default_language": self._config.default_language,
549
579
  "task": task,
550
580
  "initial_prompt": initial_prompt,
581
+ "max_new_tokens": self._config.max_new_tokens,
551
582
  }
552
583
 
553
584
  try:
@@ -30,6 +30,7 @@ class WhisperModelConfig(ModelConfig):
30
30
  backend_type: BackendType = "auto"
31
31
  default_language: str | None = None
32
32
  trust_remote_code: bool = False
33
+ max_new_tokens: int = 4096
33
34
 
34
35
 
35
36
  class WhisperModelManager:
@@ -50,6 +51,7 @@ class WhisperModelManager:
50
51
  cache_dir=config.cache_dir,
51
52
  default_language=config.default_language,
52
53
  trust_remote_code=config.trust_remote_code,
54
+ max_new_tokens=config.max_new_tokens,
53
55
  ),
54
56
  backend_type=config.backend_type,
55
57
  )
@@ -240,10 +240,10 @@ services:
240
240
  restart: unless-stopped
241
241
 
242
242
  # Optional transcription proxy with local diarization. Start explicitly with:
243
- # docker compose -f docker/docker-compose.yml up --build diarization
243
+ # docker compose -f docker/docker-compose.yml up diarization
244
244
  # Shares port 61337 with transcribe-proxy; run one of them at a time.
245
245
  diarization:
246
- image: agent-cli-diarization
246
+ image: ghcr.io/basnijholt/agent-cli-diarization:latest
247
247
  build:
248
248
  context: ..
249
249
  dockerfile: docker/diarization.Dockerfile
@@ -211,15 +211,13 @@ docker compose -f docker/docker-compose.yml --profile cpu up transcribe-proxy
211
211
 
212
212
  ### Docker with diarization
213
213
 
214
- Build the image that includes pyannote, PyTorch, and FFmpeg:
214
+ Run the published image, which includes pyannote, PyTorch, and FFmpeg:
215
215
 
216
216
  ```bash
217
- docker build -f docker/diarization.Dockerfile -t agent-cli-diarization .
218
-
219
217
  docker run --rm -p 61337:61337 \
220
218
  -e HF_TOKEN \
221
219
  -v agent-cli-diarization-cache:/home/transcribe/.cache \
222
- agent-cli-diarization
220
+ ghcr.io/basnijholt/agent-cli-diarization:latest
223
221
  ```
224
222
 
225
223
  This runs `/diarize` on CPU. For NVIDIA GPU inference, add `--gpus all -e DIARIZATION_DEVICE=cuda` to `docker run`. For `/transcribe`, also provide your ASR environment variables, for example `-e ASR_PROVIDER=openai -e ASR_OPENAI_BASE_URL=http://your-whisper-host:10301/v1 -e OPENAI_API_KEY=dummy`.
@@ -228,11 +226,17 @@ The optional Compose service can run beside the existing Whisper server:
228
226
 
229
227
  ```bash
230
228
  # HF_TOKEN must be exported in the shell or set in docker/.env.
231
- docker compose -f docker/docker-compose.yml --profile cpu up --build whisper-cpu diarization
229
+ docker compose -f docker/docker-compose.yml --profile cpu up whisper-cpu diarization
232
230
  ```
233
231
 
234
232
  Use `diarization` in place of `transcribe-proxy`, since both default to port 61337. Set `DIARIZATION_PORT` to use a different host port. The model cache persists in `agent-cli-diarization-cache`. GPU instructions are included beside the service in the Compose file.
235
233
 
234
+ To build from source instead, add `--build` to the Compose command or run:
235
+
236
+ ```bash
237
+ docker build -f docker/diarization.Dockerfile -t agent-cli-diarization .
238
+ ```
239
+
236
240
  ### Environment Variables
237
241
 
238
242
  Configure the proxy using environment variables (priority: env var > config file > default):
@@ -130,6 +130,7 @@ agent-cli server whisper \
130
130
  | `--cache-dir` | - | Custom directory for downloaded models (default: HuggingFace cache) |
131
131
  | `--default-language` | - | Fallback language code for requests that omit `language`. Required for models that do not support language auto-detection (for example Cohere Transcribe). |
132
132
  | `--trust-remote-code` | `false` | Allow Hugging Face model repositories to execute custom Python code. Known supported remote-code ASR models are trusted automatically. |
133
+ | `--max-new-tokens` | `4096` | Maximum output tokens for autoregressive transformers ASR models. Increase for unusually long audio |
133
134
  | `--ttl` | `300` | Seconds of inactivity before unloading model from memory. Set to 0 to keep loaded indefinitely |
134
135
  | `--preload` | `false` | Load model(s) immediately at startup instead of on first request. Useful for reducing first-request latency |
135
136
  | `--host` | `0.0.0.0` | Network interface to bind. Use `0.0.0.0` for all interfaces |
@@ -311,6 +312,8 @@ agent-cli server whisper \
311
312
 
312
313
  Qwen3-ASR supports transcription, automatic language detection, and context or hotwords through the OpenAI-compatible `prompt` field. Translation and timestamped subtitle output are not currently supported.
313
314
 
315
+ The default output budget is 4096 tokens, which accommodates long recordings. For unusually long or dense speech, increase it with `--max-new-tokens`. If Qwen3-ASR exhausts the configured budget, the request fails with a clear error instead of returning a silently truncated transcript.
316
+
314
317
  To install it as the standard `whisper` background daemon:
315
318
 
316
319
  ```bash
@@ -59,7 +59,7 @@ The Docker setup provides:
59
59
  | ----------------------- | --------------------------------- | ----------- | ------------------------------ |
60
60
  | **whisper** | agent-cli-whisper (custom) | 10300/10301 | Speech-to-text (Faster Whisper)|
61
61
  | **tts** | agent-cli-tts (custom) | 10200/10201 | Text-to-speech (Kokoro/Piper) |
62
- | **diarization** | agent-cli-diarization (local build) | 61337 | Speaker timing and labeled transcripts (optional) |
62
+ | **diarization** | agent-cli-diarization | 61337 | Speaker timing and labeled transcripts (optional) |
63
63
  | **transcribe-proxy** | agent-cli-transcribe-proxy | 61337 | ASR proxy for iOS/external apps|
64
64
  | **rag-proxy** | agent-cli-rag-proxy | 8000 | Document-aware chat (RAG) |
65
65
  | **memory-proxy** | agent-cli-memory-proxy | 8100 | Long-term memory chat |
@@ -4,6 +4,25 @@
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.104.0</title>
9
+ <pubDate>Mon, 07 Sep 2026 21:38:19 +0000</pubDate>
10
+ <link>https://github.com/basnijholt/agent-cli</link>
11
+ <sparkle:version>203</sparkle:version>
12
+ <sparkle:shortVersionString>0.104.0</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 speaker diarization API and Docker image (#639) @basnijholt
18
+ * Fix Docker image publishing and runtime extras (#638) @basnijholt
19
+ * ⬆️ Update actions/deploy-pages action to v5.0.1 (#637) [@renovate[bot]](https://github.com/apps/renovate)
20
+ * ⬆️ Update docker/setup-buildx-action action to v4.3.0 (#635) [@renovate[bot]](https://github.com/apps/renovate)
21
+
22
+
23
+ ]]></description>
24
+ <enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.104.0/AgentCLI.zip" length="18454336" type="application/octet-stream" sparkle:edSignature="p7BVeR6YS/LBGO61o0xR8GE9beHf+4uaz0c28HrHX4oyWjVZSBgwI6jIjR2Mn23HNLS65CfECbp2NSJoIc+ABw=="/>
25
+ </item>
7
26
  <item>
8
27
  <title>0.103.0</title>
9
28
  <pubDate>Tue, 01 Sep 2026 19:34:50 +0000</pubDate>
@@ -189,21 +208,5 @@
189
208
  ]]></description>
190
209
  <enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.99.0/AgentCLI.zip" length="22924494" type="application/octet-stream" sparkle:edSignature="COI8nqDd0cBtOO9jw/QRmsucsxE0SPiSgNF/o+s/nv3FCjSXy0C+gZX/bIFtCYyz/DYkff+IaHaLzhw8Z5aEBQ=="/>
191
210
  </item>
192
- <item>
193
- <title>0.98.5</title>
194
- <pubDate>Fri, 05 Jun 2026 20:33:00 +0000</pubDate>
195
- <link>https://github.com/basnijholt/agent-cli</link>
196
- <sparkle:version>193</sparkle:version>
197
- <sparkle:shortVersionString>0.98.5</sparkle:shortVersionString>
198
- <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
199
- <sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
200
- <description sparkle:format="markdown"><![CDATA[## What’s Changed
201
-
202
- * Fix macOS F1 shortcut recorder crash (#584) @basnijholt
203
- * Retry Fn hotkeys after Accessibility approval (#583) @basnijholt
204
-
205
- ]]></description>
206
- <enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.98.5/AgentCLI.zip" length="22904207" type="application/octet-stream" sparkle:edSignature="ZUCHwTaFNGvFW3w/cq1Wf5OzB0e/1mjUQjCksmNaDJy9muTY1r5dRcDuIk15hp7iB4ELNAUUDqqa+PMi/tyiAA=="/>
207
- </item>
208
211
  </channel>
209
212
  </rss>
@@ -129,9 +129,47 @@ def test_server_whisper_command_in_cli() -> None:
129
129
  assert "--model" in clean_output
130
130
  assert "--ttl" in clean_output
131
131
  assert "--wyoming-port" in clean_output
132
+ assert "--max-new-tokens" in clean_output
132
133
  assert "nemo" in clean_output
133
134
 
134
135
 
136
+ @patch("uvicorn.run")
137
+ def test_server_whisper_propagates_max_new_tokens(mock_uvicorn_run: MagicMock) -> None:
138
+ """Whisper server should propagate the generation limit to model config."""
139
+ runner = CliRunner()
140
+ registry = MagicMock()
141
+ registry.default_model = "Qwen/Qwen3-ASR-1.7B-hf"
142
+
143
+ with (
144
+ patch("agent_cli.core.deps._check_and_install_extras", return_value=[]),
145
+ patch("agent_cli.server.cli._check_whisper_deps"),
146
+ patch("agent_cli.server.cli._check_transformers_audio_model_deps"),
147
+ patch(
148
+ "agent_cli.server.whisper.model_registry.create_whisper_registry",
149
+ return_value=registry,
150
+ ),
151
+ ):
152
+ result = runner.invoke(
153
+ cli_app,
154
+ [
155
+ "server",
156
+ "whisper",
157
+ "--model",
158
+ "Qwen/Qwen3-ASR-1.7B-hf",
159
+ "--backend",
160
+ "transformers",
161
+ "--no-wyoming",
162
+ "--max-new-tokens",
163
+ "2048",
164
+ ],
165
+ )
166
+
167
+ assert result.exit_code == 0
168
+ registered_config = registry.register.call_args.args[0]
169
+ assert registered_config.max_new_tokens == 2048
170
+ mock_uvicorn_run.assert_called_once()
171
+
172
+
135
173
  @patch("uvicorn.run")
136
174
  def test_server_whisper_accepts_asr_wyoming_port_alias(mock_uvicorn_run: MagicMock) -> None:
137
175
  """Whisper server should accept the client-style ASR Wyoming port alias."""
@@ -52,6 +52,7 @@ class TestModelConfig:
52
52
  assert config.backend_type == "auto"
53
53
  assert config.default_language is None
54
54
  assert config.trust_remote_code is False
55
+ assert config.max_new_tokens == 4096
55
56
 
56
57
  def test_custom_values(self) -> None:
57
58
  """Test custom configuration values."""
@@ -64,6 +65,7 @@ class TestModelConfig:
64
65
  cpu_threads=8,
65
66
  default_language="en",
66
67
  trust_remote_code=True,
68
+ max_new_tokens=2048,
67
69
  )
68
70
  assert config.model_name == "small"
69
71
  assert config.device == "cuda:0"
@@ -73,6 +75,7 @@ class TestModelConfig:
73
75
  assert config.cpu_threads == 8
74
76
  assert config.default_language == "en"
75
77
  assert config.trust_remote_code is True
78
+ assert config.max_new_tokens == 2048
76
79
 
77
80
  def test_zero_ttl_disables_auto_unload(self) -> None:
78
81
  """TTL 0 should be accepted as keep-loaded mode."""
@@ -245,7 +245,10 @@ def test_transcribe_qwen3_asr_returns_parsed_transcription(
245
245
  return [{"language": "English", "transcription": "Agent CLI"}]
246
246
 
247
247
  class Model:
248
- def generate(self, **_inputs: Tensor) -> Tensor:
248
+ generation_config = SimpleNamespace(eos_token_id=[42, 99])
249
+
250
+ def generate(self, **inputs: Tensor | int | bool) -> Tensor:
251
+ assert inputs["max_new_tokens"] == 2
249
252
  return Tensor([[1, 2, 3, 41, 42]])
250
253
 
251
254
  monkeypatch.setitem(
@@ -271,6 +274,7 @@ def test_transcribe_qwen3_asr_returns_parsed_transcription(
271
274
  task="transcribe",
272
275
  initial_prompt="Vocabulary: Agent CLI",
273
276
  duration=1.5,
277
+ max_new_tokens=2,
274
278
  )
275
279
 
276
280
  assert result == {
@@ -283,6 +287,61 @@ def test_transcribe_qwen3_asr_returns_parsed_transcription(
283
287
  }
284
288
 
285
289
 
290
+ def test_transcribe_qwen3_asr_rejects_truncated_generation(
291
+ monkeypatch: pytest.MonkeyPatch,
292
+ ) -> None:
293
+ """Qwen3-ASR must not return partial text when generation exhausts its limit."""
294
+
295
+ class Tensor:
296
+ def __init__(self, values: list[list[int]]) -> None:
297
+ self.values = values
298
+ self.shape = (len(values), len(values[0]))
299
+
300
+ def to(self, *_args: object, **_kwargs: object) -> Tensor:
301
+ return self
302
+
303
+ def __getitem__(self, key: tuple[slice, slice]) -> Tensor:
304
+ rows, columns = key
305
+ return Tensor([row[columns] for row in self.values[rows]])
306
+
307
+ def tolist(self) -> list[list[int]]:
308
+ return self.values
309
+
310
+ class Processor:
311
+ def apply_transcription_request(self, **_kwargs: object) -> dict[str, Tensor]:
312
+ return {"input_ids": Tensor([[1, 2, 3]])}
313
+
314
+ def decode(self, *_args: object, **_kwargs: object) -> list[dict[str, str]]:
315
+ raise AssertionError
316
+
317
+ class Model:
318
+ def generate(self, **_kwargs: object) -> Tensor:
319
+ return Tensor([[1, 2, 3, 41, 42]])
320
+
321
+ monkeypatch.setitem(sys.modules, "torch", SimpleNamespace(inference_mode=nullcontext))
322
+ monkeypatch.setattr(
323
+ backend,
324
+ "_state",
325
+ backend._SubprocessState(
326
+ model=Model(),
327
+ processor=Processor(),
328
+ dtype="float32",
329
+ device="cpu",
330
+ is_qwen3_asr=True,
331
+ ),
332
+ )
333
+
334
+ with pytest.raises(backend.TranscriptionTruncatedError, match="max_new_tokens=2"):
335
+ backend._transcribe_qwen3_asr(
336
+ audio_array=object(),
337
+ effective_language=None,
338
+ task="transcribe",
339
+ initial_prompt=None,
340
+ duration=180.0,
341
+ max_new_tokens=2,
342
+ )
343
+
344
+
286
345
  def test_transcribe_qwen3_asr_rejects_translation(
287
346
  monkeypatch: pytest.MonkeyPatch,
288
347
  ) -> None:
@@ -310,6 +369,7 @@ def test_transcribe_qwen3_asr_rejects_translation(
310
369
  task="translate",
311
370
  initial_prompt=None,
312
371
  duration=1.0,
372
+ max_new_tokens=4096,
313
373
  )
314
374
 
315
375
 
@@ -353,7 +413,11 @@ def test_transcribe_dispatches_qwen3_asr_to_native_adapter(
353
413
  )
354
414
 
355
415
  def transcribe_qwen3_asr(**kwargs: object) -> dict[str, object]:
356
- if kwargs["audio_array"] is not qwen_audio or kwargs["duration"] != 0.5:
416
+ if (
417
+ kwargs["audio_array"] is not qwen_audio
418
+ or kwargs["duration"] != 0.5
419
+ or kwargs["max_new_tokens"] != 2048
420
+ ):
357
421
  return {**expected, "text": "wrong Qwen input"}
358
422
  return expected
359
423
 
@@ -364,6 +428,7 @@ def test_transcribe_dispatches_qwen3_asr_to_native_adapter(
364
428
  "wav_path": str(wav_path),
365
429
  "task": "transcribe",
366
430
  "initial_prompt": "Agent CLI",
431
+ "max_new_tokens": 2048,
367
432
  },
368
433
  )
369
434
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes