agent-cli 0.106.0__tar.gz → 0.107.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. {agent_cli-0.106.0 → agent_cli-0.107.1}/.github/workflows/docker.yml +3 -3
  2. {agent_cli-0.106.0 → agent_cli-0.107.1}/.github/workflows/docs.yml +1 -1
  3. {agent_cli-0.106.0 → agent_cli-0.107.1}/.github/workflows/markdown-code-runner.yml +1 -1
  4. {agent_cli-0.106.0 → agent_cli-0.107.1}/.github/workflows/pytest.yml +1 -1
  5. {agent_cli-0.106.0 → agent_cli-0.107.1}/.github/workflows/release-drafter.yml +1 -1
  6. {agent_cli-0.106.0 → agent_cli-0.107.1}/.github/workflows/release.yml +2 -2
  7. {agent_cli-0.106.0 → agent_cli-0.107.1}/PKG-INFO +1 -1
  8. {agent_cli-0.106.0 → agent_cli-0.107.1}/docker/tts.Dockerfile +1 -1
  9. {agent_cli-0.106.0 → agent_cli-0.107.1}/docker/whisper.Dockerfile +1 -1
  10. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Package.resolved +2 -2
  11. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Package.swift +1 -1
  12. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +6 -4
  13. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +34 -3
  14. agent_cli-0.107.1/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +39 -0
  15. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +2 -1
  16. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +104 -9
  17. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +9 -0
  18. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +13 -0
  19. agent_cli-0.107.1/macos/AgentCLI/Tests/AgentCLITests/TranscriptionResultTests.swift +76 -0
  20. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Tests/AgentCLITests/VoiceLevelMeterTests.swift +92 -0
  21. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/appcast.xml +50 -60
  22. agent_cli-0.106.0/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -17
  23. agent_cli-0.106.0/macos/AgentCLI/Tests/AgentCLITests/TranscriptionResultTests.swift +0 -23
  24. {agent_cli-0.106.0 → agent_cli-0.107.1}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  25. {agent_cli-0.106.0 → agent_cli-0.107.1}/.claude/skills/agent-cli-dev/examples.md +0 -0
  26. {agent_cli-0.106.0 → agent_cli-0.107.1}/.claude-plugin/README.md +0 -0
  27. {agent_cli-0.106.0 → agent_cli-0.107.1}/.claude-plugin/marketplace.json +0 -0
  28. {agent_cli-0.106.0 → agent_cli-0.107.1}/.claude-plugin/plugin.json +0 -0
  29. {agent_cli-0.106.0 → agent_cli-0.107.1}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  30. {agent_cli-0.106.0 → agent_cli-0.107.1}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  31. {agent_cli-0.106.0 → agent_cli-0.107.1}/.cursorrules +0 -0
  32. {agent_cli-0.106.0 → agent_cli-0.107.1}/.dockerignore +0 -0
  33. {agent_cli-0.106.0 → agent_cli-0.107.1}/.env.example +0 -0
  34. {agent_cli-0.106.0 → agent_cli-0.107.1}/.github/logo.svg +0 -0
  35. {agent_cli-0.106.0 → agent_cli-0.107.1}/.github/release-drafter.yml +0 -0
  36. {agent_cli-0.106.0 → agent_cli-0.107.1}/.github/renovate.json +0 -0
  37. {agent_cli-0.106.0 → agent_cli-0.107.1}/.github/scripts/check_extras_sync.py +0 -0
  38. {agent_cli-0.106.0 → agent_cli-0.107.1}/.github/scripts/check_plugin_skill_sync.py +0 -0
  39. {agent_cli-0.106.0 → agent_cli-0.107.1}/.github/scripts/normalize_appcast.py +0 -0
  40. {agent_cli-0.106.0 → agent_cli-0.107.1}/.github/scripts/sync_extras.py +0 -0
  41. {agent_cli-0.106.0 → agent_cli-0.107.1}/.github/scripts/sync_requirements.py +0 -0
  42. {agent_cli-0.106.0 → agent_cli-0.107.1}/.github/workflows/automerge.yml +0 -0
  43. {agent_cli-0.106.0 → agent_cli-0.107.1}/.github/workflows/toc.yaml +0 -0
  44. {agent_cli-0.106.0 → agent_cli-0.107.1}/.gitignore +0 -0
  45. {agent_cli-0.106.0 → agent_cli-0.107.1}/.jscpd.json +0 -0
  46. {agent_cli-0.106.0 → agent_cli-0.107.1}/.pre-commit-config.yaml +0 -0
  47. {agent_cli-0.106.0 → agent_cli-0.107.1}/.prompts/docs-review.md +0 -0
  48. {agent_cli-0.106.0 → agent_cli-0.107.1}/.prompts/pr-review.md +0 -0
  49. {agent_cli-0.106.0 → agent_cli-0.107.1}/CLAUDE.md +0 -0
  50. {agent_cli-0.106.0 → agent_cli-0.107.1}/LICENSE +0 -0
  51. {agent_cli-0.106.0 → agent_cli-0.107.1}/LLAMA_SERVER_USAGE.md +0 -0
  52. {agent_cli-0.106.0 → agent_cli-0.107.1}/README.md +0 -0
  53. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/__init__.py +0 -0
  54. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/__main__.py +0 -0
  55. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_extras.json +0 -0
  56. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_overrides/nemo-whisper.txt +0 -0
  57. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_requirements/.gitkeep +0 -0
  58. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_requirements/audio.txt +0 -0
  59. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_requirements/diarization.txt +0 -0
  60. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_requirements/faster-whisper.txt +0 -0
  61. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_requirements/kokoro.txt +0 -0
  62. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_requirements/llm.txt +0 -0
  63. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_requirements/memory.txt +0 -0
  64. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  65. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_requirements/nemo-whisper.txt +0 -0
  66. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_requirements/piper.txt +0 -0
  67. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_requirements/rag.txt +0 -0
  68. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_requirements/server.txt +0 -0
  69. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_requirements/speed.txt +0 -0
  70. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_requirements/vad.txt +0 -0
  71. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_requirements/vectordb.txt +0 -0
  72. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  73. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_requirements/wyoming.txt +0 -0
  74. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/_tools.py +0 -0
  75. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/agents/__init__.py +0 -0
  76. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/agents/_voice_agent_common.py +0 -0
  77. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/agents/assistant.py +0 -0
  78. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/agents/autocorrect.py +0 -0
  79. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/agents/chat.py +0 -0
  80. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/agents/diarize_live_session.py +0 -0
  81. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/agents/memory/__init__.py +0 -0
  82. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/agents/memory/add.py +0 -0
  83. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/agents/memory/proxy.py +0 -0
  84. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/agents/rag_proxy.py +0 -0
  85. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/agents/speak.py +0 -0
  86. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/agents/speakers.py +0 -0
  87. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/agents/transcribe.py +0 -0
  88. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/agents/transcribe_live.py +0 -0
  89. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/agents/voice_edit.py +0 -0
  90. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/api.py +0 -0
  91. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/cli.py +0 -0
  92. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/config.py +0 -0
  93. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/config_cmd.py +0 -0
  94. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/constants.py +0 -0
  95. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/core/__init__.py +0 -0
  96. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/core/alignment.py +0 -0
  97. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/core/audio.py +0 -0
  98. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/core/audio_format.py +0 -0
  99. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/core/chroma.py +0 -0
  100. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/core/deps.py +0 -0
  101. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/core/diarization.py +0 -0
  102. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/core/openai_proxy.py +0 -0
  103. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/core/process.py +0 -0
  104. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/core/reranker.py +0 -0
  105. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/core/speaker_identity.py +0 -0
  106. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/core/sse.py +0 -0
  107. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/core/transcription_logger.py +0 -0
  108. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/core/utils.py +0 -0
  109. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/core/vad.py +0 -0
  110. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/core/watch.py +0 -0
  111. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/daemon/__init__.py +0 -0
  112. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/daemon/cli.py +0 -0
  113. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/__init__.py +0 -0
  114. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/_branch_name.py +0 -0
  115. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/_config.py +0 -0
  116. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/_output.py +0 -0
  117. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/cleanup.py +0 -0
  118. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/cli.py +0 -0
  119. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/coding_agents/__init__.py +0 -0
  120. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/coding_agents/aider.py +0 -0
  121. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/coding_agents/base.py +0 -0
  122. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/coding_agents/claude.py +0 -0
  123. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/coding_agents/codex.py +0 -0
  124. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  125. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/coding_agents/copilot.py +0 -0
  126. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  127. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/coding_agents/gemini.py +0 -0
  128. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/coding_agents/opencode.py +0 -0
  129. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/coding_agents/registry.py +0 -0
  130. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/editors/__init__.py +0 -0
  131. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/editors/base.py +0 -0
  132. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/editors/cursor.py +0 -0
  133. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/editors/emacs.py +0 -0
  134. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/editors/jetbrains.py +0 -0
  135. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/editors/nano.py +0 -0
  136. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/editors/neovim.py +0 -0
  137. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/editors/registry.py +0 -0
  138. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/editors/sublime.py +0 -0
  139. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/editors/vim.py +0 -0
  140. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/editors/vscode.py +0 -0
  141. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/editors/zed.py +0 -0
  142. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/hooks.py +0 -0
  143. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/launch.py +0 -0
  144. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/project.py +0 -0
  145. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/registry.py +0 -0
  146. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/skill/SKILL.md +0 -0
  147. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/skill/examples.md +0 -0
  148. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/terminals/__init__.py +0 -0
  149. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  150. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/terminals/base.py +0 -0
  151. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/terminals/cmux.py +0 -0
  152. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/terminals/gnome.py +0 -0
  153. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/terminals/iterm2.py +0 -0
  154. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/terminals/kitty.py +0 -0
  155. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/terminals/registry.py +0 -0
  156. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/terminals/tmux.py +0 -0
  157. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/terminals/warp.py +0 -0
  158. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/terminals/zellij.py +0 -0
  159. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/dev/worktree.py +0 -0
  160. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/docs_gen.py +0 -0
  161. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/example-config.toml +0 -0
  162. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/install/__init__.py +0 -0
  163. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/install/common.py +0 -0
  164. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/install/extras.py +0 -0
  165. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/install/hotkeys.py +0 -0
  166. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/install/launchd.py +0 -0
  167. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/install/service_config.py +0 -0
  168. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/install/services.py +0 -0
  169. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/install/systemd.py +0 -0
  170. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/memory/__init__.py +0 -0
  171. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/memory/_files.py +0 -0
  172. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/memory/_filters.py +0 -0
  173. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/memory/_git.py +0 -0
  174. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/memory/_indexer.py +0 -0
  175. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/memory/_ingest.py +0 -0
  176. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/memory/_persistence.py +0 -0
  177. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/memory/_prompt.py +0 -0
  178. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/memory/_retrieval.py +0 -0
  179. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/memory/_store.py +0 -0
  180. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/memory/_streaming.py +0 -0
  181. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/memory/_tasks.py +0 -0
  182. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/memory/api.py +0 -0
  183. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/memory/client.py +0 -0
  184. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/memory/engine.py +0 -0
  185. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/memory/entities.py +0 -0
  186. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/memory/models.py +0 -0
  187. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/opts.py +0 -0
  188. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/py.typed +0 -0
  189. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/rag/__init__.py +0 -0
  190. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/rag/_indexer.py +0 -0
  191. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/rag/_indexing.py +0 -0
  192. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/rag/_prompt.py +0 -0
  193. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/rag/_retriever.py +0 -0
  194. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/rag/_store.py +0 -0
  195. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/rag/_utils.py +0 -0
  196. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/rag/api.py +0 -0
  197. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/rag/client.py +0 -0
  198. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/rag/engine.py +0 -0
  199. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/rag/models.py +0 -0
  200. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  201. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/__init__.py +0 -0
  202. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  203. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  204. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  205. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  206. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  207. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  208. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  209. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  210. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  211. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  212. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  213. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  214. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  215. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  216. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/run-openwakeword.sh +0 -0
  217. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  218. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/setup-linux.sh +0 -0
  219. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  220. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/setup-macos.sh +0 -0
  221. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/setup-windows.ps1 +0 -0
  222. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  223. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/scripts/start-all-services.sh +0 -0
  224. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/__init__.py +0 -0
  225. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/cli.py +0 -0
  226. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/common.py +0 -0
  227. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/model_manager.py +0 -0
  228. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/model_registry.py +0 -0
  229. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/proxy/__init__.py +0 -0
  230. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/proxy/api.py +0 -0
  231. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/proxy/diarization.py +0 -0
  232. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/streaming.py +0 -0
  233. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/tts/__init__.py +0 -0
  234. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/tts/api.py +0 -0
  235. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/tts/backends/__init__.py +0 -0
  236. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/tts/backends/base.py +0 -0
  237. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/tts/backends/kokoro.py +0 -0
  238. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/tts/backends/piper.py +0 -0
  239. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/tts/model_manager.py +0 -0
  240. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/tts/model_registry.py +0 -0
  241. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/tts/wyoming_handler.py +0 -0
  242. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/whisper/__init__.py +0 -0
  243. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/whisper/api.py +0 -0
  244. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/whisper/backends/__init__.py +0 -0
  245. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/whisper/backends/audio.py +0 -0
  246. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/whisper/backends/base.py +0 -0
  247. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  248. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/whisper/backends/mlx.py +0 -0
  249. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/whisper/backends/nemo.py +0 -0
  250. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/whisper/backends/transformers.py +0 -0
  251. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/whisper/languages.py +0 -0
  252. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/whisper/model_manager.py +0 -0
  253. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/whisper/model_registry.py +0 -0
  254. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  255. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/services/__init__.py +0 -0
  256. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/services/_wyoming_utils.py +0 -0
  257. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/services/asr.py +0 -0
  258. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/services/llm.py +0 -0
  259. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/services/tts.py +0 -0
  260. {agent_cli-0.106.0 → agent_cli-0.107.1}/agent_cli/services/wake_word.py +0 -0
  261. {agent_cli-0.106.0 → agent_cli-0.107.1}/docker/diarization.Dockerfile +0 -0
  262. {agent_cli-0.106.0 → agent_cli-0.107.1}/docker/docker-compose.yml +0 -0
  263. {agent_cli-0.106.0 → agent_cli-0.107.1}/docker/memory-proxy.Dockerfile +0 -0
  264. {agent_cli-0.106.0 → agent_cli-0.107.1}/docker/rag-proxy.Dockerfile +0 -0
  265. {agent_cli-0.106.0 → agent_cli-0.107.1}/docker/transcribe-proxy.Dockerfile +0 -0
  266. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/CNAME +0 -0
  267. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/architecture/index.md +0 -0
  268. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/architecture/memory.md +0 -0
  269. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/architecture/rag.md +0 -0
  270. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/assistant.md +0 -0
  271. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/autocorrect.md +0 -0
  272. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/chat.md +0 -0
  273. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/config.md +0 -0
  274. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/daemon.md +0 -0
  275. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/dev.md +0 -0
  276. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/diarize-live-session.md +0 -0
  277. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/index.md +0 -0
  278. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/install-extras.md +0 -0
  279. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/install-hotkeys.md +0 -0
  280. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/install-services.md +0 -0
  281. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/memory.md +0 -0
  282. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/rag-proxy.md +0 -0
  283. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/server/index.md +0 -0
  284. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/server/transcribe-proxy.md +0 -0
  285. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/server/tts.md +0 -0
  286. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/server/whisper.md +0 -0
  287. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/speak.md +0 -0
  288. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/speakers.md +0 -0
  289. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/start-services.md +0 -0
  290. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/transcribe-live.md +0 -0
  291. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/transcribe.md +0 -0
  292. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/commands/voice-edit.md +0 -0
  293. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/configuration.md +0 -0
  294. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/getting-started.md +0 -0
  295. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/iOS_Shortcut_Guide.md +0 -0
  296. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/index.md +0 -0
  297. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/installation/docker.md +0 -0
  298. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/installation/index.md +0 -0
  299. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/installation/linux.md +0 -0
  300. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/installation/macos-app.md +0 -0
  301. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/installation/macos.md +0 -0
  302. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/installation/nixos.md +0 -0
  303. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/installation/windows.md +0 -0
  304. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/logo-avatar.svg +0 -0
  305. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/logo-clean.svg +0 -0
  306. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  307. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/run_markdown_code_runner.py +0 -0
  308. {agent_cli-0.106.0 → agent_cli-0.107.1}/docs/system-integration.md +0 -0
  309. {agent_cli-0.106.0 → agent_cli-0.107.1}/example.agent-cli-config.toml +0 -0
  310. {agent_cli-0.106.0 → agent_cli-0.107.1}/justfile +0 -0
  311. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/README.md +0 -0
  312. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
  313. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Resources/Info.plist +0 -0
  314. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
  315. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
  316. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
  317. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
  318. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
  319. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
  320. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
  321. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
  322. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
  323. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/LiveTranscriptionPreview.swift +0 -0
  324. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
  325. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatus.swift +0 -0
  326. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatusRow.swift +0 -0
  327. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/MenuActivityTracker.swift +0 -0
  328. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
  329. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
  330. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
  331. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
  332. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +0 -0
  333. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +0 -0
  334. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +0 -0
  335. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
  336. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
  337. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Tests/AgentCLITests/ConfigurableHotkeyControllerTests.swift +0 -0
  338. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Tests/AgentCLITests/LivePreviewSwiftTestingTests.swift +0 -0
  339. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Tests/AgentCLITests/LiveTranscriptionPreviewTests.swift +0 -0
  340. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
  341. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
  342. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
  343. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/build-macos-app.sh +0 -0
  344. {agent_cli-0.106.0 → agent_cli-0.107.1}/macos/test-macos-app-e2e.sh +0 -0
  345. {agent_cli-0.106.0 → agent_cli-0.107.1}/pyproject.toml +0 -0
  346. {agent_cli-0.106.0 → agent_cli-0.107.1}/reddit.md +0 -0
  347. {agent_cli-0.106.0 → agent_cli-0.107.1}/shell.nix +0 -0
  348. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/__init__.py +0 -0
  349. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/agents/__init__.py +0 -0
  350. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/agents/test_fix_my_text.py +0 -0
  351. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/agents/test_interactive.py +0 -0
  352. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/agents/test_interactive_extra.py +0 -0
  353. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/agents/test_memory_add.py +0 -0
  354. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/agents/test_speak.py +0 -0
  355. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/agents/test_speak_e2e.py +0 -0
  356. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/agents/test_speakers.py +0 -0
  357. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/agents/test_transcribe.py +0 -0
  358. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/agents/test_transcribe_agent.py +0 -0
  359. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/agents/test_transcribe_e2e.py +0 -0
  360. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/agents/test_transcribe_live.py +0 -0
  361. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/agents/test_transcribe_recovery.py +0 -0
  362. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/agents/test_tts_common.py +0 -0
  363. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/agents/test_tts_common_extra.py +0 -0
  364. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/agents/test_voice_agent_common.py +0 -0
  365. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/agents/test_voice_edit.py +0 -0
  366. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/agents/test_voice_edit_e2e.py +0 -0
  367. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/agents/test_wake_word_assistant.py +0 -0
  368. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/conftest.py +0 -0
  369. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/core/__init__.py +0 -0
  370. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/core/test_audio.py +0 -0
  371. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/core/test_audio_format.py +0 -0
  372. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/core/test_audio_levels.py +0 -0
  373. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/core/test_chroma.py +0 -0
  374. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/core/test_sse.py +0 -0
  375. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/core/test_vad.py +0 -0
  376. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/core/test_watch.py +0 -0
  377. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/dev/__init__.py +0 -0
  378. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/dev/test_cleanup.py +0 -0
  379. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/dev/test_cli.py +0 -0
  380. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/dev/test_coding_agents.py +0 -0
  381. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/dev/test_editors.py +0 -0
  382. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/dev/test_hooks.py +0 -0
  383. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/dev/test_launch.py +0 -0
  384. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/dev/test_project.py +0 -0
  385. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/dev/test_terminals.py +0 -0
  386. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/dev/test_verification.py +0 -0
  387. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/dev/test_worktree.py +0 -0
  388. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/install/__init__.py +0 -0
  389. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/install/test_extras.py +0 -0
  390. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/install/test_launchd.py +0 -0
  391. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/memory/__init__.py +0 -0
  392. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/memory/test_api_health.py +0 -0
  393. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/memory/test_api_integration_liveish.py +0 -0
  394. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/memory/test_client.py +0 -0
  395. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/memory/test_engine.py +0 -0
  396. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/memory/test_files.py +0 -0
  397. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/memory/test_filters.py +0 -0
  398. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/memory/test_git_integration.py +0 -0
  399. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/memory/test_indexer.py +0 -0
  400. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/memory/test_memory_integration.py +0 -0
  401. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/memory/test_proxy_passthrough.py +0 -0
  402. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/memory/test_store.py +0 -0
  403. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/memory/test_utils.py +0 -0
  404. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/mocks/__init__.py +0 -0
  405. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/mocks/audio.py +0 -0
  406. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/mocks/llm.py +0 -0
  407. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/mocks/wyoming.py +0 -0
  408. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/rag/__init__.py +0 -0
  409. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/rag/test_api.py +0 -0
  410. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/rag/test_engine.py +0 -0
  411. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/rag/test_history.py +0 -0
  412. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/rag/test_indexer.py +0 -0
  413. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/rag/test_indexing.py +0 -0
  414. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/rag/test_rag_client.py +0 -0
  415. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/rag/test_rag_integration_liveish.py +0 -0
  416. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  417. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/rag/test_retriever.py +0 -0
  418. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/rag/test_store.py +0 -0
  419. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/rag/test_utils.py +0 -0
  420. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_alignment.py +0 -0
  421. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_api.py +0 -0
  422. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_api_integration.py +0 -0
  423. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_asr.py +0 -0
  424. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_asr_recovery.py +0 -0
  425. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_audio_e2e.py +0 -0
  426. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_cli.py +0 -0
  427. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_config.py +0 -0
  428. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_config_cmd.py +0 -0
  429. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_daemon.py +0 -0
  430. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_diarization.py +0 -0
  431. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_diarize_live_session.py +0 -0
  432. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_docs_gen.py +0 -0
  433. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_env_vars.py +0 -0
  434. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_faster_whisper_backend.py +0 -0
  435. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_json_output.py +0 -0
  436. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_llm.py +0 -0
  437. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_llm_gemini.py +0 -0
  438. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_macos_app.py +0 -0
  439. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_memory_tools.py +0 -0
  440. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_mlx_backend.py +0 -0
  441. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_nemo_backend.py +0 -0
  442. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_normalize_appcast.py +0 -0
  443. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_process_manager.py +0 -0
  444. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_proxy_diarization.py +0 -0
  445. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_requires_extras.py +0 -0
  446. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_server_streaming.py +0 -0
  447. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_server_tts.py +0 -0
  448. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_server_tts_wyoming.py +0 -0
  449. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_server_whisper.py +0 -0
  450. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_server_whisper_wyoming.py +0 -0
  451. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_services.py +0 -0
  452. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_speaker_identity.py +0 -0
  453. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_tools.py +0 -0
  454. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_transformers_backend.py +0 -0
  455. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_tts.py +0 -0
  456. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_utils.py +0 -0
  457. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_wake_word.py +0 -0
  458. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_whisper_backend_audio.py +0 -0
  459. {agent_cli-0.106.0 → agent_cli-0.107.1}/tests/test_wyoming_utils.py +0 -0
  460. {agent_cli-0.106.0 → agent_cli-0.107.1}/uv.lock +0 -0
  461. {agent_cli-0.106.0 → agent_cli-0.107.1}/zensical.toml +0 -0
@@ -52,7 +52,7 @@ jobs:
52
52
  uses: docker/setup-buildx-action@v4.4.1
53
53
 
54
54
  - name: Log in to Container Registry
55
- uses: docker/login-action@v4.5.1
55
+ uses: docker/login-action@v4.5.2
56
56
  with:
57
57
  registry: ${{ env.REGISTRY }}
58
58
  username: ${{ github.actor }}
@@ -125,7 +125,7 @@ jobs:
125
125
  uses: docker/setup-buildx-action@v4.4.1
126
126
 
127
127
  - name: Log in to Container Registry
128
- uses: docker/login-action@v4.5.1
128
+ uses: docker/login-action@v4.5.2
129
129
  with:
130
130
  registry: ${{ env.REGISTRY }}
131
131
  username: ${{ github.actor }}
@@ -178,7 +178,7 @@ jobs:
178
178
  df -h
179
179
 
180
180
  - name: Log in to Container Registry
181
- uses: docker/login-action@v4.5.1
181
+ uses: docker/login-action@v4.5.2
182
182
  with:
183
183
  registry: ${{ env.REGISTRY }}
184
184
  username: ${{ github.actor }}
@@ -32,7 +32,7 @@ jobs:
32
32
  lfs: true
33
33
 
34
34
  - name: Install uv
35
- uses: astral-sh/setup-uv@v9.0.0
35
+ uses: astral-sh/setup-uv@v10.0.0
36
36
 
37
37
  - name: Set up Python
38
38
  run: uv python install 3.12
@@ -22,7 +22,7 @@ jobs:
22
22
  python-version: "3.13.11"
23
23
 
24
24
  - name: Install uv
25
- uses: astral-sh/setup-uv@v9.0.0
25
+ uses: astral-sh/setup-uv@v10.0.0
26
26
 
27
27
  - name: Run markdown-code-runner
28
28
  env:
@@ -27,7 +27,7 @@ jobs:
27
27
  if: matrix.os == 'ubuntu-latest'
28
28
  run: sudo apt-get update && sudo apt-get install -y portaudio19-dev
29
29
  - name: Install uv
30
- uses: astral-sh/setup-uv@v9.0.0
30
+ uses: astral-sh/setup-uv@v10.0.0
31
31
  - name: Run macOS app Swift tests
32
32
  if: matrix.os == 'macos-latest' && matrix.python-version == '3.13'
33
33
  run: swift test --package-path macos/AgentCLI --enable-xctest
@@ -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.6.0
12
+ - uses: release-drafter/release-drafter@v7.7.0
13
13
  env:
14
14
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -16,7 +16,7 @@ jobs:
16
16
  steps:
17
17
  - uses: actions/checkout@v7.0.1
18
18
  - name: Install uv
19
- uses: astral-sh/setup-uv@v9.0.0
19
+ uses: astral-sh/setup-uv@v10.0.0
20
20
  - name: Build
21
21
  run: uv build
22
22
  - name: Publish package distributions to PyPI
@@ -31,7 +31,7 @@ jobs:
31
31
  steps:
32
32
  - uses: actions/checkout@v7.0.1
33
33
  - name: Install uv
34
- uses: astral-sh/setup-uv@v9.0.0
34
+ uses: astral-sh/setup-uv@v10.0.0
35
35
  - name: Import Developer ID certificate
36
36
  uses: apple-actions/import-codesign-certs@v7.0.0
37
37
  with:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: agent-cli
3
- Version: 0.106.0
3
+ Version: 0.107.1
4
4
  Summary: A suite of AI-powered command-line tools for text correction, audio transcription, and voice assistance.
5
5
  Project-URL: Homepage, https://github.com/basnijholt/agent-cli
6
6
  Author-email: Bas Nijholt <bas@nijho.lt>
@@ -51,7 +51,7 @@ RUN uv sync --frozen --no-dev --no-editable --extra server --extra piper --extra
51
51
  # =============================================================================
52
52
  # CUDA target: GPU-accelerated with Kokoro TTS
53
53
  # =============================================================================
54
- FROM nvcr.io/nvidia/cuda:12.9.1-cudnn-runtime-ubuntu24.04 AS cuda
54
+ FROM nvcr.io/nvidia/cuda:12.9.2-cudnn-runtime-ubuntu24.04 AS cuda
55
55
 
56
56
  COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
57
57
 
@@ -31,7 +31,7 @@ RUN uv sync --frozen --no-dev --no-editable --extra server --extra faster-whispe
31
31
  # =============================================================================
32
32
  # CUDA target: GPU-accelerated with faster-whisper
33
33
  # =============================================================================
34
- FROM nvcr.io/nvidia/cuda:12.9.1-cudnn-runtime-ubuntu24.04 AS cuda
34
+ FROM nvcr.io/nvidia/cuda:12.9.2-cudnn-runtime-ubuntu24.04 AS cuda
35
35
 
36
36
  COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
37
37
 
@@ -14,8 +14,8 @@
14
14
  "kind" : "remoteSourceControl",
15
15
  "location" : "https://github.com/sparkle-project/Sparkle",
16
16
  "state" : {
17
- "revision" : "b6496a74a087257ef5e6da1c5b29a447a60f5bd7",
18
- "version" : "2.9.4"
17
+ "revision" : "ac2def288cbff5cfc7df3ffef6abdf45b72bcb0a",
18
+ "version" : "2.9.6"
19
19
  }
20
20
  }
21
21
  ],
@@ -12,7 +12,7 @@ let package = Package(
12
12
  ],
13
13
  dependencies: [
14
14
  .package(url: "https://github.com/sindresorhus/KeyboardShortcuts", exact: "1.10.0"),
15
- .package(url: "https://github.com/sparkle-project/Sparkle", exact: "2.9.4"),
15
+ .package(url: "https://github.com/sparkle-project/Sparkle", exact: "2.9.6"),
16
16
  ],
17
17
  targets: [
18
18
  .executableTarget(
@@ -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
 
@@ -265,12 +265,12 @@ final class AgentCommandRunner: ObservableObject {
265
265
  Task { @MainActor in
266
266
  if shouldStartRecording {
267
267
  self.clearHoldTranscriptionState(for: command)
268
- let shouldPaste = self.shouldPasteAfterRecording(for: command) && result.exitCode == 0
268
+ let shouldPaste = self.shouldPasteAfterRecording(for: command)
269
269
  let pasteTarget = self.holdToTranscribePasteTarget
270
270
  self.endRecordingIndicator(for: command)
271
271
  self.clearStopRequested(for: command)
272
- if shouldPaste {
273
- self.pasteController.pasteTranscriptIntoFocusedField(result.output, target: pasteTarget) { message in
272
+ if shouldPaste, let pasteText = result.pasteText {
273
+ self.pasteController.pasteTranscriptIntoFocusedField(pasteText, target: pasteTarget) { message in
274
274
  self.statusMessage = message
275
275
  }
276
276
  }
@@ -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
 
@@ -53,6 +53,22 @@ private final class LoginShellPATHCache {
53
53
  typealias AgentProcessRunner = (URL, [String], [String: String]) -> CommandResult
54
54
  typealias LocalhostConnector = (UInt16) -> Bool
55
55
 
56
+ private final class ProcessDiagnosticCapture: @unchecked Sendable {
57
+ private let lock = NSLock()
58
+ private var text = ""
59
+
60
+ func read(from handle: FileHandle) {
61
+ let data = handle.readDataToEndOfFile()
62
+ lock.withLock {
63
+ text = String(decoding: data, as: UTF8.self).trimmingCharacters(in: .whitespacesAndNewlines)
64
+ }
65
+ }
66
+
67
+ var output: String {
68
+ lock.withLock { text }
69
+ }
70
+ }
71
+
56
72
  struct AgentRuntime {
57
73
  static let shared = AgentRuntime()
58
74
 
@@ -747,7 +763,7 @@ struct AgentRuntime {
747
763
  )
748
764
  guard result.exitCode == 0 else { return nil }
749
765
 
750
- return result.output
766
+ return (result.standardOutput ?? result.output)
751
767
  .split(separator: "\n")
752
768
  .last
753
769
  .map(String.init)
@@ -799,20 +815,35 @@ struct AgentRuntime {
799
815
  ) -> CommandResult {
800
816
  let task = Process()
801
817
  let pipe = Pipe()
818
+ let errorPipe = Pipe()
802
819
 
803
820
  task.executableURL = executableURL
804
821
  task.arguments = arguments
805
822
  task.environment = environment
806
823
  task.standardOutput = pipe
807
- task.standardError = pipe
824
+ task.standardError = errorPipe
808
825
 
809
826
  do {
810
827
  try task.run()
828
+ // Drain both streams concurrently so verbose diagnostics cannot fill
829
+ // stderr's pipe and block the child before it finishes stdout.
830
+ let diagnostics = ProcessDiagnosticCapture()
831
+ let readers = DispatchGroup()
832
+ readers.enter()
833
+ DispatchQueue.global(qos: .userInitiated).async {
834
+ diagnostics.read(from: errorPipe.fileHandleForReading)
835
+ readers.leave()
836
+ }
811
837
  let data = pipe.fileHandleForReading.readDataToEndOfFile()
812
838
  task.waitUntilExit()
839
+ readers.wait()
840
+ let stdout = String(decoding: data, as: UTF8.self).trimmingCharacters(in: .whitespacesAndNewlines)
841
+ let output = [stdout, diagnostics.output].filter { !$0.isEmpty }.joined(separator: "\n")
813
842
  return CommandResult(
814
843
  exitCode: task.terminationStatus,
815
- output: String(data: data, encoding: .utf8)?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
844
+ output: output,
845
+ standardOutput: stdout,
846
+ standardError: diagnostics.output
816
847
  )
817
848
  } catch {
818
849
  return CommandResult(exitCode: 127, output: error.localizedDescription)
@@ -0,0 +1,39 @@
1
+ import Foundation
2
+
3
+ struct CommandResult {
4
+ let exitCode: Int32
5
+ let output: String
6
+ /// Unmixed stdout for child processes; nil for synthetic results.
7
+ let standardOutput: String?
8
+ let standardError: String?
9
+
10
+ init(exitCode: Int32, output: String, standardOutput: String? = nil, standardError: String? = nil) {
11
+ self.exitCode = exitCode
12
+ self.output = output
13
+ self.standardOutput = standardOutput
14
+ self.standardError = standardError
15
+ }
16
+
17
+ var pasteText: String? {
18
+ let candidates = standardOutput == nil && standardError == nil
19
+ ? [output] : [standardOutput ?? "", standardError ?? ""]
20
+ return candidates
21
+ .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
22
+ .first { !$0.isEmpty }
23
+ }
24
+
25
+ func requiringTranscript() -> CommandResult {
26
+ guard exitCode == 0 else { return self }
27
+ let transcript = (standardOutput ?? output).trimmingCharacters(in: .whitespacesAndNewlines)
28
+ if !transcript.isEmpty {
29
+ return CommandResult(exitCode: 0, output: transcript, standardOutput: transcript, standardError: standardError)
30
+ }
31
+ return CommandResult(
32
+ exitCode: 1,
33
+ output: "No transcript returned. Check the microphone and ASR server, then try again. "
34
+ + "If a recording was saved, recover it with agent-cli transcribe --last-recording.",
35
+ standardOutput: standardOutput,
36
+ standardError: standardError
37
+ )
38
+ }
39
+ }
@@ -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
@@ -268,6 +268,15 @@ final class AgentCommandTests: XCTestCase {
268
268
 
269
269
  private static let shellPATHProbeSuccess = CommandResult(exitCode: 0, output: "/shell/bin\n")
270
270
 
271
+ func testLoginShellPATHIgnoresStderrWarnings() {
272
+ let runtime = makeShellPATHProbingRuntime(suiteName: "AgentCLITests.shell-path-diagnostics") {
273
+ CommandResult(exitCode: 0, output: "/shell/bin\nShell startup warning", standardOutput: "/shell/bin\n")
274
+ }
275
+ let path = runtime.commandEnvironment()["PATH"] ?? ""
276
+ XCTAssertEqual(path.split(separator: ":").first.map(String.init), "/shell/bin")
277
+ XCTAssertFalse(path.contains("Shell startup warning"))
278
+ }
279
+
271
280
  /// `zsh -lic` costs roughly a second with a real dotfiles setup, so the login shell
272
281
  /// PATH must be resolved once per runtime instead of once per spawned command.
273
282
  func testUserInstalledRuntimeCachesLoginShellPATHLookup() {
@@ -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")
@@ -0,0 +1,76 @@
1
+ #if canImport(XCTest)
2
+ import XCTest
3
+ @testable import AgentCLI
4
+
5
+ final class TranscriptionResultTests: XCTestCase {
6
+ func testShutdownWarningsAreNotPartOfTranscript() {
7
+ let result = runShell("""
8
+ printf '%s\\n' 'Timed out after 0.50s waiting for audio stream.abort(); continuing.' >&2
9
+ printf '%s\\n' 'Timed out after 0.50s waiting for audio stream.close(); continuing.' >&2
10
+ printf '%s\\n' 'CI is failing for the proxy. Fix it.'
11
+ """).requiringTranscript()
12
+ XCTAssertEqual(result.exitCode, 0)
13
+ XCTAssertEqual(result.output, "CI is failing for the proxy. Fix it.")
14
+ XCTAssertEqual(result.pasteText, "CI is failing for the proxy. Fix it.")
15
+ }
16
+
17
+ func testWarningsAloneDoNotCountAsTranscript() {
18
+ let result = runShell("printf 'Audio shutdown warning\\n' >&2").requiringTranscript()
19
+ XCTAssertNotEqual(result.exitCode, 0)
20
+ XCTAssertTrue(result.output.contains("No transcript"))
21
+ XCTAssertEqual(result.pasteText, "Audio shutdown warning")
22
+ }
23
+
24
+ func testFailureKeepsStderrDiagnostics() {
25
+ let result = runShell("printf 'ASR connection failed\\n' >&2; exit 7").requiringTranscript()
26
+ XCTAssertEqual(result.exitCode, 7)
27
+ XCTAssertTrue(result.output.contains("ASR connection failed"))
28
+ XCTAssertEqual(result.pasteText, "ASR connection failed")
29
+ }
30
+
31
+ func testStdoutWinsOverStderrEvenWhenCommandFails() {
32
+ let result = runShell("printf 'Recognized speech\\n'; printf 'Cleanup failed\\n' >&2; exit 7")
33
+ .requiringTranscript()
34
+ XCTAssertEqual(result.exitCode, 7)
35
+ XCTAssertEqual(result.pasteText, "Recognized speech")
36
+ }
37
+
38
+ func testSilentProcessDoesNotPasteInventedTranscript() {
39
+ let result = runShell("exit 0").requiringTranscript()
40
+ XCTAssertNotEqual(result.exitCode, 0)
41
+ XCTAssertNil(result.pasteText)
42
+ }
43
+
44
+ func testLargeDiagnosticsDoNotBlockTranscriptCapture() {
45
+ let result = runShell("dd if=/dev/zero bs=65536 count=4 >&2 2>/dev/null; printf 'Hello\\n'")
46
+ .requiringTranscript()
47
+ XCTAssertEqual(result.exitCode, 0)
48
+ XCTAssertEqual(result.output, "Hello")
49
+ }
50
+
51
+ private func runShell(_ command: String) -> CommandResult {
52
+ AgentRuntime.runProcess(
53
+ executableURL: URL(fileURLWithPath: "/bin/sh"),
54
+ arguments: ["-c", command],
55
+ environment: ["PATH": "/usr/bin:/bin"]
56
+ )
57
+ }
58
+
59
+ func testEmptySuccessfulRecordingBecomesFailure() {
60
+ for output in ["", " \n\t"] {
61
+ let result = CommandResult(exitCode: 0, output: output).requiringTranscript()
62
+ XCTAssertNotEqual(result.exitCode, 0)
63
+ XCTAssertTrue(result.output.contains("No transcript"))
64
+ }
65
+ }
66
+
67
+ func testTranscriptAndBackendFailureArePreserved() {
68
+ let success = CommandResult(exitCode: 0, output: "Hello world").requiringTranscript()
69
+ XCTAssertEqual(success.exitCode, 0)
70
+ XCTAssertEqual(success.output, "Hello world")
71
+ let failure = CommandResult(exitCode: 7, output: "Connection lost").requiringTranscript()
72
+ XCTAssertEqual(failure.exitCode, 7)
73
+ XCTAssertEqual(failure.output, "Connection lost")
74
+ }
75
+ }
76
+ #endif