agent-cli 0.106.0__tar.gz → 0.107.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 (459) hide show
  1. {agent_cli-0.106.0 → agent_cli-0.107.0}/PKG-INFO +1 -1
  2. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +3 -1
  3. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +2 -1
  4. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +104 -9
  5. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +13 -0
  6. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/VoiceLevelMeterTests.swift +92 -0
  7. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/appcast.xml +27 -33
  8. {agent_cli-0.106.0 → agent_cli-0.107.0}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  9. {agent_cli-0.106.0 → agent_cli-0.107.0}/.claude/skills/agent-cli-dev/examples.md +0 -0
  10. {agent_cli-0.106.0 → agent_cli-0.107.0}/.claude-plugin/README.md +0 -0
  11. {agent_cli-0.106.0 → agent_cli-0.107.0}/.claude-plugin/marketplace.json +0 -0
  12. {agent_cli-0.106.0 → agent_cli-0.107.0}/.claude-plugin/plugin.json +0 -0
  13. {agent_cli-0.106.0 → agent_cli-0.107.0}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  14. {agent_cli-0.106.0 → agent_cli-0.107.0}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  15. {agent_cli-0.106.0 → agent_cli-0.107.0}/.cursorrules +0 -0
  16. {agent_cli-0.106.0 → agent_cli-0.107.0}/.dockerignore +0 -0
  17. {agent_cli-0.106.0 → agent_cli-0.107.0}/.env.example +0 -0
  18. {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/logo.svg +0 -0
  19. {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/release-drafter.yml +0 -0
  20. {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/renovate.json +0 -0
  21. {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/scripts/check_extras_sync.py +0 -0
  22. {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/scripts/check_plugin_skill_sync.py +0 -0
  23. {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/scripts/normalize_appcast.py +0 -0
  24. {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/scripts/sync_extras.py +0 -0
  25. {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/scripts/sync_requirements.py +0 -0
  26. {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/workflows/automerge.yml +0 -0
  27. {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/workflows/docker.yml +0 -0
  28. {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/workflows/docs.yml +0 -0
  29. {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/workflows/markdown-code-runner.yml +0 -0
  30. {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/workflows/pytest.yml +0 -0
  31. {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/workflows/release-drafter.yml +0 -0
  32. {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/workflows/release.yml +0 -0
  33. {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/workflows/toc.yaml +0 -0
  34. {agent_cli-0.106.0 → agent_cli-0.107.0}/.gitignore +0 -0
  35. {agent_cli-0.106.0 → agent_cli-0.107.0}/.jscpd.json +0 -0
  36. {agent_cli-0.106.0 → agent_cli-0.107.0}/.pre-commit-config.yaml +0 -0
  37. {agent_cli-0.106.0 → agent_cli-0.107.0}/.prompts/docs-review.md +0 -0
  38. {agent_cli-0.106.0 → agent_cli-0.107.0}/.prompts/pr-review.md +0 -0
  39. {agent_cli-0.106.0 → agent_cli-0.107.0}/CLAUDE.md +0 -0
  40. {agent_cli-0.106.0 → agent_cli-0.107.0}/LICENSE +0 -0
  41. {agent_cli-0.106.0 → agent_cli-0.107.0}/LLAMA_SERVER_USAGE.md +0 -0
  42. {agent_cli-0.106.0 → agent_cli-0.107.0}/README.md +0 -0
  43. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/__init__.py +0 -0
  44. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/__main__.py +0 -0
  45. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_extras.json +0 -0
  46. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_overrides/nemo-whisper.txt +0 -0
  47. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/.gitkeep +0 -0
  48. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/audio.txt +0 -0
  49. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/diarization.txt +0 -0
  50. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/faster-whisper.txt +0 -0
  51. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/kokoro.txt +0 -0
  52. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/llm.txt +0 -0
  53. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/memory.txt +0 -0
  54. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  55. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/nemo-whisper.txt +0 -0
  56. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/piper.txt +0 -0
  57. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/rag.txt +0 -0
  58. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/server.txt +0 -0
  59. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/speed.txt +0 -0
  60. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/vad.txt +0 -0
  61. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/vectordb.txt +0 -0
  62. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  63. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/wyoming.txt +0 -0
  64. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_tools.py +0 -0
  65. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/__init__.py +0 -0
  66. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/_voice_agent_common.py +0 -0
  67. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/assistant.py +0 -0
  68. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/autocorrect.py +0 -0
  69. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/chat.py +0 -0
  70. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/diarize_live_session.py +0 -0
  71. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/memory/__init__.py +0 -0
  72. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/memory/add.py +0 -0
  73. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/memory/proxy.py +0 -0
  74. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/rag_proxy.py +0 -0
  75. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/speak.py +0 -0
  76. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/speakers.py +0 -0
  77. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/transcribe.py +0 -0
  78. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/transcribe_live.py +0 -0
  79. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/voice_edit.py +0 -0
  80. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/api.py +0 -0
  81. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/cli.py +0 -0
  82. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/config.py +0 -0
  83. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/config_cmd.py +0 -0
  84. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/constants.py +0 -0
  85. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/__init__.py +0 -0
  86. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/alignment.py +0 -0
  87. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/audio.py +0 -0
  88. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/audio_format.py +0 -0
  89. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/chroma.py +0 -0
  90. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/deps.py +0 -0
  91. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/diarization.py +0 -0
  92. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/openai_proxy.py +0 -0
  93. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/process.py +0 -0
  94. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/reranker.py +0 -0
  95. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/speaker_identity.py +0 -0
  96. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/sse.py +0 -0
  97. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/transcription_logger.py +0 -0
  98. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/utils.py +0 -0
  99. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/vad.py +0 -0
  100. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/watch.py +0 -0
  101. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/daemon/__init__.py +0 -0
  102. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/daemon/cli.py +0 -0
  103. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/__init__.py +0 -0
  104. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/_branch_name.py +0 -0
  105. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/_config.py +0 -0
  106. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/_output.py +0 -0
  107. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/cleanup.py +0 -0
  108. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/cli.py +0 -0
  109. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/__init__.py +0 -0
  110. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/aider.py +0 -0
  111. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/base.py +0 -0
  112. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/claude.py +0 -0
  113. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/codex.py +0 -0
  114. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  115. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/copilot.py +0 -0
  116. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  117. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/gemini.py +0 -0
  118. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/opencode.py +0 -0
  119. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/registry.py +0 -0
  120. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/__init__.py +0 -0
  121. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/base.py +0 -0
  122. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/cursor.py +0 -0
  123. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/emacs.py +0 -0
  124. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/jetbrains.py +0 -0
  125. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/nano.py +0 -0
  126. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/neovim.py +0 -0
  127. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/registry.py +0 -0
  128. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/sublime.py +0 -0
  129. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/vim.py +0 -0
  130. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/vscode.py +0 -0
  131. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/zed.py +0 -0
  132. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/hooks.py +0 -0
  133. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/launch.py +0 -0
  134. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/project.py +0 -0
  135. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/registry.py +0 -0
  136. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/skill/SKILL.md +0 -0
  137. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/skill/examples.md +0 -0
  138. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/__init__.py +0 -0
  139. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  140. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/base.py +0 -0
  141. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/cmux.py +0 -0
  142. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/gnome.py +0 -0
  143. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/iterm2.py +0 -0
  144. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/kitty.py +0 -0
  145. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/registry.py +0 -0
  146. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/tmux.py +0 -0
  147. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/warp.py +0 -0
  148. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/zellij.py +0 -0
  149. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/worktree.py +0 -0
  150. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/docs_gen.py +0 -0
  151. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/example-config.toml +0 -0
  152. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/install/__init__.py +0 -0
  153. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/install/common.py +0 -0
  154. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/install/extras.py +0 -0
  155. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/install/hotkeys.py +0 -0
  156. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/install/launchd.py +0 -0
  157. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/install/service_config.py +0 -0
  158. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/install/services.py +0 -0
  159. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/install/systemd.py +0 -0
  160. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/__init__.py +0 -0
  161. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_files.py +0 -0
  162. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_filters.py +0 -0
  163. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_git.py +0 -0
  164. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_indexer.py +0 -0
  165. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_ingest.py +0 -0
  166. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_persistence.py +0 -0
  167. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_prompt.py +0 -0
  168. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_retrieval.py +0 -0
  169. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_store.py +0 -0
  170. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_streaming.py +0 -0
  171. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_tasks.py +0 -0
  172. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/api.py +0 -0
  173. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/client.py +0 -0
  174. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/engine.py +0 -0
  175. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/entities.py +0 -0
  176. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/models.py +0 -0
  177. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/opts.py +0 -0
  178. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/py.typed +0 -0
  179. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/__init__.py +0 -0
  180. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/_indexer.py +0 -0
  181. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/_indexing.py +0 -0
  182. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/_prompt.py +0 -0
  183. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/_retriever.py +0 -0
  184. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/_store.py +0 -0
  185. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/_utils.py +0 -0
  186. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/api.py +0 -0
  187. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/client.py +0 -0
  188. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/engine.py +0 -0
  189. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/models.py +0 -0
  190. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  191. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/__init__.py +0 -0
  192. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  193. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  194. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  195. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  196. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  197. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  198. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  199. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  200. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  201. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  202. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  203. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  204. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  205. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  206. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/run-openwakeword.sh +0 -0
  207. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  208. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/setup-linux.sh +0 -0
  209. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  210. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/setup-macos.sh +0 -0
  211. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/setup-windows.ps1 +0 -0
  212. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  213. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/start-all-services.sh +0 -0
  214. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/__init__.py +0 -0
  215. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/cli.py +0 -0
  216. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/common.py +0 -0
  217. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/model_manager.py +0 -0
  218. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/model_registry.py +0 -0
  219. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/proxy/__init__.py +0 -0
  220. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/proxy/api.py +0 -0
  221. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/proxy/diarization.py +0 -0
  222. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/streaming.py +0 -0
  223. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/tts/__init__.py +0 -0
  224. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/tts/api.py +0 -0
  225. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/tts/backends/__init__.py +0 -0
  226. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/tts/backends/base.py +0 -0
  227. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/tts/backends/kokoro.py +0 -0
  228. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/tts/backends/piper.py +0 -0
  229. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/tts/model_manager.py +0 -0
  230. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/tts/model_registry.py +0 -0
  231. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/tts/wyoming_handler.py +0 -0
  232. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/__init__.py +0 -0
  233. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/api.py +0 -0
  234. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/backends/__init__.py +0 -0
  235. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/backends/audio.py +0 -0
  236. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/backends/base.py +0 -0
  237. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  238. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/backends/mlx.py +0 -0
  239. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/backends/nemo.py +0 -0
  240. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/backends/transformers.py +0 -0
  241. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/languages.py +0 -0
  242. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/model_manager.py +0 -0
  243. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/model_registry.py +0 -0
  244. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  245. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/services/__init__.py +0 -0
  246. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/services/_wyoming_utils.py +0 -0
  247. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/services/asr.py +0 -0
  248. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/services/llm.py +0 -0
  249. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/services/tts.py +0 -0
  250. {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/services/wake_word.py +0 -0
  251. {agent_cli-0.106.0 → agent_cli-0.107.0}/docker/diarization.Dockerfile +0 -0
  252. {agent_cli-0.106.0 → agent_cli-0.107.0}/docker/docker-compose.yml +0 -0
  253. {agent_cli-0.106.0 → agent_cli-0.107.0}/docker/memory-proxy.Dockerfile +0 -0
  254. {agent_cli-0.106.0 → agent_cli-0.107.0}/docker/rag-proxy.Dockerfile +0 -0
  255. {agent_cli-0.106.0 → agent_cli-0.107.0}/docker/transcribe-proxy.Dockerfile +0 -0
  256. {agent_cli-0.106.0 → agent_cli-0.107.0}/docker/tts.Dockerfile +0 -0
  257. {agent_cli-0.106.0 → agent_cli-0.107.0}/docker/whisper.Dockerfile +0 -0
  258. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/CNAME +0 -0
  259. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/architecture/index.md +0 -0
  260. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/architecture/memory.md +0 -0
  261. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/architecture/rag.md +0 -0
  262. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/assistant.md +0 -0
  263. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/autocorrect.md +0 -0
  264. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/chat.md +0 -0
  265. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/config.md +0 -0
  266. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/daemon.md +0 -0
  267. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/dev.md +0 -0
  268. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/diarize-live-session.md +0 -0
  269. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/index.md +0 -0
  270. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/install-extras.md +0 -0
  271. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/install-hotkeys.md +0 -0
  272. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/install-services.md +0 -0
  273. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/memory.md +0 -0
  274. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/rag-proxy.md +0 -0
  275. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/server/index.md +0 -0
  276. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/server/transcribe-proxy.md +0 -0
  277. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/server/tts.md +0 -0
  278. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/server/whisper.md +0 -0
  279. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/speak.md +0 -0
  280. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/speakers.md +0 -0
  281. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/start-services.md +0 -0
  282. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/transcribe-live.md +0 -0
  283. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/transcribe.md +0 -0
  284. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/voice-edit.md +0 -0
  285. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/configuration.md +0 -0
  286. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/getting-started.md +0 -0
  287. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/iOS_Shortcut_Guide.md +0 -0
  288. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/index.md +0 -0
  289. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/installation/docker.md +0 -0
  290. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/installation/index.md +0 -0
  291. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/installation/linux.md +0 -0
  292. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/installation/macos-app.md +0 -0
  293. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/installation/macos.md +0 -0
  294. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/installation/nixos.md +0 -0
  295. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/installation/windows.md +0 -0
  296. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/logo-avatar.svg +0 -0
  297. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/logo-clean.svg +0 -0
  298. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  299. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/run_markdown_code_runner.py +0 -0
  300. {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/system-integration.md +0 -0
  301. {agent_cli-0.106.0 → agent_cli-0.107.0}/example.agent-cli-config.toml +0 -0
  302. {agent_cli-0.106.0 → agent_cli-0.107.0}/justfile +0 -0
  303. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Package.resolved +0 -0
  304. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Package.swift +0 -0
  305. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/README.md +0 -0
  306. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
  307. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Resources/Info.plist +0 -0
  308. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
  309. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
  310. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
  311. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +0 -0
  312. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
  313. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
  314. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
  315. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
  316. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
  317. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
  318. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
  319. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/LiveTranscriptionPreview.swift +0 -0
  320. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
  321. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatus.swift +0 -0
  322. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatusRow.swift +0 -0
  323. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/MenuActivityTracker.swift +0 -0
  324. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
  325. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
  326. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
  327. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
  328. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +0 -0
  329. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +0 -0
  330. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +0 -0
  331. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
  332. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
  333. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +0 -0
  334. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/ConfigurableHotkeyControllerTests.swift +0 -0
  335. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/LivePreviewSwiftTestingTests.swift +0 -0
  336. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/LiveTranscriptionPreviewTests.swift +0 -0
  337. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
  338. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
  339. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
  340. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/TranscriptionResultTests.swift +0 -0
  341. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/build-macos-app.sh +0 -0
  342. {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/test-macos-app-e2e.sh +0 -0
  343. {agent_cli-0.106.0 → agent_cli-0.107.0}/pyproject.toml +0 -0
  344. {agent_cli-0.106.0 → agent_cli-0.107.0}/reddit.md +0 -0
  345. {agent_cli-0.106.0 → agent_cli-0.107.0}/shell.nix +0 -0
  346. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/__init__.py +0 -0
  347. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/__init__.py +0 -0
  348. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_fix_my_text.py +0 -0
  349. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_interactive.py +0 -0
  350. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_interactive_extra.py +0 -0
  351. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_memory_add.py +0 -0
  352. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_speak.py +0 -0
  353. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_speak_e2e.py +0 -0
  354. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_speakers.py +0 -0
  355. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_transcribe.py +0 -0
  356. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_transcribe_agent.py +0 -0
  357. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_transcribe_e2e.py +0 -0
  358. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_transcribe_live.py +0 -0
  359. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_transcribe_recovery.py +0 -0
  360. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_tts_common.py +0 -0
  361. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_tts_common_extra.py +0 -0
  362. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_voice_agent_common.py +0 -0
  363. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_voice_edit.py +0 -0
  364. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_voice_edit_e2e.py +0 -0
  365. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_wake_word_assistant.py +0 -0
  366. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/conftest.py +0 -0
  367. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/core/__init__.py +0 -0
  368. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/core/test_audio.py +0 -0
  369. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/core/test_audio_format.py +0 -0
  370. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/core/test_audio_levels.py +0 -0
  371. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/core/test_chroma.py +0 -0
  372. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/core/test_sse.py +0 -0
  373. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/core/test_vad.py +0 -0
  374. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/core/test_watch.py +0 -0
  375. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/__init__.py +0 -0
  376. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_cleanup.py +0 -0
  377. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_cli.py +0 -0
  378. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_coding_agents.py +0 -0
  379. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_editors.py +0 -0
  380. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_hooks.py +0 -0
  381. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_launch.py +0 -0
  382. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_project.py +0 -0
  383. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_terminals.py +0 -0
  384. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_verification.py +0 -0
  385. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_worktree.py +0 -0
  386. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/install/__init__.py +0 -0
  387. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/install/test_extras.py +0 -0
  388. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/install/test_launchd.py +0 -0
  389. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/__init__.py +0 -0
  390. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_api_health.py +0 -0
  391. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_api_integration_liveish.py +0 -0
  392. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_client.py +0 -0
  393. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_engine.py +0 -0
  394. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_files.py +0 -0
  395. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_filters.py +0 -0
  396. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_git_integration.py +0 -0
  397. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_indexer.py +0 -0
  398. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_memory_integration.py +0 -0
  399. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_proxy_passthrough.py +0 -0
  400. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_store.py +0 -0
  401. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_utils.py +0 -0
  402. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/mocks/__init__.py +0 -0
  403. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/mocks/audio.py +0 -0
  404. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/mocks/llm.py +0 -0
  405. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/mocks/wyoming.py +0 -0
  406. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/__init__.py +0 -0
  407. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_api.py +0 -0
  408. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_engine.py +0 -0
  409. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_history.py +0 -0
  410. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_indexer.py +0 -0
  411. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_indexing.py +0 -0
  412. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_rag_client.py +0 -0
  413. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_rag_integration_liveish.py +0 -0
  414. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  415. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_retriever.py +0 -0
  416. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_store.py +0 -0
  417. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_utils.py +0 -0
  418. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_alignment.py +0 -0
  419. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_api.py +0 -0
  420. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_api_integration.py +0 -0
  421. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_asr.py +0 -0
  422. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_asr_recovery.py +0 -0
  423. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_audio_e2e.py +0 -0
  424. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_cli.py +0 -0
  425. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_config.py +0 -0
  426. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_config_cmd.py +0 -0
  427. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_daemon.py +0 -0
  428. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_diarization.py +0 -0
  429. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_diarize_live_session.py +0 -0
  430. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_docs_gen.py +0 -0
  431. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_env_vars.py +0 -0
  432. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_faster_whisper_backend.py +0 -0
  433. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_json_output.py +0 -0
  434. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_llm.py +0 -0
  435. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_llm_gemini.py +0 -0
  436. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_macos_app.py +0 -0
  437. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_memory_tools.py +0 -0
  438. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_mlx_backend.py +0 -0
  439. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_nemo_backend.py +0 -0
  440. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_normalize_appcast.py +0 -0
  441. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_process_manager.py +0 -0
  442. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_proxy_diarization.py +0 -0
  443. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_requires_extras.py +0 -0
  444. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_server_streaming.py +0 -0
  445. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_server_tts.py +0 -0
  446. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_server_tts_wyoming.py +0 -0
  447. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_server_whisper.py +0 -0
  448. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_server_whisper_wyoming.py +0 -0
  449. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_services.py +0 -0
  450. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_speaker_identity.py +0 -0
  451. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_tools.py +0 -0
  452. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_transformers_backend.py +0 -0
  453. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_tts.py +0 -0
  454. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_utils.py +0 -0
  455. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_wake_word.py +0 -0
  456. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_whisper_backend_audio.py +0 -0
  457. {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_wyoming_utils.py +0 -0
  458. {agent_cli-0.106.0 → agent_cli-0.107.0}/uv.lock +0 -0
  459. {agent_cli-0.106.0 → agent_cli-0.107.0}/zensical.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: agent-cli
3
- Version: 0.106.0
3
+ Version: 0.107.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>
@@ -161,13 +161,13 @@ final class AgentCommandRunner: ObservableObject {
161
161
  holdTranscriptionState = .stopping
162
162
 
163
163
  let wasRecording = recordingIndicator.isRecordingCommand(.toggleTranscription)
164
- beginTranscribingActivity()
165
164
  if wasRecording {
166
165
  endRecordingIndicator(for: .toggleTranscription)
167
166
  statusMessage = "Transcribing..."
168
167
  } else {
169
168
  statusMessage = "Stopping transcription as soon as it starts..."
170
169
  }
170
+ beginTranscribingActivity()
171
171
  stopHeldTranscriptionWhenReady()
172
172
  }
173
173
 
@@ -386,11 +386,13 @@ final class AgentCommandRunner: ObservableObject {
386
386
 
387
387
  private func beginTranscribingActivity() {
388
388
  activityTracker.beginTranscribing()
389
+ VoiceLevelOverlayController.shared.showTranscribing()
389
390
  }
390
391
 
391
392
  private func clearTranscribingActivityIfFinished() {
392
393
  if pendingStopRecordingCommands.isEmpty && !holdTranscriptionState.isFinishing {
393
394
  activityTracker.finishTranscribing()
395
+ VoiceLevelOverlayController.shared.finishTranscribing()
394
396
  }
395
397
  }
396
398
 
@@ -38,6 +38,7 @@ final class RecordingIndicatorController {
38
38
  }
39
39
 
40
40
  func end(for command: AgentCommand) {
41
+ guard isRecordingCommand(command) else { return }
41
42
  let wasRecording = isRecording
42
43
  let activeCommandCount = max(0, activeRecordingCommands[command.identifier, default: 0] - 1)
43
44
  if activeCommandCount > 0 {
@@ -48,7 +49,7 @@ final class RecordingIndicatorController {
48
49
  recordingCommandCount = max(0, recordingCommandCount - 1)
49
50
  if wasRecording && !isRecording {
50
51
  play(.finishedRecording)
51
- VoiceLevelOverlayController.shared.hide()
52
+ VoiceLevelOverlayController.shared.endRecording()
52
53
  }
53
54
  if command.supportsLivePreviewOverlay {
54
55
  LiveTranscriptionPreview.shared.stop()
@@ -75,7 +75,9 @@ struct VoiceLevelOverlayView: View {
75
75
  .accessibilityElement(children: .ignore)
76
76
  .accessibilityLabel(Text(meter.captureState == .recording
77
77
  ? "Recording \(meter.recordingDuration)"
78
- : meter.captureState.label))
78
+ : meter.captureState == .transcribing
79
+ ? "Transcribing \(meter.transcribingDuration)"
80
+ : meter.captureState.label))
79
81
  .accessibilityValue(Text(showsPreviewSpace ? preview.text : ""))
80
82
  }
81
83
 
@@ -85,15 +87,23 @@ struct VoiceLevelOverlayView: View {
85
87
  Text(meter.recordingDuration)
86
88
  .font(.system(size: 12, weight: .semibold))
87
89
  .monospacedDigit()
90
+ .fixedSize()
88
91
  waveform
89
92
  } else {
90
93
  ProgressView()
91
94
  .controlSize(.small)
92
95
  Text(meter.captureState.label)
93
96
  .font(.system(size: 12, weight: .semibold))
97
+ if meter.captureState == .transcribing {
98
+ Text(meter.transcribingDuration)
99
+ .font(.system(size: 12, weight: .semibold))
100
+ .monospacedDigit()
101
+ .fixedSize()
102
+ }
94
103
  }
95
104
  }
96
105
  .foregroundStyle(statusColor)
106
+ .padding(.horizontal, 14)
97
107
  .frame(width: VoiceLevelOverlayLayout.pillSize.width, height: VoiceLevelOverlayLayout.pillSize.height)
98
108
  .background(Capsule().fill(statusColor.opacity(isLightMode ? 0.10 : 0.14)))
99
109
  .background(Capsule().fill(backgroundColor))
@@ -119,10 +129,12 @@ struct VoiceLevelOverlayView: View {
119
129
  endPoint: .top
120
130
  )
121
131
  )
122
- .frame(width: 2, height: max(5, 25 * amplitude))
132
+ .frame(maxWidth: .infinity)
133
+ .frame(height: max(6, 30 * amplitude))
123
134
  .animation(.easeOut(duration: 0.11), value: amplitude)
124
135
  }
125
136
  }
137
+ .frame(maxWidth: .infinity)
126
138
  }
127
139
 
128
140
  private var isLightMode: Bool {
@@ -150,6 +162,11 @@ struct VoiceLevelOverlayView: View {
150
162
  }
151
163
 
152
164
  private var statusColor: Color {
165
+ if meter.captureState == .transcribing {
166
+ return isLightMode
167
+ ? Color(red: 0.10, green: 0.32, blue: 0.70)
168
+ : Color(red: 0.45, green: 0.72, blue: 1.0)
169
+ }
153
170
  if meter.captureState == .recording {
154
171
  return isLightMode
155
172
  ? Color(red: 0.04, green: 0.40, blue: 0.18)
@@ -166,27 +183,63 @@ final class VoiceLevelOverlayController {
166
183
 
167
184
  private var panel: NSPanel?
168
185
  private var showsPreviewSpace = false
186
+ private var recordingShowsPreviewSpace = false
187
+ private var isRecording = false
188
+ private var isTranscribing = false
169
189
 
170
190
  private init() {}
171
191
 
172
192
  func show(showsPreviewSpace: Bool = false) {
193
+ isRecording = true
194
+ recordingShowsPreviewSpace = showsPreviewSpace
173
195
  let panel = panel ?? makePanel()
174
196
  self.panel = panel
175
- if self.showsPreviewSpace != showsPreviewSpace {
176
- self.showsPreviewSpace = showsPreviewSpace
177
- updatePanelContent(panel)
178
- }
179
- panel.setContentSize(VoiceLevelOverlayLayout.panelSize(showsPreviewSpace: showsPreviewSpace))
180
- position(panel)
197
+ setPreviewSpace(showsPreviewSpace, for: panel)
181
198
  VoiceLevelMeter.shared.start()
182
199
  panel.orderFrontRegardless()
183
200
  }
184
201
 
185
202
  func hide() {
203
+ isRecording = false
204
+ isTranscribing = false
186
205
  VoiceLevelMeter.shared.stop()
187
206
  panel?.orderOut(nil)
188
207
  }
189
208
 
209
+ func showTranscribing() {
210
+ isTranscribing = true
211
+ let panel = panel ?? makePanel()
212
+ self.panel = panel
213
+ VoiceLevelMeter.shared.beginTranscribing()
214
+ setPreviewSpace(false, for: panel)
215
+ panel.orderFrontRegardless()
216
+ }
217
+
218
+ func finishTranscribing() {
219
+ guard isTranscribing else { return }
220
+ isTranscribing = false
221
+ if isRecording {
222
+ if let panel {
223
+ setPreviewSpace(recordingShowsPreviewSpace, for: panel)
224
+ }
225
+ VoiceLevelMeter.shared.resumeRecording()
226
+ } else {
227
+ hide()
228
+ }
229
+ }
230
+
231
+ func endRecording() {
232
+ isRecording = false
233
+ if isTranscribing {
234
+ VoiceLevelMeter.shared.beginTranscribing()
235
+ if let panel {
236
+ setPreviewSpace(false, for: panel)
237
+ }
238
+ } else {
239
+ hide()
240
+ }
241
+ }
242
+
190
243
  private func makePanel() -> NSPanel {
191
244
  let panel = NSPanel(
192
245
  contentRect: NSRect(
@@ -208,6 +261,15 @@ final class VoiceLevelOverlayController {
208
261
  return panel
209
262
  }
210
263
 
264
+ private func setPreviewSpace(_ showsPreviewSpace: Bool, for panel: NSPanel) {
265
+ if self.showsPreviewSpace != showsPreviewSpace {
266
+ self.showsPreviewSpace = showsPreviewSpace
267
+ updatePanelContent(panel)
268
+ }
269
+ panel.setContentSize(VoiceLevelOverlayLayout.panelSize(showsPreviewSpace: showsPreviewSpace))
270
+ position(panel)
271
+ }
272
+
211
273
  private func updatePanelContent(_ panel: NSPanel) {
212
274
  panel.contentView = NSHostingView(rootView: VoiceLevelOverlayView(
213
275
  meter: VoiceLevelMeter.shared,
@@ -330,6 +392,7 @@ enum VoiceCaptureState {
330
392
  case connecting
331
393
  case recording
332
394
  case waitingForAudio
395
+ case transcribing
333
396
 
334
397
  var label: String {
335
398
  switch self {
@@ -337,6 +400,7 @@ enum VoiceCaptureState {
337
400
  case .connecting: return "Connecting…"
338
401
  case .recording: return "Recording"
339
402
  case .waitingForAudio: return "Waiting for audio…"
403
+ case .transcribing: return "Transcribing…"
340
404
  }
341
405
  }
342
406
  }
@@ -347,6 +411,7 @@ final class VoiceLevelMeter: ObservableObject {
347
411
  @Published private(set) var amplitudes = VoiceLevelMeter.idleAmplitudes
348
412
  @Published private(set) var captureState = VoiceCaptureState.idle
349
413
  @Published private(set) var recordingDuration = "00:00"
414
+ @Published private(set) var transcribingDuration = "00:00"
350
415
 
351
416
  private static let barCount = 16
352
417
  private static let idleAmplitudes = Array(repeating: CGFloat(0.16), count: barCount)
@@ -357,6 +422,7 @@ final class VoiceLevelMeter: ObservableObject {
357
422
  private let now: () -> Date
358
423
  private var timer: Timer?
359
424
  private var recordingStartedAt: Date?
425
+ private var transcribingStartedAt: Date?
360
426
  private var phase = 0.0
361
427
  private var smoothedLevel = CGFloat(0.16)
362
428
 
@@ -366,15 +432,21 @@ final class VoiceLevelMeter: ObservableObject {
366
432
  }
367
433
 
368
434
  func start() {
369
- guard timer == nil else { return }
435
+ guard timer == nil || captureState == .transcribing else { return }
370
436
  VoiceLevelLog.reset(levelLogURL)
371
437
  captureState = .connecting
372
438
  recordingStartedAt = nil
373
439
  recordingDuration = "00:00"
440
+ transcribingStartedAt = nil
441
+ transcribingDuration = "00:00"
374
442
  phase = 0
375
443
  smoothedLevel = Self.idleLevel
376
444
  amplitudes = Self.idleAmplitudes
445
+ startPolling()
446
+ }
377
447
 
448
+ private func startPolling() {
449
+ timer?.invalidate()
378
450
  let timer = Timer(timeInterval: Self.pollInterval, repeats: true) { [weak self] _ in
379
451
  self?.pollLevel()
380
452
  }
@@ -383,10 +455,19 @@ final class VoiceLevelMeter: ObservableObject {
383
455
  pollLevel()
384
456
  }
385
457
 
458
+ func resumeRecording() {
459
+ guard captureState == .transcribing else { return }
460
+ transcribingStartedAt = nil
461
+ captureState = recordingStartedAt == nil ? .connecting : .waitingForAudio
462
+ startPolling()
463
+ }
464
+
386
465
  func stop() {
387
466
  timer?.invalidate()
388
467
  timer = nil
389
468
  captureState = .idle
469
+ transcribingStartedAt = nil
470
+ transcribingDuration = "00:00"
390
471
  recordingStartedAt = nil
391
472
  recordingDuration = "00:00"
392
473
  phase = 0
@@ -394,9 +475,23 @@ final class VoiceLevelMeter: ObservableObject {
394
475
  amplitudes = Self.idleAmplitudes
395
476
  }
396
477
 
478
+ func beginTranscribing() {
479
+ guard captureState != .transcribing else { return }
480
+ transcribingStartedAt = now()
481
+ transcribingDuration = "00:00"
482
+ captureState = .transcribing
483
+ amplitudes = Self.idleAmplitudes
484
+ startPolling()
485
+ }
486
+
397
487
  func pollLevel() {
398
488
  guard timer != nil else { return }
399
489
  let now = now()
490
+ if captureState == .transcribing {
491
+ let elapsed = max(0, Int(now.timeIntervalSince(transcribingStartedAt ?? now)))
492
+ transcribingDuration = String(format: "%02d:%02d", elapsed / 60, elapsed % 60)
493
+ return
494
+ }
400
495
  guard let level = VoiceLevelLog.latestLevel(from: levelLogURL, now: now) else {
401
496
  if captureState == .recording {
402
497
  captureState = .waitingForAudio
@@ -4,6 +4,19 @@ import XCTest
4
4
  @testable import AgentCLI
5
5
 
6
6
  final class RecordingIndicatorControllerTests: XCTestCase {
7
+ func testRepeatedEndDoesNotStopAnotherRecording() {
8
+ let defaults = UserDefaults(suiteName: "AgentCLITests.recording-repeated-end")!
9
+ defaults.removePersistentDomain(forName: "AgentCLITests.recording-repeated-end")
10
+ let controller = RecordingIndicatorController(defaults: defaults, audioCuePlayer: RecordingCuePlayerSpy())
11
+ defer { controller.end(for: .voiceEdit) }
12
+ controller.begin(for: .toggleTranscription)
13
+ controller.begin(for: .voiceEdit)
14
+ controller.end(for: .toggleTranscription)
15
+ controller.end(for: .toggleTranscription)
16
+ XCTAssertTrue(controller.isRecording)
17
+ XCTAssertTrue(controller.isRecordingCommand(.voiceEdit))
18
+ }
19
+
7
20
  func testRecordingSoundsAreDisabledByDefault() {
8
21
  let defaults = UserDefaults(suiteName: "AgentCLITests.recording-sounds-default")!
9
22
  defaults.removePersistentDomain(forName: "AgentCLITests.recording-sounds-default")
@@ -1,9 +1,101 @@
1
1
  #if canImport(XCTest)
2
2
  import Foundation
3
+ import AppKit
4
+ import SwiftUI
3
5
  import XCTest
4
6
  @testable import AgentCLI
5
7
 
6
8
  final class VoiceLevelMeterTests: XCTestCase {
9
+ func testTranscribingCompactsPreviewAndFailedStopRestoresIt() throws {
10
+ let overlay = VoiceLevelOverlayController.shared
11
+ defer { overlay.hide() }
12
+ overlay.show(showsPreviewSpace: true)
13
+ let panel = try XCTUnwrap(NSApplication.shared.windows.first {
14
+ $0.contentView is NSHostingView<VoiceLevelOverlayView>
15
+ })
16
+ XCTAssertEqual(panel.frame.width, 446)
17
+ overlay.showTranscribing()
18
+ XCTAssertEqual(panel.frame.width, 216)
19
+ overlay.finishTranscribing()
20
+ XCTAssertEqual(panel.frame.width, 446)
21
+ }
22
+
23
+ func testTranscriptionTimerStartsAtReleaseAndResetsForNextRequest() {
24
+ let logURL = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
25
+ var now = Date()
26
+ let meter = VoiceLevelMeter(levelLogURL: logURL, now: { now })
27
+ defer {
28
+ meter.stop()
29
+ try? FileManager.default.removeItem(at: logURL)
30
+ }
31
+ meter.start()
32
+ now = now.addingTimeInterval(20)
33
+ meter.beginTranscribing()
34
+ XCTAssertEqual(meter.transcribingDuration, "00:00")
35
+ now = now.addingTimeInterval(65)
36
+ meter.pollLevel()
37
+ XCTAssertEqual(meter.transcribingDuration, "01:05")
38
+ meter.beginTranscribing()
39
+ XCTAssertEqual(meter.transcribingDuration, "01:05", "Repeated transitions must not reset elapsed time.")
40
+ meter.stop()
41
+ meter.beginTranscribing()
42
+ XCTAssertEqual(meter.transcribingDuration, "00:00")
43
+ }
44
+
45
+ func testEndingRecordingKeepsPendingTranscriptionVisible() {
46
+ let overlay = VoiceLevelOverlayController.shared
47
+ defer { overlay.hide() }
48
+ overlay.show()
49
+ overlay.showTranscribing()
50
+ overlay.endRecording()
51
+ XCTAssertEqual(VoiceLevelMeter.shared.captureState, .transcribing)
52
+ overlay.finishTranscribing()
53
+ XCTAssertEqual(VoiceLevelMeter.shared.captureState, .idle)
54
+ }
55
+
56
+ func testFailedStopRestoresOngoingRecording() {
57
+ let overlay = VoiceLevelOverlayController.shared
58
+ defer { overlay.hide() }
59
+ overlay.show()
60
+ overlay.showTranscribing()
61
+ overlay.finishTranscribing()
62
+ XCTAssertEqual(VoiceLevelMeter.shared.captureState, .connecting)
63
+ overlay.endRecording()
64
+ XCTAssertEqual(VoiceLevelMeter.shared.captureState, .idle)
65
+ }
66
+
67
+ func testFinishingTranscriptionDoesNotDismissANewRecording() {
68
+ let overlay = VoiceLevelOverlayController.shared
69
+ defer { overlay.hide() }
70
+ overlay.showTranscribing()
71
+ overlay.finishTranscribing()
72
+ XCTAssertEqual(VoiceLevelMeter.shared.captureState, .idle)
73
+
74
+ overlay.showTranscribing()
75
+ overlay.show()
76
+ overlay.finishTranscribing()
77
+ XCTAssertEqual(VoiceLevelMeter.shared.captureState, .connecting)
78
+ }
79
+
80
+ func testTranscribingStopsAudioPollingAndAllowsNextRecording() throws {
81
+ let logURL = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
82
+ let meter = VoiceLevelMeter(levelLogURL: logURL)
83
+ defer {
84
+ meter.stop()
85
+ try? FileManager.default.removeItem(at: logURL)
86
+ }
87
+ meter.start()
88
+ meter.beginTranscribing()
89
+ try "{\"timestamp\":\"\(Self.iso8601.string(from: Date()))\",\"level\":0.9}"
90
+ .write(to: logURL, atomically: true, encoding: .utf8)
91
+ meter.pollLevel()
92
+ XCTAssertEqual(meter.captureState, .transcribing)
93
+ meter.start()
94
+ XCTAssertEqual(meter.captureState, .connecting)
95
+ meter.stop()
96
+ XCTAssertEqual(meter.captureState, .idle)
97
+ }
98
+
7
99
  func testRecordingTimerExcludesStartupAndResetsBetweenRecordings() throws {
8
100
  let logURL = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
9
101
  var now = try XCTUnwrap(Self.iso8601.date(from: "2026-06-04T12:00:00Z"))
@@ -4,6 +4,33 @@
4
4
  <title>Agent CLI Updates</title>
5
5
  <link>https://github.com/basnijholt/agent-cli</link>
6
6
  <description>Signed Agent CLI macOS app updates.</description>
7
+ <item>
8
+ <title>0.106.0</title>
9
+ <pubDate>Mon, 21 Sep 2026 16:57:54 +0000</pubDate>
10
+ <link>https://github.com/basnijholt/agent-cli</link>
11
+ <sparkle:version>207</sparkle:version>
12
+ <sparkle:shortVersionString>0.106.0</sparkle:shortVersionString>
13
+ <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
14
+ <sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
15
+ <description sparkle:format="markdown"><![CDATA[## Features
16
+
17
+ - **Know when recording really starts.** The macOS overlay now shows an amber “Connecting…” indicator while capture starts, then a green waveform once audio arrives. If audio samples stop arriving, it switches to “Waiting for audio…”. Silence still counts as active recording. (#650)
18
+ - **See elapsed recording time.** A compact MM:SS timer sits beside the waveform. It starts with the first audio sample, excludes connection delay, and resets for each recording. (#650)
19
+
20
+ ## Fixes
21
+
22
+ - **No more false success for empty transcriptions.** Empty or whitespace-only results now produce a clear error with recovery guidance instead of “Transcription Finished” and an empty paste. The macOS check also covers older user-installed CLI versions. (#649)
23
+ - **Keep recognized speech when cleanup fails.** If LLM cleanup returns blank text, the CLI preserves the raw transcription on the clipboard and identifies cleanup as the failed step. Empty speech-recognition results leave the clipboard unchanged. (#649)
24
+
25
+ ## Maintenance
26
+
27
+ - Update Docker build actions and Codecov integration. (#645, #646, #647, #648)
28
+
29
+ **Full changelog:** https://github.com/basnijholt/agent-cli/compare/v0.105.2...v0.106.0
30
+
31
+ ]]></description>
32
+ <enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.106.0/AgentCLI.zip" length="18866625" type="application/octet-stream" sparkle:edSignature="yrWDCZXck8LWQYTTdtjMI4rk9cqUtHaxL0zHi6nJl4MZWx6pkkU3u5PqULflm3GkMPfwisscZlX6E21H2JxHAg=="/>
33
+ </item>
7
34
  <item>
8
35
  <title>0.105.2</title>
9
36
  <pubDate>Tue, 15 Sep 2026 07:58:55 +0000</pubDate>
@@ -179,38 +206,5 @@
179
206
  ]]></description>
180
207
  <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=="/>
181
208
  </item>
182
- <item>
183
- <title>0.102.0</title>
184
- <pubDate>Tue, 14 Jul 2026 05:57:01 +0000</pubDate>
185
- <link>https://github.com/basnijholt/agent-cli</link>
186
- <sparkle:version>197</sparkle:version>
187
- <sparkle:shortVersionString>0.102.0</sparkle:shortVersionString>
188
- <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
189
- <sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
190
- <description sparkle:format="markdown"><![CDATA[## What’s Changed
191
-
192
- * Fix Wyoming TTS voice selection and metadata (#613) @basnijholt
193
- * ⬆️ Update actions/checkout action to v7 (#598) @[renovate[bot]](https://github.com/apps/renovate)
194
- * ⬆️ Update sparkle-project/Sparkle to v2.9.4 (#607) @[renovate[bot]](https://github.com/apps/renovate)
195
- * [pre-commit.ci] pre-commit autoupdate (#612) @[pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci)
196
- * ⬆️ Update astral-sh/setup-uv action to v8.3.2 (#611) @[renovate[bot]](https://github.com/apps/renovate)
197
- * ⬆️ Update astral-sh/setup-uv action to v8.3.1 (#610) @[renovate[bot]](https://github.com/apps/renovate)
198
- * ⬆️ Update astral-sh/setup-uv action to v8.3.0 (#609) @[renovate[bot]](https://github.com/apps/renovate)
199
- * ⬆️ Update docker/login-action action to v4.4.0 (#608) @[renovate[bot]](https://github.com/apps/renovate)
200
- * ⬆️ Update docker/setup-buildx-action action to v4.2.0 (#606) @[renovate[bot]](https://github.com/apps/renovate)
201
- * ⬆️ Update docker/metadata-action action to v6.2.0 (#605) @[renovate[bot]](https://github.com/apps/renovate)
202
- * ⬆️ Update docker/login-action action to v4.3.0 (#604) @[renovate[bot]](https://github.com/apps/renovate)
203
- * ⬆️ Update docker/build-push-action action to v7.3.0 (#603) @[renovate[bot]](https://github.com/apps/renovate)
204
- * [pre-commit.ci] pre-commit autoupdate (#602) @[pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci)
205
- * ⬆️ Update release-drafter/release-drafter action to v7.5.1 (#601) @[renovate[bot]](https://github.com/apps/renovate)
206
- * ⬆️ Update actions/setup-python action to v6.3.0 (#600) @[renovate[bot]](https://github.com/apps/renovate)
207
- * [pre-commit.ci] pre-commit autoupdate (#599) @[pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci)
208
- * ⬆️ Update release-drafter/release-drafter action to v7.4.0 (#596) @[renovate[bot]](https://github.com/apps/renovate)
209
- * [pre-commit.ci] pre-commit autoupdate (#595) @[pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci)
210
- * Pick best available installer for generic Python project setup (#591) @basnijholt
211
-
212
- ]]></description>
213
- <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=="/>
214
- </item>
215
209
  </channel>
216
210
  </rss>
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes