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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (453) hide show
  1. {agent_cli-0.102.0 → agent_cli-0.102.2}/.github/workflows/docker.yml +4 -4
  2. {agent_cli-0.102.0 → agent_cli-0.102.2}/.github/workflows/docs.yml +1 -1
  3. {agent_cli-0.102.0 → agent_cli-0.102.2}/.github/workflows/markdown-code-runner.yml +1 -1
  4. {agent_cli-0.102.0 → agent_cli-0.102.2}/.github/workflows/pytest.yml +1 -1
  5. {agent_cli-0.102.0 → agent_cli-0.102.2}/.github/workflows/release-drafter.yml +1 -1
  6. {agent_cli-0.102.0 → agent_cli-0.102.2}/.github/workflows/release.yml +2 -16
  7. {agent_cli-0.102.0 → agent_cli-0.102.2}/.pre-commit-config.yaml +6 -3
  8. {agent_cli-0.102.0 → agent_cli-0.102.2}/PKG-INFO +2 -1
  9. agent_cli-0.102.2/agent_cli/__init__.py +16 -0
  10. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_requirements/diarization.txt +8 -8
  11. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_requirements/mlx-whisper.txt +3 -1
  12. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_requirements/nemo-whisper.txt +8 -8
  13. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/cli.py +2 -1
  14. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/whisper/backends/mlx.py +14 -1
  15. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/README.md +5 -2
  16. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +36 -8
  17. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +82 -0
  18. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/appcast.xml +60 -32
  19. {agent_cli-0.102.0 → agent_cli-0.102.2}/pyproject.toml +4 -0
  20. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/conftest.py +24 -4
  21. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_macos_app.py +5 -6
  22. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_mlx_backend.py +67 -1
  23. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_utils.py +42 -0
  24. {agent_cli-0.102.0 → agent_cli-0.102.2}/uv.lock +2 -0
  25. agent_cli-0.102.0/agent_cli/__init__.py +0 -5
  26. {agent_cli-0.102.0 → agent_cli-0.102.2}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  27. {agent_cli-0.102.0 → agent_cli-0.102.2}/.claude/skills/agent-cli-dev/examples.md +0 -0
  28. {agent_cli-0.102.0 → agent_cli-0.102.2}/.claude-plugin/README.md +0 -0
  29. {agent_cli-0.102.0 → agent_cli-0.102.2}/.claude-plugin/marketplace.json +0 -0
  30. {agent_cli-0.102.0 → agent_cli-0.102.2}/.claude-plugin/plugin.json +0 -0
  31. {agent_cli-0.102.0 → agent_cli-0.102.2}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  32. {agent_cli-0.102.0 → agent_cli-0.102.2}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  33. {agent_cli-0.102.0 → agent_cli-0.102.2}/.cursorrules +0 -0
  34. {agent_cli-0.102.0 → agent_cli-0.102.2}/.dockerignore +0 -0
  35. {agent_cli-0.102.0 → agent_cli-0.102.2}/.env.example +0 -0
  36. {agent_cli-0.102.0 → agent_cli-0.102.2}/.github/logo.svg +0 -0
  37. {agent_cli-0.102.0 → agent_cli-0.102.2}/.github/release-drafter.yml +0 -0
  38. {agent_cli-0.102.0 → agent_cli-0.102.2}/.github/renovate.json +0 -0
  39. {agent_cli-0.102.0 → agent_cli-0.102.2}/.github/scripts/check_extras_sync.py +0 -0
  40. {agent_cli-0.102.0 → agent_cli-0.102.2}/.github/scripts/check_plugin_skill_sync.py +0 -0
  41. {agent_cli-0.102.0 → agent_cli-0.102.2}/.github/scripts/normalize_appcast.py +0 -0
  42. {agent_cli-0.102.0 → agent_cli-0.102.2}/.github/scripts/sync_extras.py +0 -0
  43. {agent_cli-0.102.0 → agent_cli-0.102.2}/.github/scripts/sync_requirements.py +0 -0
  44. {agent_cli-0.102.0 → agent_cli-0.102.2}/.github/workflows/automerge.yml +0 -0
  45. {agent_cli-0.102.0 → agent_cli-0.102.2}/.github/workflows/toc.yaml +0 -0
  46. {agent_cli-0.102.0 → agent_cli-0.102.2}/.gitignore +0 -0
  47. {agent_cli-0.102.0 → agent_cli-0.102.2}/.jscpd.json +0 -0
  48. {agent_cli-0.102.0 → agent_cli-0.102.2}/.prompts/docs-review.md +0 -0
  49. {agent_cli-0.102.0 → agent_cli-0.102.2}/.prompts/pr-review.md +0 -0
  50. {agent_cli-0.102.0 → agent_cli-0.102.2}/CLAUDE.md +0 -0
  51. {agent_cli-0.102.0 → agent_cli-0.102.2}/LICENSE +0 -0
  52. {agent_cli-0.102.0 → agent_cli-0.102.2}/LLAMA_SERVER_USAGE.md +0 -0
  53. {agent_cli-0.102.0 → agent_cli-0.102.2}/README.md +0 -0
  54. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/__main__.py +0 -0
  55. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_extras.json +0 -0
  56. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_overrides/nemo-whisper.txt +0 -0
  57. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_requirements/.gitkeep +0 -0
  58. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_requirements/audio.txt +0 -0
  59. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_requirements/faster-whisper.txt +0 -0
  60. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_requirements/kokoro.txt +0 -0
  61. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_requirements/llm.txt +0 -0
  62. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_requirements/memory.txt +0 -0
  63. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_requirements/piper.txt +0 -0
  64. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_requirements/rag.txt +0 -0
  65. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_requirements/server.txt +0 -0
  66. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_requirements/speed.txt +0 -0
  67. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_requirements/vad.txt +0 -0
  68. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_requirements/vectordb.txt +0 -0
  69. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  70. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_requirements/wyoming.txt +0 -0
  71. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/_tools.py +0 -0
  72. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/agents/__init__.py +0 -0
  73. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/agents/_voice_agent_common.py +0 -0
  74. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/agents/assistant.py +0 -0
  75. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/agents/autocorrect.py +0 -0
  76. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/agents/chat.py +0 -0
  77. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/agents/diarize_live_session.py +0 -0
  78. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/agents/memory/__init__.py +0 -0
  79. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/agents/memory/add.py +0 -0
  80. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/agents/memory/proxy.py +0 -0
  81. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/agents/rag_proxy.py +0 -0
  82. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/agents/speak.py +0 -0
  83. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/agents/speakers.py +0 -0
  84. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/agents/transcribe.py +0 -0
  85. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/agents/transcribe_live.py +0 -0
  86. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/agents/voice_edit.py +0 -0
  87. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/api.py +0 -0
  88. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/config.py +0 -0
  89. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/config_cmd.py +0 -0
  90. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/constants.py +0 -0
  91. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/core/__init__.py +0 -0
  92. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/core/alignment.py +0 -0
  93. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/core/audio.py +0 -0
  94. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/core/audio_format.py +0 -0
  95. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/core/chroma.py +0 -0
  96. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/core/deps.py +0 -0
  97. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/core/diarization.py +0 -0
  98. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/core/openai_proxy.py +0 -0
  99. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/core/process.py +0 -0
  100. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/core/reranker.py +0 -0
  101. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/core/speaker_identity.py +0 -0
  102. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/core/sse.py +0 -0
  103. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/core/transcription_logger.py +0 -0
  104. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/core/utils.py +0 -0
  105. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/core/vad.py +0 -0
  106. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/core/watch.py +0 -0
  107. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/daemon/__init__.py +0 -0
  108. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/daemon/cli.py +0 -0
  109. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/__init__.py +0 -0
  110. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/_branch_name.py +0 -0
  111. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/_config.py +0 -0
  112. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/_output.py +0 -0
  113. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/cleanup.py +0 -0
  114. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/cli.py +0 -0
  115. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/__init__.py +0 -0
  116. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/aider.py +0 -0
  117. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/base.py +0 -0
  118. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/claude.py +0 -0
  119. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/codex.py +0 -0
  120. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  121. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/copilot.py +0 -0
  122. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  123. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/gemini.py +0 -0
  124. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/opencode.py +0 -0
  125. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/registry.py +0 -0
  126. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/editors/__init__.py +0 -0
  127. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/editors/base.py +0 -0
  128. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/editors/cursor.py +0 -0
  129. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/editors/emacs.py +0 -0
  130. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/editors/jetbrains.py +0 -0
  131. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/editors/nano.py +0 -0
  132. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/editors/neovim.py +0 -0
  133. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/editors/registry.py +0 -0
  134. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/editors/sublime.py +0 -0
  135. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/editors/vim.py +0 -0
  136. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/editors/vscode.py +0 -0
  137. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/editors/zed.py +0 -0
  138. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/hooks.py +0 -0
  139. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/launch.py +0 -0
  140. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/project.py +0 -0
  141. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/registry.py +0 -0
  142. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/skill/SKILL.md +0 -0
  143. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/skill/examples.md +0 -0
  144. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/terminals/__init__.py +0 -0
  145. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  146. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/terminals/base.py +0 -0
  147. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/terminals/cmux.py +0 -0
  148. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/terminals/gnome.py +0 -0
  149. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/terminals/iterm2.py +0 -0
  150. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/terminals/kitty.py +0 -0
  151. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/terminals/registry.py +0 -0
  152. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/terminals/tmux.py +0 -0
  153. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/terminals/warp.py +0 -0
  154. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/terminals/zellij.py +0 -0
  155. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/dev/worktree.py +0 -0
  156. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/docs_gen.py +0 -0
  157. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/example-config.toml +0 -0
  158. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/install/__init__.py +0 -0
  159. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/install/common.py +0 -0
  160. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/install/extras.py +0 -0
  161. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/install/hotkeys.py +0 -0
  162. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/install/launchd.py +0 -0
  163. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/install/service_config.py +0 -0
  164. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/install/services.py +0 -0
  165. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/install/systemd.py +0 -0
  166. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/memory/__init__.py +0 -0
  167. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/memory/_files.py +0 -0
  168. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/memory/_filters.py +0 -0
  169. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/memory/_git.py +0 -0
  170. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/memory/_indexer.py +0 -0
  171. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/memory/_ingest.py +0 -0
  172. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/memory/_persistence.py +0 -0
  173. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/memory/_prompt.py +0 -0
  174. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/memory/_retrieval.py +0 -0
  175. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/memory/_store.py +0 -0
  176. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/memory/_streaming.py +0 -0
  177. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/memory/_tasks.py +0 -0
  178. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/memory/api.py +0 -0
  179. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/memory/client.py +0 -0
  180. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/memory/engine.py +0 -0
  181. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/memory/entities.py +0 -0
  182. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/memory/models.py +0 -0
  183. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/opts.py +0 -0
  184. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/py.typed +0 -0
  185. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/rag/__init__.py +0 -0
  186. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/rag/_indexer.py +0 -0
  187. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/rag/_indexing.py +0 -0
  188. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/rag/_prompt.py +0 -0
  189. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/rag/_retriever.py +0 -0
  190. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/rag/_store.py +0 -0
  191. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/rag/_utils.py +0 -0
  192. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/rag/api.py +0 -0
  193. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/rag/client.py +0 -0
  194. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/rag/engine.py +0 -0
  195. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/rag/models.py +0 -0
  196. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  197. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/__init__.py +0 -0
  198. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  199. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  200. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  201. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  202. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  203. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  204. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  205. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  206. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  207. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  208. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  209. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  210. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  211. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  212. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/run-openwakeword.sh +0 -0
  213. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  214. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/setup-linux.sh +0 -0
  215. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  216. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/setup-macos.sh +0 -0
  217. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/setup-windows.ps1 +0 -0
  218. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  219. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/scripts/start-all-services.sh +0 -0
  220. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/__init__.py +0 -0
  221. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/cli.py +0 -0
  222. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/common.py +0 -0
  223. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/model_manager.py +0 -0
  224. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/model_registry.py +0 -0
  225. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/proxy/__init__.py +0 -0
  226. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/proxy/api.py +0 -0
  227. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/streaming.py +0 -0
  228. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/tts/__init__.py +0 -0
  229. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/tts/api.py +0 -0
  230. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/tts/backends/__init__.py +0 -0
  231. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/tts/backends/base.py +0 -0
  232. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/tts/backends/kokoro.py +0 -0
  233. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/tts/backends/piper.py +0 -0
  234. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/tts/model_manager.py +0 -0
  235. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/tts/model_registry.py +0 -0
  236. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/tts/wyoming_handler.py +0 -0
  237. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/whisper/__init__.py +0 -0
  238. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/whisper/api.py +0 -0
  239. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/whisper/backends/__init__.py +0 -0
  240. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/whisper/backends/base.py +0 -0
  241. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  242. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/whisper/backends/nemo.py +0 -0
  243. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/whisper/backends/transformers.py +0 -0
  244. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/whisper/languages.py +0 -0
  245. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/whisper/model_manager.py +0 -0
  246. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/whisper/model_registry.py +0 -0
  247. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  248. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/services/__init__.py +0 -0
  249. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/services/_wyoming_utils.py +0 -0
  250. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/services/asr.py +0 -0
  251. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/services/llm.py +0 -0
  252. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/services/tts.py +0 -0
  253. {agent_cli-0.102.0 → agent_cli-0.102.2}/agent_cli/services/wake_word.py +0 -0
  254. {agent_cli-0.102.0 → agent_cli-0.102.2}/docker/docker-compose.yml +0 -0
  255. {agent_cli-0.102.0 → agent_cli-0.102.2}/docker/memory-proxy.Dockerfile +0 -0
  256. {agent_cli-0.102.0 → agent_cli-0.102.2}/docker/rag-proxy.Dockerfile +0 -0
  257. {agent_cli-0.102.0 → agent_cli-0.102.2}/docker/transcribe-proxy.Dockerfile +0 -0
  258. {agent_cli-0.102.0 → agent_cli-0.102.2}/docker/tts.Dockerfile +0 -0
  259. {agent_cli-0.102.0 → agent_cli-0.102.2}/docker/whisper.Dockerfile +0 -0
  260. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/CNAME +0 -0
  261. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/architecture/index.md +0 -0
  262. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/architecture/memory.md +0 -0
  263. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/architecture/rag.md +0 -0
  264. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/assistant.md +0 -0
  265. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/autocorrect.md +0 -0
  266. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/chat.md +0 -0
  267. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/config.md +0 -0
  268. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/daemon.md +0 -0
  269. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/dev.md +0 -0
  270. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/diarize-live-session.md +0 -0
  271. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/index.md +0 -0
  272. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/install-extras.md +0 -0
  273. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/install-hotkeys.md +0 -0
  274. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/install-services.md +0 -0
  275. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/memory.md +0 -0
  276. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/rag-proxy.md +0 -0
  277. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/server/index.md +0 -0
  278. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/server/transcribe-proxy.md +0 -0
  279. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/server/tts.md +0 -0
  280. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/server/whisper.md +0 -0
  281. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/speak.md +0 -0
  282. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/speakers.md +0 -0
  283. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/start-services.md +0 -0
  284. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/transcribe-live.md +0 -0
  285. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/transcribe.md +0 -0
  286. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/commands/voice-edit.md +0 -0
  287. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/configuration.md +0 -0
  288. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/getting-started.md +0 -0
  289. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/iOS_Shortcut_Guide.md +0 -0
  290. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/index.md +0 -0
  291. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/installation/docker.md +0 -0
  292. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/installation/index.md +0 -0
  293. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/installation/linux.md +0 -0
  294. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/installation/macos-app.md +0 -0
  295. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/installation/macos.md +0 -0
  296. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/installation/nixos.md +0 -0
  297. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/installation/windows.md +0 -0
  298. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/logo-avatar.svg +0 -0
  299. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/logo-clean.svg +0 -0
  300. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  301. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/run_markdown_code_runner.py +0 -0
  302. {agent_cli-0.102.0 → agent_cli-0.102.2}/docs/system-integration.md +0 -0
  303. {agent_cli-0.102.0 → agent_cli-0.102.2}/example.agent-cli-config.toml +0 -0
  304. {agent_cli-0.102.0 → agent_cli-0.102.2}/justfile +0 -0
  305. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Package.resolved +0 -0
  306. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Package.swift +0 -0
  307. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
  308. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Resources/Info.plist +0 -0
  309. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
  310. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
  311. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
  312. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +0 -0
  313. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
  314. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
  315. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
  316. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
  317. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
  318. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
  319. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
  320. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/LiveTranscriptionPreview.swift +0 -0
  321. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
  322. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatus.swift +0 -0
  323. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatusRow.swift +0 -0
  324. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/MenuActivityTracker.swift +0 -0
  325. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
  326. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
  327. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
  328. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
  329. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
  330. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +0 -0
  331. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +0 -0
  332. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +0 -0
  333. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
  334. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
  335. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
  336. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/ConfigurableHotkeyControllerTests.swift +0 -0
  337. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/LivePreviewSwiftTestingTests.swift +0 -0
  338. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/LiveTranscriptionPreviewTests.swift +0 -0
  339. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
  340. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
  341. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +0 -0
  342. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
  343. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/VoiceLevelMeterTests.swift +0 -0
  344. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/build-macos-app.sh +0 -0
  345. {agent_cli-0.102.0 → agent_cli-0.102.2}/macos/test-macos-app-e2e.sh +0 -0
  346. {agent_cli-0.102.0 → agent_cli-0.102.2}/reddit.md +0 -0
  347. {agent_cli-0.102.0 → agent_cli-0.102.2}/shell.nix +0 -0
  348. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/__init__.py +0 -0
  349. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/agents/__init__.py +0 -0
  350. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/agents/test_fix_my_text.py +0 -0
  351. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/agents/test_interactive.py +0 -0
  352. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/agents/test_interactive_extra.py +0 -0
  353. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/agents/test_memory_add.py +0 -0
  354. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/agents/test_speak.py +0 -0
  355. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/agents/test_speak_e2e.py +0 -0
  356. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/agents/test_speakers.py +0 -0
  357. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/agents/test_transcribe.py +0 -0
  358. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/agents/test_transcribe_agent.py +0 -0
  359. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/agents/test_transcribe_e2e.py +0 -0
  360. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/agents/test_transcribe_live.py +0 -0
  361. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/agents/test_transcribe_recovery.py +0 -0
  362. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/agents/test_tts_common.py +0 -0
  363. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/agents/test_tts_common_extra.py +0 -0
  364. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/agents/test_voice_agent_common.py +0 -0
  365. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/agents/test_voice_edit.py +0 -0
  366. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/agents/test_voice_edit_e2e.py +0 -0
  367. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/agents/test_wake_word_assistant.py +0 -0
  368. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/core/__init__.py +0 -0
  369. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/core/test_audio.py +0 -0
  370. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/core/test_audio_format.py +0 -0
  371. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/core/test_audio_levels.py +0 -0
  372. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/core/test_chroma.py +0 -0
  373. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/core/test_sse.py +0 -0
  374. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/core/test_vad.py +0 -0
  375. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/core/test_watch.py +0 -0
  376. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/dev/__init__.py +0 -0
  377. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/dev/test_cleanup.py +0 -0
  378. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/dev/test_cli.py +0 -0
  379. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/dev/test_coding_agents.py +0 -0
  380. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/dev/test_editors.py +0 -0
  381. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/dev/test_hooks.py +0 -0
  382. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/dev/test_launch.py +0 -0
  383. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/dev/test_project.py +0 -0
  384. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/dev/test_terminals.py +0 -0
  385. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/dev/test_verification.py +0 -0
  386. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/dev/test_worktree.py +0 -0
  387. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/install/__init__.py +0 -0
  388. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/install/test_extras.py +0 -0
  389. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/install/test_launchd.py +0 -0
  390. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/memory/__init__.py +0 -0
  391. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/memory/test_api_health.py +0 -0
  392. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/memory/test_api_integration_liveish.py +0 -0
  393. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/memory/test_client.py +0 -0
  394. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/memory/test_engine.py +0 -0
  395. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/memory/test_files.py +0 -0
  396. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/memory/test_filters.py +0 -0
  397. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/memory/test_git_integration.py +0 -0
  398. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/memory/test_indexer.py +0 -0
  399. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/memory/test_memory_integration.py +0 -0
  400. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/memory/test_proxy_passthrough.py +0 -0
  401. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/memory/test_store.py +0 -0
  402. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/memory/test_utils.py +0 -0
  403. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/mocks/__init__.py +0 -0
  404. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/mocks/audio.py +0 -0
  405. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/mocks/llm.py +0 -0
  406. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/mocks/wyoming.py +0 -0
  407. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/rag/__init__.py +0 -0
  408. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/rag/test_api.py +0 -0
  409. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/rag/test_engine.py +0 -0
  410. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/rag/test_history.py +0 -0
  411. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/rag/test_indexer.py +0 -0
  412. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/rag/test_indexing.py +0 -0
  413. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/rag/test_rag_client.py +0 -0
  414. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/rag/test_rag_integration_liveish.py +0 -0
  415. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  416. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/rag/test_retriever.py +0 -0
  417. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/rag/test_store.py +0 -0
  418. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/rag/test_utils.py +0 -0
  419. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_alignment.py +0 -0
  420. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_api.py +0 -0
  421. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_api_integration.py +0 -0
  422. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_asr.py +0 -0
  423. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_asr_recovery.py +0 -0
  424. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_audio_e2e.py +0 -0
  425. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_cli.py +0 -0
  426. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_config.py +0 -0
  427. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_config_cmd.py +0 -0
  428. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_daemon.py +0 -0
  429. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_diarization.py +0 -0
  430. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_diarize_live_session.py +0 -0
  431. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_docs_gen.py +0 -0
  432. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_env_vars.py +0 -0
  433. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_faster_whisper_backend.py +0 -0
  434. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_json_output.py +0 -0
  435. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_llm.py +0 -0
  436. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_llm_gemini.py +0 -0
  437. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_memory_tools.py +0 -0
  438. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_nemo_backend.py +0 -0
  439. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_normalize_appcast.py +0 -0
  440. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_process_manager.py +0 -0
  441. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_requires_extras.py +0 -0
  442. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_server_streaming.py +0 -0
  443. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_server_tts.py +0 -0
  444. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_server_tts_wyoming.py +0 -0
  445. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_server_whisper.py +0 -0
  446. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_services.py +0 -0
  447. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_speaker_identity.py +0 -0
  448. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_tools.py +0 -0
  449. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_transformers_backend.py +0 -0
  450. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_tts.py +0 -0
  451. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_wake_word.py +0 -0
  452. {agent_cli-0.102.0 → agent_cli-0.102.2}/tests/test_wyoming_utils.py +0 -0
  453. {agent_cli-0.102.0 → agent_cli-0.102.2}/zensical.toml +0 -0
@@ -46,7 +46,7 @@ jobs:
46
46
  df -h
47
47
 
48
48
  - name: Checkout repository
49
- uses: actions/checkout@v7.0.0
49
+ uses: actions/checkout@v7.0.1
50
50
  with:
51
51
  fetch-depth: 0 # Full history for version detection
52
52
 
@@ -54,7 +54,7 @@ jobs:
54
54
  uses: docker/setup-buildx-action@v4.2.0
55
55
 
56
56
  - name: Log in to Container Registry
57
- uses: docker/login-action@v4.4.0
57
+ uses: docker/login-action@v4.5.1
58
58
  with:
59
59
  registry: ${{ env.REGISTRY }}
60
60
  username: ${{ github.actor }}
@@ -111,7 +111,7 @@ jobs:
111
111
 
112
112
  steps:
113
113
  - name: Checkout repository
114
- uses: actions/checkout@v7.0.0
114
+ uses: actions/checkout@v7.0.1
115
115
  with:
116
116
  fetch-depth: 0 # Full history for version detection
117
117
 
@@ -119,7 +119,7 @@ jobs:
119
119
  uses: docker/setup-buildx-action@v4.2.0
120
120
 
121
121
  - name: Log in to Container Registry
122
- uses: docker/login-action@v4.4.0
122
+ uses: docker/login-action@v4.5.1
123
123
  with:
124
124
  registry: ${{ env.REGISTRY }}
125
125
  username: ${{ github.actor }}
@@ -27,7 +27,7 @@ jobs:
27
27
  build:
28
28
  runs-on: ubuntu-latest
29
29
  steps:
30
- - uses: actions/checkout@v7.0.0
30
+ - uses: actions/checkout@v7.0.1
31
31
  with:
32
32
  lfs: true
33
33
 
@@ -11,7 +11,7 @@ jobs:
11
11
  runs-on: ubuntu-latest
12
12
  steps:
13
13
  - name: Check out repository
14
- uses: actions/checkout@v7.0.0
14
+ uses: actions/checkout@v7.0.1
15
15
  with:
16
16
  persist-credentials: false
17
17
  fetch-depth: 0
@@ -18,7 +18,7 @@ jobs:
18
18
  python-version: ["3.11", "3.13"]
19
19
 
20
20
  steps:
21
- - uses: actions/checkout@v7.0.0
21
+ - uses: actions/checkout@v7.0.1
22
22
  - name: Set up Python ${{ matrix.python-version }}
23
23
  uses: actions/setup-python@v6.3.0
24
24
  with:
@@ -9,6 +9,6 @@ jobs:
9
9
  update_release_draft:
10
10
  runs-on: ubuntu-latest
11
11
  steps:
12
- - uses: release-drafter/release-drafter@v7.5.1
12
+ - uses: release-drafter/release-drafter@v7.6.0
13
13
  env:
14
14
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -14,7 +14,7 @@ jobs:
14
14
  permissions:
15
15
  id-token: write
16
16
  steps:
17
- - uses: actions/checkout@v7.0.0
17
+ - uses: actions/checkout@v7.0.1
18
18
  - name: Install uv
19
19
  uses: astral-sh/setup-uv@v8.3.2
20
20
  - name: Build
@@ -29,7 +29,7 @@ jobs:
29
29
  permissions:
30
30
  contents: write
31
31
  steps:
32
- - uses: actions/checkout@v7.0.0
32
+ - uses: actions/checkout@v7.0.1
33
33
  - name: Install uv
34
34
  uses: astral-sh/setup-uv@v8.3.2
35
35
  - name: Import Developer ID certificate
@@ -126,17 +126,3 @@ jobs:
126
126
  git commit -m "Update AgentCLI release metadata to ${TAG_NAME}"
127
127
  git pull --rebase origin main
128
128
  git push origin HEAD:main
129
- - name: Trigger Homebrew tap update
130
- env:
131
- GH_TOKEN: ${{ secrets.HOMEBREW_TAP_DISPATCH_TOKEN }}
132
- TAG_NAME: ${{ github.event.release.tag_name }}
133
- run: |
134
- if [[ -z "$GH_TOKEN" ]]; then
135
- echo "HOMEBREW_TAP_DISPATCH_TOKEN is required to update basnijholt/homebrew-tap." >&2
136
- exit 1
137
- fi
138
-
139
- gh api repos/basnijholt/homebrew-tap/dispatches \
140
- -f event_type=agent-cli-release \
141
- -F "client_payload[tag_name]=$TAG_NAME" \
142
- -F "client_payload[asset_url]=https://github.com/basnijholt/agent-cli/releases/download/${TAG_NAME}/AgentCLI.dmg"
@@ -11,7 +11,7 @@ repos:
11
11
  - id: end-of-file-fixer
12
12
  - id: mixed-line-ending
13
13
  - repo: https://github.com/astral-sh/ruff-pre-commit
14
- rev: "v0.15.21"
14
+ rev: "v0.15.22"
15
15
  hooks:
16
16
  - id: ruff
17
17
  args: ["--fix"]
@@ -48,14 +48,17 @@ repos:
48
48
  name: uv lock
49
49
  entry: uv lock
50
50
  language: python
51
- additional_dependencies: ["uv"]
51
+ # Pinned: uv export's marker output differs between releases, so an
52
+ # unpinned uv makes agent_cli/_requirements/*.txt depend on whoever's
53
+ # hook cache is freshest.
54
+ additional_dependencies: ["uv==0.11.32"]
52
55
  pass_filenames: false
53
56
  files: pyproject\.toml
54
57
  - id: sync-requirements
55
58
  name: sync extra requirements
56
59
  entry: python .github/scripts/sync_requirements.py
57
60
  language: python
58
- additional_dependencies: ["uv"]
61
+ additional_dependencies: ["uv==0.11.32"]
59
62
  pass_filenames: false
60
63
  files: (pyproject\.toml|uv\.lock)
61
64
  - id: check-extras-sync
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-cli
3
- Version: 0.102.0
3
+ Version: 0.102.2
4
4
  Summary: A suite of AI-powered command-line tools for text correction, audio transcription, and voice assistance.
5
5
  Project-URL: Homepage, https://github.com/basnijholt/agent-cli
6
6
  Author-email: Bas Nijholt <bas@nijho.lt>
@@ -61,6 +61,7 @@ Requires-Dist: watchfiles>=0.21.0; extra == 'memory'
61
61
  Provides-Extra: mlx-whisper
62
62
  Requires-Dist: fastapi[standard]; extra == 'mlx-whisper'
63
63
  Requires-Dist: mlx-whisper>=0.4.0; (sys_platform == 'darwin' and platform_machine == 'arm64') and extra == 'mlx-whisper'
64
+ Requires-Dist: mlx>=0.24; (sys_platform == 'darwin' and platform_machine == 'arm64') and extra == 'mlx-whisper'
64
65
  Provides-Extra: nemo-whisper
65
66
  Requires-Dist: fastapi[standard]; extra == 'nemo-whisper'
66
67
  Requires-Dist: nemo-toolkit[asr]>=2.2.0; (python_version < '3.14') and extra == 'nemo-whisper'
@@ -0,0 +1,16 @@
1
+ """A suite of AI-powered command-line tools for text correction, audio transcription, and voice assistance."""
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ if TYPE_CHECKING:
6
+ __version__: str
7
+
8
+
9
+ def __getattr__(name: str) -> str:
10
+ """Resolve `__version__` lazily; reading distribution metadata costs ~29ms."""
11
+ if name == "__version__":
12
+ from importlib.metadata import version # noqa: PLC0415
13
+
14
+ return version("agent-cli")
15
+ msg = f"module {__name__!r} has no attribute {name!r}"
16
+ raise AttributeError(msg)
@@ -1,10 +1,10 @@
1
1
  # This file was autogenerated by uv via the following command:
2
2
  # uv export --extra diarization --no-dev --no-emit-project --no-hashes
3
- aiohappyeyeballs==2.6.2
3
+ aiohappyeyeballs==2.6.2 ; python_full_version < '3.13'
4
4
  # via aiohttp
5
- aiohttp==3.13.5
5
+ aiohttp==3.13.5 ; python_full_version < '3.13'
6
6
  # via fsspec
7
- aiosignal==1.4.0
7
+ aiosignal==1.4.0 ; python_full_version < '3.13'
8
8
  # via aiohttp
9
9
  alembic==1.18.4
10
10
  # via optuna
@@ -18,7 +18,7 @@ anyio==4.13.0
18
18
  # via httpx
19
19
  asteroid-filterbanks==0.4.0
20
20
  # via pyannote-audio
21
- attrs==26.1.0
21
+ attrs==26.1.0 ; python_full_version < '3.13'
22
22
  # via aiohttp
23
23
  certifi==2026.5.20
24
24
  # via
@@ -61,7 +61,7 @@ filelock==3.29.0
61
61
  # torch
62
62
  fonttools==4.63.0
63
63
  # via matplotlib
64
- frozenlist==1.8.0
64
+ frozenlist==1.8.0 ; python_full_version < '3.13'
65
65
  # via
66
66
  # aiohttp
67
67
  # aiosignal
@@ -136,7 +136,7 @@ mdurl==0.1.2
136
136
  # via markdown-it-py
137
137
  mpmath==1.3.0
138
138
  # via sympy
139
- multidict==6.7.1
139
+ multidict==6.7.1 ; python_full_version < '3.13'
140
140
  # via
141
141
  # aiohttp
142
142
  # yarl
@@ -267,7 +267,7 @@ pillow==12.2.0
267
267
  # via matplotlib
268
268
  primepy==1.3
269
269
  # via torch-pitch-shift
270
- propcache==0.5.2
270
+ propcache==0.5.2 ; python_full_version < '3.13'
271
271
  # via
272
272
  # aiohttp
273
273
  # yarl
@@ -480,5 +480,5 @@ tzdata==2026.2 ; sys_platform == 'emscripten' or sys_platform == 'win32'
480
480
  # via pandas
481
481
  urllib3==2.7.0
482
482
  # via requests
483
- yarl==1.24.2
483
+ yarl==1.24.2 ; python_full_version < '3.13'
484
484
  # via aiohttp
@@ -98,7 +98,9 @@ markupsafe==3.0.3
98
98
  mdurl==0.1.2
99
99
  # via markdown-it-py
100
100
  mlx==0.31.2 ; platform_machine == 'arm64' and sys_platform == 'darwin'
101
- # via mlx-whisper
101
+ # via
102
+ # agent-cli
103
+ # mlx-whisper
102
104
  mlx-metal==0.31.2 ; platform_machine == 'arm64' and sys_platform == 'darwin'
103
105
  # via mlx
104
106
  mlx-whisper==0.4.3 ; platform_machine == 'arm64' and sys_platform == 'darwin'
@@ -6,11 +6,11 @@ absl-py==2.4.0 ; python_full_version < '3.14'
6
6
  # tensorboard
7
7
  accelerate==1.13.0 ; python_full_version < '3.14'
8
8
  # via peft
9
- aiohappyeyeballs==2.6.2 ; python_full_version < '3.14'
9
+ aiohappyeyeballs==2.6.2 ; python_full_version < '3.13'
10
10
  # via aiohttp
11
- aiohttp==3.13.5 ; python_full_version < '3.14'
11
+ aiohttp==3.13.5 ; python_full_version < '3.13'
12
12
  # via fsspec
13
- aiosignal==1.4.0 ; python_full_version < '3.14'
13
+ aiosignal==1.4.0 ; python_full_version < '3.13'
14
14
  # via aiohttp
15
15
  alembic==1.18.4 ; python_full_version < '3.14'
16
16
  # via optuna
@@ -31,7 +31,7 @@ anyio==4.13.0
31
31
  # watchfiles
32
32
  asttokens==3.0.1 ; python_full_version < '3.14'
33
33
  # via stack-data
34
- attrs==26.1.0 ; python_full_version < '3.14'
34
+ attrs==26.1.0 ; python_full_version < '3.13'
35
35
  # via aiohttp
36
36
  audioop-lts==0.2.2 ; python_full_version == '3.13.*'
37
37
  # via
@@ -146,7 +146,7 @@ filelock==3.29.0 ; python_full_version < '3.14'
146
146
  # transformers
147
147
  fonttools==4.63.0 ; python_full_version < '3.14'
148
148
  # via matplotlib
149
- frozenlist==1.8.0 ; python_full_version < '3.14'
149
+ frozenlist==1.8.0 ; python_full_version < '3.13'
150
150
  # via
151
151
  # aiohttp
152
152
  # aiosignal
@@ -308,7 +308,7 @@ mpmath==1.3.0 ; python_full_version < '3.14'
308
308
  # via sympy
309
309
  msgpack==1.1.2 ; python_full_version < '3.14'
310
310
  # via librosa
311
- multidict==6.7.1 ; python_full_version < '3.14'
311
+ multidict==6.7.1 ; python_full_version < '3.13'
312
312
  # via
313
313
  # aiohttp
314
314
  # yarl
@@ -515,7 +515,7 @@ portalocker==3.2.0 ; python_full_version == '3.13.*'
515
515
  # via sacrebleu
516
516
  prompt-toolkit==3.0.52 ; python_full_version < '3.14'
517
517
  # via ipython
518
- propcache==0.5.2 ; python_full_version < '3.14'
518
+ propcache==0.5.2 ; python_full_version < '3.13'
519
519
  # via
520
520
  # aiohttp
521
521
  # yarl
@@ -888,5 +888,5 @@ wrapt==2.2.1 ; python_full_version < '3.14'
888
888
  # via nemo-toolkit
889
889
  xxhash==3.7.0 ; python_full_version < '3.14'
890
890
  # via datasets
891
- yarl==1.24.2 ; python_full_version < '3.14'
891
+ yarl==1.24.2 ; python_full_version < '3.13'
892
892
  # via aiohttp
@@ -9,7 +9,6 @@ from typing import Annotated, Any
9
9
  import typer
10
10
  from rich.table import Table
11
11
 
12
- from . import __version__
13
12
  from .config import load_config, normalize_provider_defaults
14
13
  from .core.process import set_process_title
15
14
  from .core.utils import console
@@ -49,6 +48,8 @@ app = typer.Typer(
49
48
 
50
49
  def _version_callback(value: bool) -> None:
51
50
  if value:
51
+ from . import __version__ # noqa: PLC0415
52
+
52
53
  path = Path(__file__).parent
53
54
  data = [
54
55
  ("agent-cli version", __version__),
@@ -135,11 +135,24 @@ def _transcribe_in_subprocess(
135
135
  kwargs: dict[str, Any],
136
136
  ) -> dict[str, Any]:
137
137
  """Run transcription in subprocess. Model stays loaded between calls."""
138
+ import mlx.core as mx # noqa: PLC0415
138
139
  import mlx_whisper # noqa: PLC0415
139
140
  import numpy as np # noqa: PLC0415
140
141
 
141
142
  audio_array = np.frombuffer(audio_bytes, dtype=audio_dtype).reshape(audio_shape)
142
- result = mlx_whisper.transcribe(audio_array, path_or_hf_repo=model_name, **kwargs)
143
+ try:
144
+ result = mlx_whisper.transcribe(audio_array, path_or_hf_repo=model_name, **kwargs)
145
+ finally:
146
+ # Release MLX's reusable Metal buffer cache after each request. With --ttl 0
147
+ # the subprocess is never recycled, so without this the cache grows to the
148
+ # largest working set ever seen and gets pushed to swap, degrading latency.
149
+ # clear_cache() frees only the cache, NOT live arrays, so the loaded model
150
+ # weights stay resident and inference stays hot (no cold reload).
151
+ # In finally so a failed transcription also releases the buffers it
152
+ # allocated; otherwise the long-lived worker would retain them.
153
+ # Top-level clear_cache() needs mlx>=0.24 (pinned in the mlx-whisper
154
+ # extra); older releases only expose mx.metal.clear_cache().
155
+ mx.clear_cache()
143
156
 
144
157
  return {
145
158
  "text": result.get("text", ""),
@@ -111,8 +111,11 @@ workflow expects these repository secrets:
111
111
  - `APPLE_APP_SPECIFIC_PASSWORD`: app-specific password for `notarytool`
112
112
  - `APPLE_TEAM_ID`: Apple Developer Team ID
113
113
  - `SPARKLE_PRIVATE_ED_KEY`: private Sparkle EdDSA key for signing updates
114
- - `HOMEBREW_TAP_DISPATCH_TOKEN`: fine-grained token with Contents write access
115
- to `basnijholt/homebrew-tap`, used to trigger the tap cask update workflow
114
+
115
+ The Homebrew cask is not published from here. `basnijholt/homebrew-tap` runs a
116
+ daily cron that reads the latest release and bumps `Casks/agent-cli.rb` itself;
117
+ run it on demand with
118
+ `gh workflow run update-agent-cli-cask.yml --repo basnijholt/homebrew-tap`.
116
119
 
117
120
  The workflow also expects the repository variable `SPARKLE_PUBLIC_ED_KEY`.
118
121
  Generate the key pair with Sparkle's `generate_keys` tool and store only the
@@ -27,6 +27,29 @@ private final class UserInstalledCLICheckCache {
27
27
  }
28
28
  }
29
29
 
30
+ /// Caches the login shell PATH lookup, which costs a full `zsh -lic` startup
31
+ /// (~1s with a typical dotfiles setup) and would otherwise run on every command.
32
+ /// Only successful lookups are cached, so a shell that fails once does not
33
+ /// degrade PATH for the rest of the session.
34
+ private final class LoginShellPATHCache {
35
+ private let lock = NSLock()
36
+ private var resolved: String?
37
+
38
+ func value(compute: () -> String?) -> String? {
39
+ lock.lock()
40
+ defer { lock.unlock() }
41
+ if let resolved {
42
+ return resolved
43
+ }
44
+ resolved = compute()
45
+ return resolved
46
+ }
47
+
48
+ func invalidate() {
49
+ lock.withLock { resolved = nil }
50
+ }
51
+ }
52
+
30
53
  typealias AgentProcessRunner = (URL, [String], [String: String]) -> CommandResult
31
54
  typealias LocalhostConnector = (UInt16) -> Bool
32
55
 
@@ -58,6 +81,7 @@ struct AgentRuntime {
58
81
  private let processRunner: AgentProcessRunner
59
82
  private let localhostConnector: LocalhostConnector
60
83
  private let userInstalledCLICheckCache: UserInstalledCLICheckCache
84
+ private let loginShellPATHCache: LoginShellPATHCache
61
85
  private let whisperReadyTimeout: TimeInterval
62
86
  let appSupportURL: URL
63
87
  let bundledUVURL: URL
@@ -90,6 +114,7 @@ struct AgentRuntime {
90
114
  self.processRunner = processRunner
91
115
  self.localhostConnector = localhostConnector
92
116
  self.userInstalledCLICheckCache = UserInstalledCLICheckCache()
117
+ self.loginShellPATHCache = LoginShellPATHCache()
93
118
  self.whisperReadyTimeout = whisperReadyTimeout
94
119
 
95
120
  if let override = environment["AGENTCLI_APP_SUPPORT_DIR"], !override.isEmpty {
@@ -343,6 +368,9 @@ struct AgentRuntime {
343
368
  progress: AgentBootstrapProgress = { _ in }
344
369
  ) -> CommandResult {
345
370
  let mode = runtimeMode
371
+ if force {
372
+ loginShellPATHCache.invalidate()
373
+ }
346
374
  do {
347
375
  try prepareDirectories(for: mode)
348
376
  } catch {
@@ -647,7 +675,7 @@ struct AgentRuntime {
647
675
  let existingPATH = environment["PATH"] ?? "/usr/bin:/bin:/usr/sbin:/sbin"
648
676
  environment["PATH"] = userInstalledCLIPath(
649
677
  existingPATH: existingPATH,
650
- loginShellPATH: Self.loginShellPATH(environment: baseEnvironment)
678
+ loginShellPATH: loginShellPATHCache.value { loginShellPATH() }
651
679
  )
652
680
  return environment
653
681
  }
@@ -708,14 +736,14 @@ struct AgentRuntime {
708
736
  .joined(separator: ":")
709
737
  }
710
738
 
711
- private static func loginShellPATH(environment: [String: String]) -> String? {
712
- let shellPath = environment["SHELL"].flatMap { $0.isEmpty ? nil : $0 } ?? "/bin/zsh"
713
- guard FileManager.default.isExecutableFile(atPath: shellPath) else { return nil }
739
+ private func loginShellPATH() -> String? {
740
+ let shellPath = baseEnvironment["SHELL"].flatMap { $0.isEmpty ? nil : $0 } ?? "/bin/zsh"
741
+ guard fileManager.isExecutableFile(atPath: shellPath) else { return nil }
714
742
 
715
- let result = runProcess(
716
- executableURL: URL(fileURLWithPath: shellPath),
717
- arguments: ["-lic", "printf '%s\\n' \"$PATH\""],
718
- environment: environment
743
+ let result = processRunner(
744
+ URL(fileURLWithPath: shellPath),
745
+ ["-lic", "printf '%s\\n' \"$PATH\""],
746
+ baseEnvironment
719
747
  )
720
748
  guard result.exitCode == 0 else { return nil }
721
749
 
@@ -242,6 +242,88 @@ final class AgentCommandTests: XCTestCase {
242
242
  XCTAssertEqual(components.filter { $0 == "/usr/bin" }.count, 1)
243
243
  }
244
244
 
245
+ /// Builds a user-installed runtime whose process runner intercepts `zsh -lic` PATH probes.
246
+ private func makeShellPATHProbingRuntime(
247
+ suiteName: String,
248
+ onShellProbe: @escaping () -> CommandResult
249
+ ) -> AgentRuntime {
250
+ let defaults = UserDefaults(suiteName: suiteName)!
251
+ defaults.removePersistentDomain(forName: suiteName)
252
+ defaults.set(true, forKey: RuntimeSettings.useUserInstalledAgentCLIKey)
253
+ return AgentRuntime(
254
+ environment: [
255
+ "AGENTCLI_APP_SUPPORT_DIR": "/tmp/agentcli-test-support",
256
+ "PATH": "/custom/bin",
257
+ "SHELL": "/bin/zsh",
258
+ ],
259
+ userDefaults: defaults,
260
+ processRunner: { _, arguments, _ in
261
+ guard arguments.first == "-lic" else {
262
+ return CommandResult(exitCode: 0, output: "")
263
+ }
264
+ return onShellProbe()
265
+ }
266
+ )
267
+ }
268
+
269
+ private static let shellPATHProbeSuccess = CommandResult(exitCode: 0, output: "/shell/bin\n")
270
+
271
+ /// `zsh -lic` costs roughly a second with a real dotfiles setup, so the login shell
272
+ /// PATH must be resolved once per runtime instead of once per spawned command.
273
+ func testUserInstalledRuntimeCachesLoginShellPATHLookup() {
274
+ var shellProbes = 0
275
+ let runtime = makeShellPATHProbingRuntime(
276
+ suiteName: "AgentCLITests.user-runtime-shell-path-cache"
277
+ ) {
278
+ shellProbes += 1
279
+ return Self.shellPATHProbeSuccess
280
+ }
281
+
282
+ _ = runtime.commandEnvironment()
283
+ let environment = runtime.commandEnvironment()
284
+ _ = runtime.runAgentCLI(arguments: ["--version"])
285
+
286
+ XCTAssertEqual(shellProbes, 1)
287
+ XCTAssertEqual(environment["PATH"]?.split(separator: ":").first.map(String.init), "/shell/bin")
288
+ }
289
+
290
+ func testForcedInstallRefreshesLoginShellPATHLookup() {
291
+ var shellProbes = 0
292
+ let runtime = makeShellPATHProbingRuntime(
293
+ suiteName: "AgentCLITests.user-runtime-shell-path-refresh"
294
+ ) {
295
+ shellProbes += 1
296
+ return Self.shellPATHProbeSuccess
297
+ }
298
+
299
+ _ = runtime.commandEnvironment()
300
+ _ = runtime.ensureInstalled(force: true)
301
+ _ = runtime.commandEnvironment()
302
+
303
+ XCTAssertEqual(shellProbes, 2)
304
+ }
305
+
306
+ /// A login shell that fails once must not degrade PATH for the rest of the session,
307
+ /// matching how the CLI availability check only caches successful results.
308
+ func testFailedLoginShellPATHLookupIsRetried() {
309
+ var shellProbes = 0
310
+ let runtime = makeShellPATHProbingRuntime(
311
+ suiteName: "AgentCLITests.user-runtime-shell-path-failure"
312
+ ) {
313
+ shellProbes += 1
314
+ return shellProbes == 1
315
+ ? CommandResult(exitCode: 1, output: "")
316
+ : Self.shellPATHProbeSuccess
317
+ }
318
+
319
+ let degraded = runtime.commandEnvironment()
320
+ let recovered = runtime.commandEnvironment()
321
+
322
+ XCTAssertEqual(shellProbes, 2)
323
+ XCTAssertNotEqual(degraded["PATH"]?.split(separator: ":").first.map(String.init), "/shell/bin")
324
+ XCTAssertEqual(recovered["PATH"]?.split(separator: ":").first.map(String.init), "/shell/bin")
325
+ }
326
+
245
327
  func testTranscriptionBootstrapRepairsStaleWhisperDaemonMarker() throws {
246
328
  let tempURL = FileManager.default.temporaryDirectory
247
329
  .appendingPathComponent("AgentCLITests-\(UUID().uuidString)", isDirectory: true)
@@ -4,6 +4,66 @@
4
4
  <title>Agent CLI Updates</title>
5
5
  <link>https://github.com/basnijholt/agent-cli</link>
6
6
  <description>Signed Agent CLI macOS app updates.</description>
7
+ <item>
8
+ <title>0.102.1</title>
9
+ <pubDate>Sat, 25 Jul 2026 18:58:28 +0000</pubDate>
10
+ <link>https://github.com/basnijholt/agent-cli</link>
11
+ <sparkle:version>198</sparkle:version>
12
+ <sparkle:shortVersionString>0.102.1</sparkle:shortVersionString>
13
+ <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
14
+ <sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
15
+ <description sparkle:format="markdown"><![CDATA[## Bug fixes
16
+
17
+ * **Transcription now starts ~1.3s sooner after pressing the hotkey.** The macOS app spawned a login + interactive shell (`zsh -lic`) to discover `PATH` on *every* command it ran, costing 1.1–1.4s with a typical dotfiles setup. The recording pill appeared immediately but the microphone did not open until that shell finished, so speaking right away lost the first words. The login shell `PATH` is now resolved once per app launch, during the existing startup warm-up. Measured hotkey to first audio chunk: ~1.8s → ~0.4–0.6s. (#622)
18
+ * Only successful lookups are cached, so a login shell that fails once does not leave the app on a degraded `PATH` for the rest of the session.
19
+ * *Install or Update CLI* still re-probes, so a relocated `agent-cli` binary is picked up without restarting the app.
20
+
21
+ ## Performance
22
+
23
+ * `agent-cli` no longer reads its own distribution metadata on startup. `__version__` resolves lazily, saving ~29ms on every command. (#622)
24
+
25
+ ## Maintenance
26
+
27
+ * ⬆️ Update docker/login-action to v4.5.1 (#621, #619)
28
+ * ⬆️ Update actions/checkout to v7.0.1 (#617)
29
+ * ⬆️ Update release-drafter/release-drafter to v7.6.0 (#614)
30
+ * [pre-commit.ci] pre-commit autoupdate (#616)
31
+ ]]></description>
32
+ <enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.102.1/AgentCLI.zip" length="24329452" type="application/octet-stream" sparkle:edSignature="MQizz/9FfhxJGKQc6I/XXtIUBLVPh20yWi/kvfE7xBpoQGPF4yE4C0T1Ex1WpU3im/vRLrMIbZMv0+yHYTifBQ=="/>
33
+ </item>
34
+ <item>
35
+ <title>0.102.0</title>
36
+ <pubDate>Tue, 14 Jul 2026 05:57:01 +0000</pubDate>
37
+ <link>https://github.com/basnijholt/agent-cli</link>
38
+ <sparkle:version>197</sparkle:version>
39
+ <sparkle:shortVersionString>0.102.0</sparkle:shortVersionString>
40
+ <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
41
+ <sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
42
+ <description sparkle:format="markdown"><![CDATA[## What’s Changed
43
+
44
+ * Fix Wyoming TTS voice selection and metadata (#613) @basnijholt
45
+ * ⬆️ Update actions/checkout action to v7 (#598) @[renovate[bot]](https://github.com/apps/renovate)
46
+ * ⬆️ Update sparkle-project/Sparkle to v2.9.4 (#607) @[renovate[bot]](https://github.com/apps/renovate)
47
+ * [pre-commit.ci] pre-commit autoupdate (#612) @[pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci)
48
+ * ⬆️ Update astral-sh/setup-uv action to v8.3.2 (#611) @[renovate[bot]](https://github.com/apps/renovate)
49
+ * ⬆️ Update astral-sh/setup-uv action to v8.3.1 (#610) @[renovate[bot]](https://github.com/apps/renovate)
50
+ * ⬆️ Update astral-sh/setup-uv action to v8.3.0 (#609) @[renovate[bot]](https://github.com/apps/renovate)
51
+ * ⬆️ Update docker/login-action action to v4.4.0 (#608) @[renovate[bot]](https://github.com/apps/renovate)
52
+ * ⬆️ Update docker/setup-buildx-action action to v4.2.0 (#606) @[renovate[bot]](https://github.com/apps/renovate)
53
+ * ⬆️ Update docker/metadata-action action to v6.2.0 (#605) @[renovate[bot]](https://github.com/apps/renovate)
54
+ * ⬆️ Update docker/login-action action to v4.3.0 (#604) @[renovate[bot]](https://github.com/apps/renovate)
55
+ * ⬆️ Update docker/build-push-action action to v7.3.0 (#603) @[renovate[bot]](https://github.com/apps/renovate)
56
+ * [pre-commit.ci] pre-commit autoupdate (#602) @[pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci)
57
+ * ⬆️ Update release-drafter/release-drafter action to v7.5.1 (#601) @[renovate[bot]](https://github.com/apps/renovate)
58
+ * ⬆️ Update actions/setup-python action to v6.3.0 (#600) @[renovate[bot]](https://github.com/apps/renovate)
59
+ * [pre-commit.ci] pre-commit autoupdate (#599) @[pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci)
60
+ * ⬆️ Update release-drafter/release-drafter action to v7.4.0 (#596) @[renovate[bot]](https://github.com/apps/renovate)
61
+ * [pre-commit.ci] pre-commit autoupdate (#595) @[pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci)
62
+ * Pick best available installer for generic Python project setup (#591) @basnijholt
63
+
64
+ ]]></description>
65
+ <enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.102.0/AgentCLI.zip" length="24388215" type="application/octet-stream" sparkle:edSignature="1b3tpgDf/VolJ9MLr0R5N9gPmOkYG7Uf6ZyXQTNLPTfiMeo2malwMj5kzTFcCp7xQr/jijUB7/nRNoSzZiBnCg=="/>
66
+ </item>
7
67
  <item>
8
68
  <title>0.101.0</title>
9
69
  <pubDate>Wed, 10 Jun 2026 18:21:45 +0000</pubDate>
@@ -130,37 +190,5 @@
130
190
  ]]></description>
131
191
  <enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.98.1/AgentCLI.zip" length="22896191" type="application/octet-stream" sparkle:edSignature="4g9PD/is1i4Htq5eM2TfAUjxEaXSb7xJJDjnliSfX5TQfqeLLsItUcaCLbhpXaOKqzq0YByVg5SLSpqHK08vAw=="/>
132
192
  </item>
133
- <item>
134
- <title>0.98.0</title>
135
- <pubDate>Thu, 04 Jun 2026 16:25:34 +0000</pubDate>
136
- <link>https://github.com/basnijholt/agent-cli</link>
137
- <sparkle:version>188</sparkle:version>
138
- <sparkle:shortVersionString>0.98.0</sparkle:shortVersionString>
139
- <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
140
- <sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
141
- <description sparkle:format="markdown"><![CDATA[## What’s Changed
142
-
143
- * Document NeMo Parakeet setup (#573) @basnijholt
144
- * Add macOS transcription backend picker (#574) @basnijholt
145
- * Reference upstream NeMo validation_ds fix (#577) @basnijholt
146
-
147
- ]]></description>
148
- <enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.98.0/AgentCLI.zip" length="22891739" type="application/octet-stream" sparkle:edSignature="tC7V5Z+r9fyFe5GvISxKB2ExZJoyx8G7Qt/Zqnb1ELJcU6lm+0KSN3tx7d/BBm1Dbl8eKRiCorOATkTKE2HSCw=="/>
149
- </item>
150
- <item>
151
- <title>0.97.2</title>
152
- <pubDate>Thu, 04 Jun 2026 07:34:52 +0000</pubDate>
153
- <link>https://github.com/basnijholt/agent-cli</link>
154
- <sparkle:version>187</sparkle:version>
155
- <sparkle:shortVersionString>0.97.2</sparkle:shortVersionString>
156
- <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
157
- <sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
158
- <description sparkle:format="markdown"><![CDATA[Patch release for NeMo daemon runtime support and parakeet-unified-en-0.6b live transcription.
159
-
160
- - Propagate daemon uv path to child agent-cli process so NeMo runtime re-exec can find uv under launchd/systemd.
161
- - Normalize NeMo models with cfg.validation_ds=None before transcribe; fixes parakeet-unified-en-0.6b crash in NeMo RNNT transcribe.
162
- ]]></description>
163
- <enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.97.2/AgentCLI.zip" length="22876496" type="application/octet-stream" sparkle:edSignature="72nAmUfSh/gUt4O4phVrYV+RvfsrhxzQzMlx67Q8dAwD3LXzRNwUyeop6KKaUqasT2QXVHnh8k1grjGDoOTyAA=="/>
164
- </item>
165
193
  </channel>
166
194
  </rss>
@@ -60,6 +60,10 @@ faster-whisper = ["agent-cli[server]", "faster-whisper>=1.0.0", "ctranslate2>=4.
60
60
  mlx-whisper = [
61
61
  "agent-cli[server]; sys_platform == 'darwin' and platform_machine == 'arm64'",
62
62
  "mlx-whisper>=0.4.0; sys_platform == 'darwin' and platform_machine == 'arm64'",
63
+ # mlx-whisper only requires mlx>=0.11, but the MLX backend calls the
64
+ # top-level mx.clear_cache(), which does not exist before mlx 0.24
65
+ # (0.23.2 and older only expose the deprecated mx.metal.clear_cache).
66
+ "mlx>=0.24; sys_platform == 'darwin' and platform_machine == 'arm64'",
63
67
  ]
64
68
  whisper-transformers = ["agent-cli[server]", "transformers>=4.30.0", "torch>=2.0.0"]
65
69
  nemo-whisper = [