agent-cli 0.95.13__tar.gz → 0.95.14__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 (442) hide show
  1. agent_cli-0.95.14/.github/scripts/normalize_appcast.py +25 -0
  2. {agent_cli-0.95.13 → agent_cli-0.95.14}/.github/workflows/release.yml +1 -0
  3. {agent_cli-0.95.13 → agent_cli-0.95.14}/Casks/agent-cli.rb +2 -2
  4. {agent_cli-0.95.13 → agent_cli-0.95.14}/PKG-INFO +1 -1
  5. agent_cli-0.95.14/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +15 -0
  6. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +8 -32
  7. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +2 -0
  8. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +4 -2
  9. agent_cli-0.95.14/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +26 -0
  10. agent_cli-0.95.14/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +324 -0
  11. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +28 -0
  12. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/appcast.xml +16 -0
  13. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_macos_app.py +86 -61
  14. agent_cli-0.95.14/tests/test_normalize_appcast.py +28 -0
  15. agent_cli-0.95.13/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -187
  16. agent_cli-0.95.13/macos/AgentCLI/Sources/AgentCLI/VoiceStatusMenuItem.swift +0 -10
  17. {agent_cli-0.95.13 → agent_cli-0.95.14}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  18. {agent_cli-0.95.13 → agent_cli-0.95.14}/.claude/skills/agent-cli-dev/examples.md +0 -0
  19. {agent_cli-0.95.13 → agent_cli-0.95.14}/.claude-plugin/README.md +0 -0
  20. {agent_cli-0.95.13 → agent_cli-0.95.14}/.claude-plugin/marketplace.json +0 -0
  21. {agent_cli-0.95.13 → agent_cli-0.95.14}/.claude-plugin/plugin.json +0 -0
  22. {agent_cli-0.95.13 → agent_cli-0.95.14}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  23. {agent_cli-0.95.13 → agent_cli-0.95.14}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  24. {agent_cli-0.95.13 → agent_cli-0.95.14}/.cursorrules +0 -0
  25. {agent_cli-0.95.13 → agent_cli-0.95.14}/.dockerignore +0 -0
  26. {agent_cli-0.95.13 → agent_cli-0.95.14}/.env.example +0 -0
  27. {agent_cli-0.95.13 → agent_cli-0.95.14}/.github/logo.svg +0 -0
  28. {agent_cli-0.95.13 → agent_cli-0.95.14}/.github/release-drafter.yml +0 -0
  29. {agent_cli-0.95.13 → agent_cli-0.95.14}/.github/renovate.json +0 -0
  30. {agent_cli-0.95.13 → agent_cli-0.95.14}/.github/scripts/check_extras_sync.py +0 -0
  31. {agent_cli-0.95.13 → agent_cli-0.95.14}/.github/scripts/check_plugin_skill_sync.py +0 -0
  32. {agent_cli-0.95.13 → agent_cli-0.95.14}/.github/scripts/sync_extras.py +0 -0
  33. {agent_cli-0.95.13 → agent_cli-0.95.14}/.github/scripts/sync_requirements.py +0 -0
  34. {agent_cli-0.95.13 → agent_cli-0.95.14}/.github/scripts/update_cask.py +0 -0
  35. {agent_cli-0.95.13 → agent_cli-0.95.14}/.github/workflows/automerge.yml +0 -0
  36. {agent_cli-0.95.13 → agent_cli-0.95.14}/.github/workflows/docker.yml +0 -0
  37. {agent_cli-0.95.13 → agent_cli-0.95.14}/.github/workflows/docs.yml +0 -0
  38. {agent_cli-0.95.13 → agent_cli-0.95.14}/.github/workflows/markdown-code-runner.yml +0 -0
  39. {agent_cli-0.95.13 → agent_cli-0.95.14}/.github/workflows/pytest.yml +0 -0
  40. {agent_cli-0.95.13 → agent_cli-0.95.14}/.github/workflows/release-drafter.yml +0 -0
  41. {agent_cli-0.95.13 → agent_cli-0.95.14}/.github/workflows/toc.yaml +0 -0
  42. {agent_cli-0.95.13 → agent_cli-0.95.14}/.gitignore +0 -0
  43. {agent_cli-0.95.13 → agent_cli-0.95.14}/.jscpd.json +0 -0
  44. {agent_cli-0.95.13 → agent_cli-0.95.14}/.pre-commit-config.yaml +0 -0
  45. {agent_cli-0.95.13 → agent_cli-0.95.14}/.prompts/docs-review.md +0 -0
  46. {agent_cli-0.95.13 → agent_cli-0.95.14}/.prompts/pr-review.md +0 -0
  47. {agent_cli-0.95.13 → agent_cli-0.95.14}/CLAUDE.md +0 -0
  48. {agent_cli-0.95.13 → agent_cli-0.95.14}/LICENSE +0 -0
  49. {agent_cli-0.95.13 → agent_cli-0.95.14}/LLAMA_SERVER_USAGE.md +0 -0
  50. {agent_cli-0.95.13 → agent_cli-0.95.14}/README.md +0 -0
  51. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/__init__.py +0 -0
  52. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/__main__.py +0 -0
  53. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/_extras.json +0 -0
  54. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/_requirements/.gitkeep +0 -0
  55. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/_requirements/audio.txt +0 -0
  56. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/_requirements/diarization.txt +0 -0
  57. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/_requirements/faster-whisper.txt +0 -0
  58. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/_requirements/kokoro.txt +0 -0
  59. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/_requirements/llm.txt +0 -0
  60. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/_requirements/memory.txt +0 -0
  61. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  62. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/_requirements/piper.txt +0 -0
  63. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/_requirements/rag.txt +0 -0
  64. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/_requirements/server.txt +0 -0
  65. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/_requirements/speed.txt +0 -0
  66. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/_requirements/vad.txt +0 -0
  67. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/_requirements/vectordb.txt +0 -0
  68. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  69. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/_requirements/wyoming.txt +0 -0
  70. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/_tools.py +0 -0
  71. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/agents/__init__.py +0 -0
  72. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/agents/_voice_agent_common.py +0 -0
  73. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/agents/assistant.py +0 -0
  74. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/agents/autocorrect.py +0 -0
  75. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/agents/chat.py +0 -0
  76. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/agents/diarize_live_session.py +0 -0
  77. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/agents/memory/__init__.py +0 -0
  78. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/agents/memory/add.py +0 -0
  79. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/agents/memory/proxy.py +0 -0
  80. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/agents/rag_proxy.py +0 -0
  81. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/agents/speak.py +0 -0
  82. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/agents/speakers.py +0 -0
  83. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/agents/transcribe.py +0 -0
  84. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/agents/transcribe_live.py +0 -0
  85. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/agents/voice_edit.py +0 -0
  86. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/api.py +0 -0
  87. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/cli.py +0 -0
  88. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/config.py +0 -0
  89. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/config_cmd.py +0 -0
  90. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/constants.py +0 -0
  91. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/core/__init__.py +0 -0
  92. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/core/alignment.py +0 -0
  93. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/core/audio.py +0 -0
  94. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/core/audio_format.py +0 -0
  95. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/core/chroma.py +0 -0
  96. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/core/deps.py +0 -0
  97. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/core/diarization.py +0 -0
  98. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/core/openai_proxy.py +0 -0
  99. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/core/process.py +0 -0
  100. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/core/reranker.py +0 -0
  101. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/core/speaker_identity.py +0 -0
  102. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/core/sse.py +0 -0
  103. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/core/transcription_logger.py +0 -0
  104. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/core/utils.py +0 -0
  105. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/core/vad.py +0 -0
  106. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/core/watch.py +0 -0
  107. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/daemon/__init__.py +0 -0
  108. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/daemon/cli.py +0 -0
  109. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/__init__.py +0 -0
  110. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/_branch_name.py +0 -0
  111. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/_config.py +0 -0
  112. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/_output.py +0 -0
  113. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/cleanup.py +0 -0
  114. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/cli.py +0 -0
  115. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/coding_agents/__init__.py +0 -0
  116. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/coding_agents/aider.py +0 -0
  117. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/coding_agents/base.py +0 -0
  118. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/coding_agents/claude.py +0 -0
  119. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/coding_agents/codex.py +0 -0
  120. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  121. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/coding_agents/copilot.py +0 -0
  122. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  123. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/coding_agents/gemini.py +0 -0
  124. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/coding_agents/opencode.py +0 -0
  125. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/coding_agents/registry.py +0 -0
  126. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/editors/__init__.py +0 -0
  127. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/editors/base.py +0 -0
  128. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/editors/cursor.py +0 -0
  129. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/editors/emacs.py +0 -0
  130. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/editors/jetbrains.py +0 -0
  131. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/editors/nano.py +0 -0
  132. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/editors/neovim.py +0 -0
  133. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/editors/registry.py +0 -0
  134. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/editors/sublime.py +0 -0
  135. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/editors/vim.py +0 -0
  136. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/editors/vscode.py +0 -0
  137. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/editors/zed.py +0 -0
  138. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/hooks.py +0 -0
  139. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/launch.py +0 -0
  140. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/project.py +0 -0
  141. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/registry.py +0 -0
  142. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/skill/SKILL.md +0 -0
  143. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/skill/examples.md +0 -0
  144. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/terminals/__init__.py +0 -0
  145. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  146. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/terminals/base.py +0 -0
  147. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/terminals/gnome.py +0 -0
  148. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/terminals/iterm2.py +0 -0
  149. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/terminals/kitty.py +0 -0
  150. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/terminals/registry.py +0 -0
  151. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/terminals/tmux.py +0 -0
  152. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/terminals/warp.py +0 -0
  153. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/terminals/zellij.py +0 -0
  154. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/dev/worktree.py +0 -0
  155. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/docs_gen.py +0 -0
  156. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/example-config.toml +0 -0
  157. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/install/__init__.py +0 -0
  158. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/install/common.py +0 -0
  159. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/install/extras.py +0 -0
  160. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/install/hotkeys.py +0 -0
  161. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/install/launchd.py +0 -0
  162. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/install/service_config.py +0 -0
  163. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/install/services.py +0 -0
  164. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/install/systemd.py +0 -0
  165. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/memory/__init__.py +0 -0
  166. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/memory/_files.py +0 -0
  167. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/memory/_filters.py +0 -0
  168. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/memory/_git.py +0 -0
  169. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/memory/_indexer.py +0 -0
  170. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/memory/_ingest.py +0 -0
  171. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/memory/_persistence.py +0 -0
  172. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/memory/_prompt.py +0 -0
  173. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/memory/_retrieval.py +0 -0
  174. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/memory/_store.py +0 -0
  175. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/memory/_streaming.py +0 -0
  176. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/memory/_tasks.py +0 -0
  177. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/memory/api.py +0 -0
  178. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/memory/client.py +0 -0
  179. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/memory/engine.py +0 -0
  180. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/memory/entities.py +0 -0
  181. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/memory/models.py +0 -0
  182. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/opts.py +0 -0
  183. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/py.typed +0 -0
  184. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/rag/__init__.py +0 -0
  185. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/rag/_indexer.py +0 -0
  186. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/rag/_indexing.py +0 -0
  187. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/rag/_prompt.py +0 -0
  188. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/rag/_retriever.py +0 -0
  189. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/rag/_store.py +0 -0
  190. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/rag/_utils.py +0 -0
  191. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/rag/api.py +0 -0
  192. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/rag/client.py +0 -0
  193. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/rag/engine.py +0 -0
  194. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/rag/models.py +0 -0
  195. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  196. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/__init__.py +0 -0
  197. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  198. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  199. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  200. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  201. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  202. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  203. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  204. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  205. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  206. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  207. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  208. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  209. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  210. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  211. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/run-openwakeword.sh +0 -0
  212. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  213. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/setup-linux.sh +0 -0
  214. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  215. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/setup-macos.sh +0 -0
  216. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/setup-windows.ps1 +0 -0
  217. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  218. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/scripts/start-all-services.sh +0 -0
  219. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/__init__.py +0 -0
  220. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/cli.py +0 -0
  221. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/common.py +0 -0
  222. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/model_manager.py +0 -0
  223. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/model_registry.py +0 -0
  224. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/proxy/__init__.py +0 -0
  225. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/proxy/api.py +0 -0
  226. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/streaming.py +0 -0
  227. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/tts/__init__.py +0 -0
  228. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/tts/api.py +0 -0
  229. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/tts/backends/__init__.py +0 -0
  230. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/tts/backends/base.py +0 -0
  231. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/tts/backends/kokoro.py +0 -0
  232. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/tts/backends/piper.py +0 -0
  233. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/tts/model_manager.py +0 -0
  234. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/tts/model_registry.py +0 -0
  235. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/tts/wyoming_handler.py +0 -0
  236. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/whisper/__init__.py +0 -0
  237. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/whisper/api.py +0 -0
  238. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/whisper/backends/__init__.py +0 -0
  239. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/whisper/backends/base.py +0 -0
  240. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  241. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/whisper/backends/mlx.py +0 -0
  242. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/whisper/backends/transformers.py +0 -0
  243. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/whisper/languages.py +0 -0
  244. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/whisper/model_manager.py +0 -0
  245. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/whisper/model_registry.py +0 -0
  246. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  247. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/services/__init__.py +0 -0
  248. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/services/_wyoming_utils.py +0 -0
  249. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/services/asr.py +0 -0
  250. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/services/llm.py +0 -0
  251. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/services/tts.py +0 -0
  252. {agent_cli-0.95.13 → agent_cli-0.95.14}/agent_cli/services/wake_word.py +0 -0
  253. {agent_cli-0.95.13 → agent_cli-0.95.14}/docker/docker-compose.yml +0 -0
  254. {agent_cli-0.95.13 → agent_cli-0.95.14}/docker/memory-proxy.Dockerfile +0 -0
  255. {agent_cli-0.95.13 → agent_cli-0.95.14}/docker/rag-proxy.Dockerfile +0 -0
  256. {agent_cli-0.95.13 → agent_cli-0.95.14}/docker/transcribe-proxy.Dockerfile +0 -0
  257. {agent_cli-0.95.13 → agent_cli-0.95.14}/docker/tts.Dockerfile +0 -0
  258. {agent_cli-0.95.13 → agent_cli-0.95.14}/docker/whisper.Dockerfile +0 -0
  259. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/CNAME +0 -0
  260. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/architecture/index.md +0 -0
  261. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/architecture/memory.md +0 -0
  262. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/architecture/rag.md +0 -0
  263. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/assistant.md +0 -0
  264. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/autocorrect.md +0 -0
  265. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/chat.md +0 -0
  266. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/config.md +0 -0
  267. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/daemon.md +0 -0
  268. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/dev.md +0 -0
  269. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/diarize-live-session.md +0 -0
  270. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/index.md +0 -0
  271. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/install-extras.md +0 -0
  272. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/install-hotkeys.md +0 -0
  273. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/install-services.md +0 -0
  274. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/memory.md +0 -0
  275. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/rag-proxy.md +0 -0
  276. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/server/index.md +0 -0
  277. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/server/transcribe-proxy.md +0 -0
  278. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/server/tts.md +0 -0
  279. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/server/whisper.md +0 -0
  280. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/speak.md +0 -0
  281. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/speakers.md +0 -0
  282. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/start-services.md +0 -0
  283. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/transcribe-live.md +0 -0
  284. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/transcribe.md +0 -0
  285. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/commands/voice-edit.md +0 -0
  286. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/configuration.md +0 -0
  287. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/getting-started.md +0 -0
  288. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/iOS_Shortcut_Guide.md +0 -0
  289. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/index.md +0 -0
  290. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/installation/docker.md +0 -0
  291. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/installation/index.md +0 -0
  292. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/installation/linux.md +0 -0
  293. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/installation/macos-app.md +0 -0
  294. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/installation/macos.md +0 -0
  295. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/installation/nixos.md +0 -0
  296. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/installation/windows.md +0 -0
  297. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/logo-avatar.svg +0 -0
  298. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/logo-clean.svg +0 -0
  299. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  300. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/run_markdown_code_runner.py +0 -0
  301. {agent_cli-0.95.13 → agent_cli-0.95.14}/docs/system-integration.md +0 -0
  302. {agent_cli-0.95.13 → agent_cli-0.95.14}/example.agent-cli-config.toml +0 -0
  303. {agent_cli-0.95.13 → agent_cli-0.95.14}/justfile +0 -0
  304. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Package.resolved +0 -0
  305. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Package.swift +0 -0
  306. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/README.md +0 -0
  307. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
  308. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Resources/Info.plist +0 -0
  309. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
  310. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
  311. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +0 -0
  312. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
  313. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
  314. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
  315. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
  316. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
  317. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
  318. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
  319. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
  320. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
  321. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
  322. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
  323. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +0 -0
  324. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
  325. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
  326. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
  327. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
  328. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
  329. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +0 -0
  330. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
  331. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/build-macos-app.sh +0 -0
  332. {agent_cli-0.95.13 → agent_cli-0.95.14}/macos/test-macos-app-e2e.sh +0 -0
  333. {agent_cli-0.95.13 → agent_cli-0.95.14}/pyproject.toml +0 -0
  334. {agent_cli-0.95.13 → agent_cli-0.95.14}/reddit.md +0 -0
  335. {agent_cli-0.95.13 → agent_cli-0.95.14}/shell.nix +0 -0
  336. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/__init__.py +0 -0
  337. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/agents/__init__.py +0 -0
  338. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/agents/test_fix_my_text.py +0 -0
  339. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/agents/test_interactive.py +0 -0
  340. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/agents/test_interactive_extra.py +0 -0
  341. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/agents/test_memory_add.py +0 -0
  342. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/agents/test_speak.py +0 -0
  343. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/agents/test_speak_e2e.py +0 -0
  344. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/agents/test_speakers.py +0 -0
  345. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/agents/test_transcribe.py +0 -0
  346. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/agents/test_transcribe_agent.py +0 -0
  347. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/agents/test_transcribe_e2e.py +0 -0
  348. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/agents/test_transcribe_live.py +0 -0
  349. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/agents/test_transcribe_recovery.py +0 -0
  350. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/agents/test_tts_common.py +0 -0
  351. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/agents/test_tts_common_extra.py +0 -0
  352. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/agents/test_voice_agent_common.py +0 -0
  353. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/agents/test_voice_edit.py +0 -0
  354. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/agents/test_voice_edit_e2e.py +0 -0
  355. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/agents/test_wake_word_assistant.py +0 -0
  356. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/conftest.py +0 -0
  357. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/core/__init__.py +0 -0
  358. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/core/test_audio.py +0 -0
  359. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/core/test_audio_format.py +0 -0
  360. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/core/test_chroma.py +0 -0
  361. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/core/test_sse.py +0 -0
  362. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/core/test_vad.py +0 -0
  363. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/core/test_watch.py +0 -0
  364. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/dev/__init__.py +0 -0
  365. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/dev/test_cleanup.py +0 -0
  366. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/dev/test_cli.py +0 -0
  367. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/dev/test_coding_agents.py +0 -0
  368. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/dev/test_editors.py +0 -0
  369. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/dev/test_hooks.py +0 -0
  370. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/dev/test_launch.py +0 -0
  371. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/dev/test_project.py +0 -0
  372. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/dev/test_terminals.py +0 -0
  373. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/dev/test_verification.py +0 -0
  374. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/dev/test_worktree.py +0 -0
  375. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/install/__init__.py +0 -0
  376. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/install/test_extras.py +0 -0
  377. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/install/test_launchd.py +0 -0
  378. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/memory/__init__.py +0 -0
  379. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/memory/test_api_health.py +0 -0
  380. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/memory/test_api_integration_liveish.py +0 -0
  381. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/memory/test_client.py +0 -0
  382. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/memory/test_engine.py +0 -0
  383. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/memory/test_files.py +0 -0
  384. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/memory/test_filters.py +0 -0
  385. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/memory/test_git_integration.py +0 -0
  386. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/memory/test_indexer.py +0 -0
  387. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/memory/test_memory_integration.py +0 -0
  388. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/memory/test_proxy_passthrough.py +0 -0
  389. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/memory/test_store.py +0 -0
  390. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/memory/test_utils.py +0 -0
  391. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/mocks/__init__.py +0 -0
  392. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/mocks/audio.py +0 -0
  393. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/mocks/llm.py +0 -0
  394. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/mocks/wyoming.py +0 -0
  395. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/rag/__init__.py +0 -0
  396. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/rag/test_api.py +0 -0
  397. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/rag/test_engine.py +0 -0
  398. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/rag/test_history.py +0 -0
  399. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/rag/test_indexer.py +0 -0
  400. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/rag/test_indexing.py +0 -0
  401. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/rag/test_rag_client.py +0 -0
  402. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/rag/test_rag_integration_liveish.py +0 -0
  403. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  404. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/rag/test_retriever.py +0 -0
  405. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/rag/test_store.py +0 -0
  406. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/rag/test_utils.py +0 -0
  407. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_alignment.py +0 -0
  408. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_api.py +0 -0
  409. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_api_integration.py +0 -0
  410. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_asr.py +0 -0
  411. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_asr_recovery.py +0 -0
  412. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_audio_e2e.py +0 -0
  413. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_cli.py +0 -0
  414. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_config.py +0 -0
  415. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_config_cmd.py +0 -0
  416. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_daemon.py +0 -0
  417. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_diarization.py +0 -0
  418. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_diarize_live_session.py +0 -0
  419. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_docs_gen.py +0 -0
  420. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_env_vars.py +0 -0
  421. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_faster_whisper_backend.py +0 -0
  422. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_json_output.py +0 -0
  423. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_llm.py +0 -0
  424. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_llm_gemini.py +0 -0
  425. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_memory_tools.py +0 -0
  426. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_mlx_backend.py +0 -0
  427. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_process_manager.py +0 -0
  428. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_requires_extras.py +0 -0
  429. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_server_streaming.py +0 -0
  430. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_server_tts.py +0 -0
  431. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_server_whisper.py +0 -0
  432. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_services.py +0 -0
  433. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_speaker_identity.py +0 -0
  434. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_tools.py +0 -0
  435. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_transformers_backend.py +0 -0
  436. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_tts.py +0 -0
  437. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_update_cask.py +0 -0
  438. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_utils.py +0 -0
  439. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_wake_word.py +0 -0
  440. {agent_cli-0.95.13 → agent_cli-0.95.14}/tests/test_wyoming_utils.py +0 -0
  441. {agent_cli-0.95.13 → agent_cli-0.95.14}/uv.lock +0 -0
  442. {agent_cli-0.95.13 → agent_cli-0.95.14}/zensical.toml +0 -0
@@ -0,0 +1,25 @@
1
+ """Normalize generated Sparkle appcast files for repository hooks."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ from pathlib import Path
7
+
8
+
9
+ def normalize_appcast_file(path: Path) -> None:
10
+ """Use LF line endings and exactly one final newline."""
11
+ text = path.read_text(encoding="utf-8")
12
+ path.write_text(text.rstrip("\n") + "\n", encoding="utf-8", newline="\n")
13
+
14
+
15
+ def main() -> None:
16
+ """Run the command-line appcast normalizer."""
17
+ parser = argparse.ArgumentParser(description=__doc__)
18
+ parser.add_argument("appcast", type=Path, help="Path to the generated appcast XML.")
19
+ args = parser.parse_args()
20
+
21
+ normalize_appcast_file(args.appcast)
22
+
23
+
24
+ if __name__ == "__main__":
25
+ main()
@@ -119,6 +119,7 @@ jobs:
119
119
  python3 .github/scripts/update_cask.py \
120
120
  --version "$VERSION" \
121
121
  --sha256 "$SHA256"
122
+ python3 .github/scripts/normalize_appcast.py macos/appcast.xml
122
123
 
123
124
  if git diff --quiet -- Casks/agent-cli.rb macos/appcast.xml; then
124
125
  echo "Casks/agent-cli.rb and macos/appcast.xml are already up to date."
@@ -1,6 +1,6 @@
1
1
  cask "agent-cli" do
2
- version "0.95.12"
3
- sha256 "8f6957ae7f0ed68e2938b68dfc8ed207e2a62d2470d0cb975b947a02e9e98697"
2
+ version "0.95.13"
3
+ sha256 "425247d8090a845bbfe07eba758c923f1c6aa2422e092f74d9cc436f30f89ab3"
4
4
 
5
5
  url "https://github.com/basnijholt/agent-cli/releases/download/v#{version}/AgentCLI.dmg"
6
6
  name "Agent CLI"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-cli
3
- Version: 0.95.13
3
+ Version: 0.95.14
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>
@@ -0,0 +1,15 @@
1
+ import AppKit
2
+ import SwiftUI
3
+
4
+ @main
5
+ struct AgentCLIApp: App {
6
+ @NSApplicationDelegateAdaptor(AppDelegate.self) private var appDelegate
7
+
8
+ var body: some Scene {
9
+ Window("Agent CLI Settings", id: "settings") {
10
+ SettingsView()
11
+ .frame(width: 460)
12
+ }
13
+ .windowResizability(.contentSize)
14
+ }
15
+ }
@@ -29,12 +29,9 @@ final class AgentCommandRunner: ObservableObject {
29
29
  @Published private(set) var isRecording = false
30
30
  @Published private(set) var bootstrapPhase: BootstrapPhase = .idle
31
31
  @Published private var activeCommandCount = 0
32
- private var bootstrapAnimationTick = 0
33
- private var bootstrapElapsedSeconds = 0
34
32
  private var recordingIndicator = RecordingIndicatorController()
35
33
  private let pasteController: TranscriptPasteController
36
34
  private let bootstrap: AgentBootstrap
37
- private var bootstrapAnimationTimer: Timer?
38
35
  private var bootstrapPhaseStartedAt: Date?
39
36
  private var pendingStopRecordingCommands: Set<String> = []
40
37
  private var holdTranscriptionState: HoldTranscriptionState = .idle
@@ -52,8 +49,8 @@ final class AgentCommandRunner: ObservableObject {
52
49
  }
53
50
  if bootstrapPhase.isPreparing {
54
51
  return bootstrapPhase.statusMessage(
55
- animationTick: bootstrapAnimationTick,
56
- elapsedSeconds: bootstrapElapsedSeconds
52
+ animationTick: bootstrapAnimationTick(now: Date()),
53
+ elapsedSeconds: bootstrapElapsedSeconds(now: Date())
57
54
  )
58
55
  }
59
56
  if holdTranscriptionState.isFinishing {
@@ -134,13 +131,10 @@ final class AgentCommandRunner: ObservableObject {
134
131
  bootstrapPhase = phase
135
132
  if phase.isPreparing {
136
133
  if !wasPreparing || phaseChanged {
137
- bootstrapAnimationTick = 0
138
- bootstrapElapsedSeconds = 0
139
134
  bootstrapPhaseStartedAt = Date()
140
135
  }
141
- startBootstrapAnimationTimer()
142
136
  } else {
143
- stopBootstrapAnimationTimer()
137
+ bootstrapPhaseStartedAt = nil
144
138
  }
145
139
  }
146
140
 
@@ -152,31 +146,13 @@ final class AgentCommandRunner: ObservableObject {
152
146
  }
153
147
  }
154
148
 
155
- private func startBootstrapAnimationTimer() {
156
- guard bootstrapAnimationTimer == nil else { return }
157
- let timer = Timer(timeInterval: 0.8, repeats: true) { [weak self] _ in
158
- Task { @MainActor in
159
- guard let self else { return }
160
- guard self.bootstrapPhase.isPreparing else {
161
- self.stopBootstrapAnimationTimer()
162
- return
163
- }
164
- self.bootstrapAnimationTick = (self.bootstrapAnimationTick + 1) % 4
165
- if let startedAt = self.bootstrapPhaseStartedAt {
166
- self.bootstrapElapsedSeconds = max(0, Int(Date().timeIntervalSince(startedAt)))
167
- }
168
- }
169
- }
170
- RunLoop.main.add(timer, forMode: .common)
171
- bootstrapAnimationTimer = timer
149
+ private func bootstrapAnimationTick(now: Date) -> Int {
150
+ bootstrapElapsedSeconds(now: now) % 4
172
151
  }
173
152
 
174
- private func stopBootstrapAnimationTimer() {
175
- bootstrapAnimationTimer?.invalidate()
176
- bootstrapAnimationTimer = nil
177
- bootstrapAnimationTick = 0
178
- bootstrapElapsedSeconds = 0
179
- bootstrapPhaseStartedAt = nil
153
+ private func bootstrapElapsedSeconds(now: Date) -> Int {
154
+ guard let startedAt = bootstrapPhaseStartedAt else { return 0 }
155
+ return max(0, Int(now.timeIntervalSince(startedAt)))
180
156
  }
181
157
 
182
158
  @discardableResult
@@ -12,6 +12,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
12
12
 
13
13
  NSApp.setActivationPolicy(.accessory)
14
14
  UNUserNotificationCenter.current().delegate = self
15
+ StatusMenuController.shared.start()
15
16
  configureNotifications()
16
17
  ShortcutDefaultsMigrator.migrate()
17
18
  LoginItemController.shared.refresh()
@@ -22,6 +23,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
22
23
 
23
24
  func applicationWillTerminate(_ notification: Notification) {
24
25
  VoiceLevelOverlayController.shared.hide()
26
+ StatusMenuController.shared.stop()
25
27
  releaseInstanceLock()
26
28
  }
27
29
 
@@ -12,7 +12,7 @@ struct AgentCLIMenuBarIcon: View {
12
12
  let state: MenuBarIconState
13
13
 
14
14
  var body: some View {
15
- if let image = Self.logoImage(state: state) {
15
+ if let image = MenuBarIconImage.logoImage(state: state) {
16
16
  Image(nsImage: image)
17
17
  .resizable()
18
18
  .aspectRatio(contentMode: .fit)
@@ -47,8 +47,10 @@ struct AgentCLIMenuBarIcon: View {
47
47
  return "record.circle.fill"
48
48
  }
49
49
  }
50
+ }
50
51
 
51
- private static func logoImage(state: MenuBarIconState) -> NSImage? {
52
+ enum MenuBarIconImage {
53
+ static func logoImage(state: MenuBarIconState) -> NSImage? {
52
54
  switch state {
53
55
  case .idle:
54
56
  return idleLogoImage
@@ -0,0 +1,26 @@
1
+ import AppKit
2
+ import SwiftUI
3
+
4
+ @MainActor
5
+ final class SettingsWindowController {
6
+ static let shared = SettingsWindowController()
7
+
8
+ private var window: NSWindow?
9
+
10
+ private init() {}
11
+
12
+ func show() {
13
+ if window == nil {
14
+ let controller = NSHostingController(rootView: SettingsView().frame(width: 460))
15
+ let window = NSWindow(contentViewController: controller)
16
+ window.title = "Agent CLI Settings"
17
+ window.styleMask = [.titled, .closable]
18
+ window.isReleasedWhenClosed = false
19
+ window.center()
20
+ self.window = window
21
+ }
22
+
23
+ window?.makeKeyAndOrderFront(nil)
24
+ NSApp.activate(ignoringOtherApps: true)
25
+ }
26
+ }
@@ -0,0 +1,324 @@
1
+ import AppKit
2
+ import Foundation
3
+
4
+ @MainActor
5
+ final class StatusMenuController: NSObject, NSMenuDelegate {
6
+ static let shared = StatusMenuController()
7
+
8
+ private let runner = AgentCommandRunner.shared
9
+ private let appUpdater = AppUpdater.shared
10
+ private let loginItemController = LoginItemController.shared
11
+ private let shortcutSummary = ShortcutSummaryState.shared
12
+
13
+ private var statusItem: NSStatusItem?
14
+ private let menu = NSMenu()
15
+ private let recentRecordingsMenu = NSMenu()
16
+ private let troubleshootingMenu = NSMenu()
17
+ private var voiceStatusItem: NSMenuItem?
18
+ private var statusRefreshTimer: Timer?
19
+
20
+ private override init() {
21
+ super.init()
22
+ menu.delegate = self
23
+ recentRecordingsMenu.delegate = self
24
+ troubleshootingMenu.delegate = self
25
+ }
26
+
27
+ func start() {
28
+ guard statusItem == nil else { return }
29
+
30
+ let item = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
31
+ item.menu = menu
32
+ statusItem = item
33
+ rebuildRootMenu()
34
+ refreshDynamicStatus()
35
+ startStatusRefreshTimer()
36
+ }
37
+
38
+ func stop() {
39
+ statusRefreshTimer?.invalidate()
40
+ statusRefreshTimer = nil
41
+ if let statusItem {
42
+ NSStatusBar.system.removeStatusItem(statusItem)
43
+ }
44
+ statusItem = nil
45
+ }
46
+
47
+ func menuNeedsUpdate(_ menu: NSMenu) {
48
+ if menu === self.menu {
49
+ rebuildRootMenu()
50
+ } else if menu === recentRecordingsMenu {
51
+ rebuildRecentRecordingsMenu()
52
+ } else if menu === troubleshootingMenu {
53
+ rebuildTroubleshootingMenu()
54
+ }
55
+ refreshDynamicStatus()
56
+ }
57
+
58
+ private func rebuildRootMenu() {
59
+ menu.removeAllItems()
60
+
61
+ menu.addItem(actionItem("Record to Clipboard", symbolName: "waveform", action: #selector(recordToClipboard)))
62
+ menu.addItem(actionItem("Voice Edit Clipboard", symbolName: "mic", action: #selector(voiceEditClipboard)))
63
+ menu.addItem(actionItem("Autocorrect Clipboard", symbolName: "text.badge.checkmark", action: #selector(autocorrectClipboard)))
64
+ menu.addItem(.separator())
65
+
66
+ let voiceStatusItem = NSMenuItem(title: "", action: nil, keyEquivalent: "")
67
+ voiceStatusItem.isEnabled = false
68
+ menu.addItem(voiceStatusItem)
69
+ self.voiceStatusItem = voiceStatusItem
70
+
71
+ let shortcutItem = NSMenuItem(title: shortcutSummary.summary, action: nil, keyEquivalent: "")
72
+ shortcutItem.isEnabled = false
73
+ menu.addItem(shortcutItem)
74
+ menu.addItem(.separator())
75
+
76
+ let recentItem = NSMenuItem(title: "Recent Recordings", action: nil, keyEquivalent: "")
77
+ recentItem.image = symbolImage("clock.arrow.circlepath")
78
+ recentItem.submenu = recentRecordingsMenu
79
+ menu.addItem(recentItem)
80
+ menu.addItem(.separator())
81
+
82
+ let loginItem = actionItem(
83
+ loginItemController.presentation.menuTitle,
84
+ symbolName: loginItemController.presentation.isEnabled ? "checkmark.circle" : "circle",
85
+ action: #selector(toggleStartAtLogin)
86
+ )
87
+ loginItem.isEnabled = loginItemController.presentation.canToggle
88
+ menu.addItem(loginItem)
89
+
90
+ menu.addItem(actionItem("Settings...", symbolName: "gearshape", action: #selector(openSettings)))
91
+
92
+ let updateItem = actionItem("Check for Updates...", symbolName: "arrow.down.circle", action: #selector(checkForUpdates))
93
+ updateItem.isEnabled = appUpdater.canCheckForUpdates
94
+ menu.addItem(updateItem)
95
+
96
+ let troubleshootingItem = NSMenuItem(title: "Troubleshooting", action: nil, keyEquivalent: "")
97
+ troubleshootingItem.image = symbolImage("wrench.and.screwdriver")
98
+ troubleshootingItem.submenu = troubleshootingMenu
99
+ menu.addItem(troubleshootingItem)
100
+
101
+ menu.addItem(.separator())
102
+ menu.addItem(actionItem("Quit", symbolName: "power", action: #selector(quit)))
103
+ refreshDynamicStatus()
104
+ }
105
+
106
+ private func rebuildRecentRecordingsMenu() {
107
+ recentRecordingsMenu.removeAllItems()
108
+ let recentTranscriptions = RecentTranscriptionReader.recentTranscriptions()
109
+ if recentTranscriptions.isEmpty {
110
+ let item = NSMenuItem(title: "No recent transcriptions", action: nil, keyEquivalent: "")
111
+ item.isEnabled = false
112
+ recentRecordingsMenu.addItem(item)
113
+ return
114
+ }
115
+
116
+ for transcription in recentTranscriptions {
117
+ let item = actionItem(
118
+ transcription.menuTitle,
119
+ symbolName: "doc.on.clipboard",
120
+ action: #selector(copyRecentTranscription)
121
+ )
122
+ item.representedObject = transcription.text
123
+ recentRecordingsMenu.addItem(item)
124
+ }
125
+ }
126
+
127
+ private func rebuildTroubleshootingMenu() {
128
+ troubleshootingMenu.removeAllItems()
129
+ troubleshootingMenu.addItem(actionItem(
130
+ "Voice Service Status",
131
+ symbolName: "waveform.path.ecg",
132
+ action: #selector(showVoiceServiceStatus)
133
+ ))
134
+ troubleshootingMenu.addItem(actionItem(
135
+ runtimeCheckTitle,
136
+ symbolName: usesUserInstalledAgentCLI ? "checkmark.circle" : "arrow.down.circle",
137
+ action: #selector(checkRuntime)
138
+ ))
139
+ troubleshootingMenu.addItem(actionItem(
140
+ "Reinstall Voice Service",
141
+ symbolName: "waveform.badge.plus",
142
+ action: #selector(reinstallVoiceService)
143
+ ))
144
+ troubleshootingMenu.addItem(.separator())
145
+
146
+ if !runner.lastOutput.isEmpty {
147
+ troubleshootingMenu.addItem(actionItem(
148
+ "Copy Last Output",
149
+ symbolName: "doc.on.doc",
150
+ action: #selector(copyLastOutput)
151
+ ))
152
+ }
153
+
154
+ if runner.hasLastError {
155
+ troubleshootingMenu.addItem(actionItem(
156
+ "Open Last Error",
157
+ symbolName: "exclamationmark.triangle",
158
+ action: #selector(openLastError)
159
+ ))
160
+ troubleshootingMenu.addItem(actionItem(
161
+ "Copy Last Error",
162
+ symbolName: "doc.on.doc",
163
+ action: #selector(copyLastError)
164
+ ))
165
+ }
166
+
167
+ troubleshootingMenu.addItem(actionItem(
168
+ "Open Logs Folder",
169
+ symbolName: "doc.text.magnifyingglass",
170
+ action: #selector(openLogsFolder)
171
+ ))
172
+ troubleshootingMenu.addItem(actionItem(
173
+ "Open Config Folder",
174
+ symbolName: "folder",
175
+ action: #selector(openConfigFolder)
176
+ ))
177
+ troubleshootingMenu.addItem(.separator())
178
+ troubleshootingMenu.addItem(actionItem(
179
+ "Fix Notification Permission...",
180
+ symbolName: "bell.badge",
181
+ action: #selector(fixNotificationPermission)
182
+ ))
183
+ troubleshootingMenu.addItem(actionItem(
184
+ "Reset Accessibility Permission...",
185
+ symbolName: "figure.wave",
186
+ action: #selector(resetAccessibilityPermission)
187
+ ))
188
+ troubleshootingMenu.addItem(actionItem(
189
+ "Reset Keyboard Shortcuts",
190
+ symbolName: "arrow.counterclockwise",
191
+ action: #selector(resetKeyboardShortcuts)
192
+ ))
193
+ }
194
+
195
+ private func startStatusRefreshTimer() {
196
+ guard statusRefreshTimer == nil else { return }
197
+ let timer = Timer(timeInterval: 0.8, repeats: true) { [weak self] _ in
198
+ Task { @MainActor in
199
+ self?.refreshDynamicStatus()
200
+ }
201
+ }
202
+ RunLoop.main.add(timer, forMode: .common)
203
+ statusRefreshTimer = timer
204
+ }
205
+
206
+ private func refreshDynamicStatus() {
207
+ voiceStatusItem?.title = "Voice: \(runner.menuStatusMessage)"
208
+ if let button = statusItem?.button {
209
+ button.image = MenuBarIconImage.logoImage(state: runner.menuBarIconState)
210
+ button.imagePosition = .imageOnly
211
+ button.toolTip = accessibilityLabel(for: runner.menuBarIconState)
212
+ }
213
+ }
214
+
215
+ private var usesUserInstalledAgentCLI: Bool {
216
+ UserDefaults.standard.bool(forKey: RuntimeSettings.useUserInstalledAgentCLIKey)
217
+ }
218
+
219
+ private var runtimeCheckTitle: String {
220
+ usesUserInstalledAgentCLI ? "Check User CLI" : "Update CLI Runtime"
221
+ }
222
+
223
+ private func actionItem(_ title: String, symbolName: String, action: Selector) -> NSMenuItem {
224
+ let item = NSMenuItem(title: title, action: action, keyEquivalent: "")
225
+ item.target = self
226
+ item.image = symbolImage(symbolName)
227
+ return item
228
+ }
229
+
230
+ private func symbolImage(_ name: String) -> NSImage? {
231
+ NSImage(systemSymbolName: name, accessibilityDescription: nil)
232
+ }
233
+
234
+ private func accessibilityLabel(for state: MenuBarIconState) -> String {
235
+ switch state {
236
+ case .idle:
237
+ return "Agent CLI"
238
+ case .preparing:
239
+ return "Agent CLI preparing"
240
+ case .recording:
241
+ return "Agent CLI recording"
242
+ }
243
+ }
244
+
245
+ @objc private func recordToClipboard() {
246
+ runner.run(.toggleTranscription)
247
+ }
248
+
249
+ @objc private func voiceEditClipboard() {
250
+ runner.run(.voiceEdit)
251
+ }
252
+
253
+ @objc private func autocorrectClipboard() {
254
+ runner.run(.autocorrect)
255
+ }
256
+
257
+ @objc private func toggleStartAtLogin() {
258
+ loginItemController.toggle()
259
+ }
260
+
261
+ @objc private func openSettings() {
262
+ SettingsWindowController.shared.show()
263
+ }
264
+
265
+ @objc private func checkForUpdates() {
266
+ appUpdater.checkForUpdates()
267
+ }
268
+
269
+ @objc private func showVoiceServiceStatus() {
270
+ runner.run(.voiceServiceStatus)
271
+ }
272
+
273
+ @objc private func checkRuntime() {
274
+ runner.run(.installOrUpdateCLI)
275
+ }
276
+
277
+ @objc private func reinstallVoiceService() {
278
+ runner.run(.installVoiceService)
279
+ }
280
+
281
+ @objc private func copyLastOutput() {
282
+ runner.copyLastOutput()
283
+ }
284
+
285
+ @objc private func openLastError() {
286
+ runner.openLastError()
287
+ }
288
+
289
+ @objc private func copyLastError() {
290
+ runner.copyLastError()
291
+ }
292
+
293
+ @objc private func openLogsFolder() {
294
+ runner.openLogsFolder()
295
+ }
296
+
297
+ @objc private func openConfigFolder() {
298
+ runner.openConfigFolder()
299
+ }
300
+
301
+ @objc private func fixNotificationPermission() {
302
+ runner.repairNotificationPermission()
303
+ }
304
+
305
+ @objc private func resetAccessibilityPermission() {
306
+ runner.resetAccessibilityPermission()
307
+ }
308
+
309
+ @objc private func resetKeyboardShortcuts() {
310
+ ShortcutSummaryState.shared.resetDefaults()
311
+ runner.statusMessage = "Reset keyboard shortcuts to defaults"
312
+ }
313
+
314
+ @objc private func copyRecentTranscription(_ sender: NSMenuItem) {
315
+ guard let text = sender.representedObject as? String else { return }
316
+ NSPasteboard.general.clearContents()
317
+ NSPasteboard.general.setString(text, forType: .string)
318
+ runner.statusMessage = "Copied recent transcription"
319
+ }
320
+
321
+ @objc private func quit() {
322
+ NSApp.terminate(nil)
323
+ }
324
+ }
@@ -280,6 +280,34 @@ final class AgentCommandTests: XCTestCase {
280
280
  )
281
281
  }
282
282
 
283
+ @MainActor
284
+ func testMenuStatusComputesElapsedPreparationTimeWhenRead() {
285
+ let bootstrapStarted = expectation(description: "bootstrap started")
286
+ let releaseBootstrap = DispatchSemaphore(value: 0)
287
+ let runner = AgentCommandRunner { _, _, _ in
288
+ bootstrapStarted.fulfill()
289
+ releaseBootstrap.wait()
290
+ return CommandResult(exitCode: 0, output: "")
291
+ }
292
+
293
+ runner.warmUpTranscription()
294
+ defer { releaseBootstrap.signal() }
295
+
296
+ XCTAssertEqual(runner.menuStatusMessage, "Checking CLI runtime ◐ (00:00)")
297
+ wait(for: [bootstrapStarted], timeout: 2)
298
+ RunLoop.current.run(until: Date().addingTimeInterval(1.1))
299
+
300
+ let elapsedStatus = runner.menuStatusMessage
301
+ XCTAssertTrue(
302
+ elapsedStatus.contains("Checking CLI runtime"),
303
+ "Expected checking status, got: \(elapsedStatus)"
304
+ )
305
+ XCTAssertTrue(
306
+ elapsedStatus.contains("(00:01)") || elapsedStatus.contains("(00:02)"),
307
+ "Expected elapsed counter, got: \(elapsedStatus)"
308
+ )
309
+ }
310
+
283
311
  }
284
312
 
285
313
  private struct BootstrapCall: Equatable {
@@ -4,6 +4,22 @@
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.95.13</title>
9
+ <pubDate>Fri, 29 May 2026 04:09:13 +0000</pubDate>
10
+ <link>https://github.com/basnijholt/agent-cli</link>
11
+ <sparkle:version>171</sparkle:version>
12
+ <sparkle:shortVersionString>0.95.13</sparkle:shortVersionString>
13
+ <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
14
+ <sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
15
+ <description sparkle:format="markdown"><![CDATA[## What's Changed
16
+ - Require `ctranslate2>=4.6.2` for `agent-cli[faster-whisper]` so RTX 50xx / Blackwell users get the upstream sm120 INT8 workaround.
17
+ - Keep generated faster-whisper requirement exports in sync.
18
+
19
+ **Full Changelog**: https://github.com/basnijholt/agent-cli/compare/v0.95.12...v0.95.13
20
+ ]]></description>
21
+ <enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.95.13/AgentCLI.zip" length="22740098" type="application/octet-stream" sparkle:edSignature="jwY09RkyDWyFtWoKky+KXPs8XDzGHHhdGPHLEwIpcpFLIHvuzdYESXyYn5hanqHf0ORq6bPe9poGFHrIQQLUAw=="/>
22
+ </item>
7
23
  <item>
8
24
  <title>0.95.12</title>
9
25
  <pubDate>Fri, 29 May 2026 03:55:23 +0000</pubDate>