agent-cli 0.96.3__tar.gz → 0.96.5__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 (444) hide show
  1. {agent_cli-0.96.3 → agent_cli-0.96.5}/Casks/agent-cli.rb +2 -2
  2. {agent_cli-0.96.3 → agent_cli-0.96.5}/PKG-INFO +1 -1
  3. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +18 -56
  4. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +23 -1
  5. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +2 -2
  6. agent_cli-0.96.5/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatusRow.swift +26 -0
  7. agent_cli-0.96.5/macos/AgentCLI/Sources/AgentCLI/MenuActivityTracker.swift +64 -0
  8. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +14 -1
  9. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +1 -1
  10. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +1 -1
  11. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +10 -34
  12. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +2 -1
  13. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +96 -0
  14. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +6 -0
  15. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Tests/AgentCLITests/VoiceLevelMeterTests.swift +1 -1
  16. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/appcast.xml +32 -18
  17. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_macos_app.py +2 -0
  18. {agent_cli-0.96.3 → agent_cli-0.96.5}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  19. {agent_cli-0.96.3 → agent_cli-0.96.5}/.claude/skills/agent-cli-dev/examples.md +0 -0
  20. {agent_cli-0.96.3 → agent_cli-0.96.5}/.claude-plugin/README.md +0 -0
  21. {agent_cli-0.96.3 → agent_cli-0.96.5}/.claude-plugin/marketplace.json +0 -0
  22. {agent_cli-0.96.3 → agent_cli-0.96.5}/.claude-plugin/plugin.json +0 -0
  23. {agent_cli-0.96.3 → agent_cli-0.96.5}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  24. {agent_cli-0.96.3 → agent_cli-0.96.5}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  25. {agent_cli-0.96.3 → agent_cli-0.96.5}/.cursorrules +0 -0
  26. {agent_cli-0.96.3 → agent_cli-0.96.5}/.dockerignore +0 -0
  27. {agent_cli-0.96.3 → agent_cli-0.96.5}/.env.example +0 -0
  28. {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/logo.svg +0 -0
  29. {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/release-drafter.yml +0 -0
  30. {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/renovate.json +0 -0
  31. {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/scripts/check_extras_sync.py +0 -0
  32. {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/scripts/check_plugin_skill_sync.py +0 -0
  33. {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/scripts/normalize_appcast.py +0 -0
  34. {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/scripts/sync_extras.py +0 -0
  35. {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/scripts/sync_requirements.py +0 -0
  36. {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/scripts/update_cask.py +0 -0
  37. {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/workflows/automerge.yml +0 -0
  38. {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/workflows/docker.yml +0 -0
  39. {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/workflows/docs.yml +0 -0
  40. {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/workflows/markdown-code-runner.yml +0 -0
  41. {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/workflows/pytest.yml +0 -0
  42. {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/workflows/release-drafter.yml +0 -0
  43. {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/workflows/release.yml +0 -0
  44. {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/workflows/toc.yaml +0 -0
  45. {agent_cli-0.96.3 → agent_cli-0.96.5}/.gitignore +0 -0
  46. {agent_cli-0.96.3 → agent_cli-0.96.5}/.jscpd.json +0 -0
  47. {agent_cli-0.96.3 → agent_cli-0.96.5}/.pre-commit-config.yaml +0 -0
  48. {agent_cli-0.96.3 → agent_cli-0.96.5}/.prompts/docs-review.md +0 -0
  49. {agent_cli-0.96.3 → agent_cli-0.96.5}/.prompts/pr-review.md +0 -0
  50. {agent_cli-0.96.3 → agent_cli-0.96.5}/CLAUDE.md +0 -0
  51. {agent_cli-0.96.3 → agent_cli-0.96.5}/LICENSE +0 -0
  52. {agent_cli-0.96.3 → agent_cli-0.96.5}/LLAMA_SERVER_USAGE.md +0 -0
  53. {agent_cli-0.96.3 → agent_cli-0.96.5}/README.md +0 -0
  54. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/__init__.py +0 -0
  55. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/__main__.py +0 -0
  56. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_extras.json +0 -0
  57. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/.gitkeep +0 -0
  58. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/audio.txt +0 -0
  59. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/diarization.txt +0 -0
  60. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/faster-whisper.txt +0 -0
  61. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/kokoro.txt +0 -0
  62. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/llm.txt +0 -0
  63. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/memory.txt +0 -0
  64. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  65. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/piper.txt +0 -0
  66. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/rag.txt +0 -0
  67. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/server.txt +0 -0
  68. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/speed.txt +0 -0
  69. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/vad.txt +0 -0
  70. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/vectordb.txt +0 -0
  71. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  72. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/wyoming.txt +0 -0
  73. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_tools.py +0 -0
  74. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/__init__.py +0 -0
  75. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/_voice_agent_common.py +0 -0
  76. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/assistant.py +0 -0
  77. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/autocorrect.py +0 -0
  78. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/chat.py +0 -0
  79. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/diarize_live_session.py +0 -0
  80. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/memory/__init__.py +0 -0
  81. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/memory/add.py +0 -0
  82. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/memory/proxy.py +0 -0
  83. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/rag_proxy.py +0 -0
  84. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/speak.py +0 -0
  85. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/speakers.py +0 -0
  86. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/transcribe.py +0 -0
  87. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/transcribe_live.py +0 -0
  88. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/voice_edit.py +0 -0
  89. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/api.py +0 -0
  90. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/cli.py +0 -0
  91. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/config.py +0 -0
  92. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/config_cmd.py +0 -0
  93. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/constants.py +0 -0
  94. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/__init__.py +0 -0
  95. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/alignment.py +0 -0
  96. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/audio.py +0 -0
  97. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/audio_format.py +0 -0
  98. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/chroma.py +0 -0
  99. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/deps.py +0 -0
  100. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/diarization.py +0 -0
  101. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/openai_proxy.py +0 -0
  102. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/process.py +0 -0
  103. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/reranker.py +0 -0
  104. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/speaker_identity.py +0 -0
  105. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/sse.py +0 -0
  106. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/transcription_logger.py +0 -0
  107. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/utils.py +0 -0
  108. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/vad.py +0 -0
  109. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/watch.py +0 -0
  110. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/daemon/__init__.py +0 -0
  111. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/daemon/cli.py +0 -0
  112. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/__init__.py +0 -0
  113. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/_branch_name.py +0 -0
  114. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/_config.py +0 -0
  115. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/_output.py +0 -0
  116. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/cleanup.py +0 -0
  117. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/cli.py +0 -0
  118. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/__init__.py +0 -0
  119. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/aider.py +0 -0
  120. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/base.py +0 -0
  121. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/claude.py +0 -0
  122. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/codex.py +0 -0
  123. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  124. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/copilot.py +0 -0
  125. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  126. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/gemini.py +0 -0
  127. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/opencode.py +0 -0
  128. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/registry.py +0 -0
  129. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/__init__.py +0 -0
  130. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/base.py +0 -0
  131. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/cursor.py +0 -0
  132. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/emacs.py +0 -0
  133. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/jetbrains.py +0 -0
  134. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/nano.py +0 -0
  135. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/neovim.py +0 -0
  136. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/registry.py +0 -0
  137. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/sublime.py +0 -0
  138. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/vim.py +0 -0
  139. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/vscode.py +0 -0
  140. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/zed.py +0 -0
  141. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/hooks.py +0 -0
  142. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/launch.py +0 -0
  143. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/project.py +0 -0
  144. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/registry.py +0 -0
  145. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/skill/SKILL.md +0 -0
  146. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/skill/examples.md +0 -0
  147. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/__init__.py +0 -0
  148. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  149. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/base.py +0 -0
  150. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/gnome.py +0 -0
  151. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/iterm2.py +0 -0
  152. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/kitty.py +0 -0
  153. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/registry.py +0 -0
  154. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/tmux.py +0 -0
  155. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/warp.py +0 -0
  156. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/zellij.py +0 -0
  157. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/worktree.py +0 -0
  158. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/docs_gen.py +0 -0
  159. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/example-config.toml +0 -0
  160. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/install/__init__.py +0 -0
  161. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/install/common.py +0 -0
  162. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/install/extras.py +0 -0
  163. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/install/hotkeys.py +0 -0
  164. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/install/launchd.py +0 -0
  165. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/install/service_config.py +0 -0
  166. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/install/services.py +0 -0
  167. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/install/systemd.py +0 -0
  168. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/__init__.py +0 -0
  169. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_files.py +0 -0
  170. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_filters.py +0 -0
  171. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_git.py +0 -0
  172. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_indexer.py +0 -0
  173. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_ingest.py +0 -0
  174. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_persistence.py +0 -0
  175. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_prompt.py +0 -0
  176. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_retrieval.py +0 -0
  177. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_store.py +0 -0
  178. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_streaming.py +0 -0
  179. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_tasks.py +0 -0
  180. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/api.py +0 -0
  181. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/client.py +0 -0
  182. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/engine.py +0 -0
  183. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/entities.py +0 -0
  184. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/models.py +0 -0
  185. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/opts.py +0 -0
  186. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/py.typed +0 -0
  187. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/__init__.py +0 -0
  188. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/_indexer.py +0 -0
  189. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/_indexing.py +0 -0
  190. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/_prompt.py +0 -0
  191. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/_retriever.py +0 -0
  192. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/_store.py +0 -0
  193. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/_utils.py +0 -0
  194. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/api.py +0 -0
  195. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/client.py +0 -0
  196. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/engine.py +0 -0
  197. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/models.py +0 -0
  198. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  199. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/__init__.py +0 -0
  200. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  201. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  202. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  203. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  204. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  205. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  206. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  207. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  208. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  209. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  210. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  211. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  212. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  213. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  214. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/run-openwakeword.sh +0 -0
  215. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  216. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/setup-linux.sh +0 -0
  217. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  218. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/setup-macos.sh +0 -0
  219. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/setup-windows.ps1 +0 -0
  220. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  221. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/start-all-services.sh +0 -0
  222. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/__init__.py +0 -0
  223. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/cli.py +0 -0
  224. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/common.py +0 -0
  225. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/model_manager.py +0 -0
  226. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/model_registry.py +0 -0
  227. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/proxy/__init__.py +0 -0
  228. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/proxy/api.py +0 -0
  229. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/streaming.py +0 -0
  230. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/tts/__init__.py +0 -0
  231. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/tts/api.py +0 -0
  232. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/tts/backends/__init__.py +0 -0
  233. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/tts/backends/base.py +0 -0
  234. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/tts/backends/kokoro.py +0 -0
  235. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/tts/backends/piper.py +0 -0
  236. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/tts/model_manager.py +0 -0
  237. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/tts/model_registry.py +0 -0
  238. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/tts/wyoming_handler.py +0 -0
  239. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/__init__.py +0 -0
  240. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/api.py +0 -0
  241. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/backends/__init__.py +0 -0
  242. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/backends/base.py +0 -0
  243. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  244. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/backends/mlx.py +0 -0
  245. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/backends/transformers.py +0 -0
  246. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/languages.py +0 -0
  247. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/model_manager.py +0 -0
  248. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/model_registry.py +0 -0
  249. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  250. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/services/__init__.py +0 -0
  251. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/services/_wyoming_utils.py +0 -0
  252. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/services/asr.py +0 -0
  253. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/services/llm.py +0 -0
  254. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/services/tts.py +0 -0
  255. {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/services/wake_word.py +0 -0
  256. {agent_cli-0.96.3 → agent_cli-0.96.5}/docker/docker-compose.yml +0 -0
  257. {agent_cli-0.96.3 → agent_cli-0.96.5}/docker/memory-proxy.Dockerfile +0 -0
  258. {agent_cli-0.96.3 → agent_cli-0.96.5}/docker/rag-proxy.Dockerfile +0 -0
  259. {agent_cli-0.96.3 → agent_cli-0.96.5}/docker/transcribe-proxy.Dockerfile +0 -0
  260. {agent_cli-0.96.3 → agent_cli-0.96.5}/docker/tts.Dockerfile +0 -0
  261. {agent_cli-0.96.3 → agent_cli-0.96.5}/docker/whisper.Dockerfile +0 -0
  262. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/CNAME +0 -0
  263. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/architecture/index.md +0 -0
  264. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/architecture/memory.md +0 -0
  265. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/architecture/rag.md +0 -0
  266. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/assistant.md +0 -0
  267. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/autocorrect.md +0 -0
  268. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/chat.md +0 -0
  269. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/config.md +0 -0
  270. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/daemon.md +0 -0
  271. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/dev.md +0 -0
  272. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/diarize-live-session.md +0 -0
  273. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/index.md +0 -0
  274. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/install-extras.md +0 -0
  275. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/install-hotkeys.md +0 -0
  276. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/install-services.md +0 -0
  277. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/memory.md +0 -0
  278. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/rag-proxy.md +0 -0
  279. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/server/index.md +0 -0
  280. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/server/transcribe-proxy.md +0 -0
  281. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/server/tts.md +0 -0
  282. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/server/whisper.md +0 -0
  283. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/speak.md +0 -0
  284. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/speakers.md +0 -0
  285. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/start-services.md +0 -0
  286. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/transcribe-live.md +0 -0
  287. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/transcribe.md +0 -0
  288. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/voice-edit.md +0 -0
  289. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/configuration.md +0 -0
  290. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/getting-started.md +0 -0
  291. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/iOS_Shortcut_Guide.md +0 -0
  292. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/index.md +0 -0
  293. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/installation/docker.md +0 -0
  294. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/installation/index.md +0 -0
  295. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/installation/linux.md +0 -0
  296. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/installation/macos-app.md +0 -0
  297. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/installation/macos.md +0 -0
  298. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/installation/nixos.md +0 -0
  299. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/installation/windows.md +0 -0
  300. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/logo-avatar.svg +0 -0
  301. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/logo-clean.svg +0 -0
  302. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  303. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/run_markdown_code_runner.py +0 -0
  304. {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/system-integration.md +0 -0
  305. {agent_cli-0.96.3 → agent_cli-0.96.5}/example.agent-cli-config.toml +0 -0
  306. {agent_cli-0.96.3 → agent_cli-0.96.5}/justfile +0 -0
  307. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Package.resolved +0 -0
  308. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Package.swift +0 -0
  309. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/README.md +0 -0
  310. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
  311. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Resources/Info.plist +0 -0
  312. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
  313. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
  314. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
  315. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
  316. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
  317. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
  318. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
  319. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
  320. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
  321. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
  322. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatus.swift +0 -0
  323. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
  324. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
  325. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
  326. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +0 -0
  327. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
  328. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
  329. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
  330. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
  331. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
  332. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/build-macos-app.sh +0 -0
  333. {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/test-macos-app-e2e.sh +0 -0
  334. {agent_cli-0.96.3 → agent_cli-0.96.5}/pyproject.toml +0 -0
  335. {agent_cli-0.96.3 → agent_cli-0.96.5}/reddit.md +0 -0
  336. {agent_cli-0.96.3 → agent_cli-0.96.5}/shell.nix +0 -0
  337. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/__init__.py +0 -0
  338. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/__init__.py +0 -0
  339. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_fix_my_text.py +0 -0
  340. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_interactive.py +0 -0
  341. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_interactive_extra.py +0 -0
  342. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_memory_add.py +0 -0
  343. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_speak.py +0 -0
  344. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_speak_e2e.py +0 -0
  345. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_speakers.py +0 -0
  346. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_transcribe.py +0 -0
  347. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_transcribe_agent.py +0 -0
  348. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_transcribe_e2e.py +0 -0
  349. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_transcribe_live.py +0 -0
  350. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_transcribe_recovery.py +0 -0
  351. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_tts_common.py +0 -0
  352. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_tts_common_extra.py +0 -0
  353. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_voice_agent_common.py +0 -0
  354. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_voice_edit.py +0 -0
  355. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_voice_edit_e2e.py +0 -0
  356. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_wake_word_assistant.py +0 -0
  357. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/conftest.py +0 -0
  358. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/core/__init__.py +0 -0
  359. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/core/test_audio.py +0 -0
  360. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/core/test_audio_format.py +0 -0
  361. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/core/test_chroma.py +0 -0
  362. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/core/test_sse.py +0 -0
  363. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/core/test_vad.py +0 -0
  364. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/core/test_watch.py +0 -0
  365. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/__init__.py +0 -0
  366. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_cleanup.py +0 -0
  367. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_cli.py +0 -0
  368. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_coding_agents.py +0 -0
  369. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_editors.py +0 -0
  370. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_hooks.py +0 -0
  371. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_launch.py +0 -0
  372. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_project.py +0 -0
  373. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_terminals.py +0 -0
  374. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_verification.py +0 -0
  375. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_worktree.py +0 -0
  376. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/install/__init__.py +0 -0
  377. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/install/test_extras.py +0 -0
  378. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/install/test_launchd.py +0 -0
  379. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/__init__.py +0 -0
  380. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_api_health.py +0 -0
  381. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_api_integration_liveish.py +0 -0
  382. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_client.py +0 -0
  383. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_engine.py +0 -0
  384. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_files.py +0 -0
  385. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_filters.py +0 -0
  386. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_git_integration.py +0 -0
  387. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_indexer.py +0 -0
  388. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_memory_integration.py +0 -0
  389. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_proxy_passthrough.py +0 -0
  390. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_store.py +0 -0
  391. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_utils.py +0 -0
  392. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/mocks/__init__.py +0 -0
  393. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/mocks/audio.py +0 -0
  394. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/mocks/llm.py +0 -0
  395. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/mocks/wyoming.py +0 -0
  396. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/__init__.py +0 -0
  397. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_api.py +0 -0
  398. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_engine.py +0 -0
  399. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_history.py +0 -0
  400. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_indexer.py +0 -0
  401. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_indexing.py +0 -0
  402. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_rag_client.py +0 -0
  403. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_rag_integration_liveish.py +0 -0
  404. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  405. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_retriever.py +0 -0
  406. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_store.py +0 -0
  407. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_utils.py +0 -0
  408. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_alignment.py +0 -0
  409. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_api.py +0 -0
  410. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_api_integration.py +0 -0
  411. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_asr.py +0 -0
  412. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_asr_recovery.py +0 -0
  413. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_audio_e2e.py +0 -0
  414. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_cli.py +0 -0
  415. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_config.py +0 -0
  416. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_config_cmd.py +0 -0
  417. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_daemon.py +0 -0
  418. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_diarization.py +0 -0
  419. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_diarize_live_session.py +0 -0
  420. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_docs_gen.py +0 -0
  421. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_env_vars.py +0 -0
  422. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_faster_whisper_backend.py +0 -0
  423. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_json_output.py +0 -0
  424. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_llm.py +0 -0
  425. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_llm_gemini.py +0 -0
  426. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_memory_tools.py +0 -0
  427. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_mlx_backend.py +0 -0
  428. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_normalize_appcast.py +0 -0
  429. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_process_manager.py +0 -0
  430. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_requires_extras.py +0 -0
  431. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_server_streaming.py +0 -0
  432. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_server_tts.py +0 -0
  433. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_server_whisper.py +0 -0
  434. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_services.py +0 -0
  435. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_speaker_identity.py +0 -0
  436. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_tools.py +0 -0
  437. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_transformers_backend.py +0 -0
  438. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_tts.py +0 -0
  439. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_update_cask.py +0 -0
  440. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_utils.py +0 -0
  441. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_wake_word.py +0 -0
  442. {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_wyoming_utils.py +0 -0
  443. {agent_cli-0.96.3 → agent_cli-0.96.5}/uv.lock +0 -0
  444. {agent_cli-0.96.3 → agent_cli-0.96.5}/zensical.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  cask "agent-cli" do
2
- version "0.96.2"
3
- sha256 "7a059c89ab2476d90a4cabcb547c51179901329aa899cc7411d580d14c143727"
2
+ version "0.96.4"
3
+ sha256 "f80e56d625745e1342a01550c38909916f09442588ad35cd6063a2ad2eae4e8e"
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.96.3
3
+ Version: 0.96.5
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>
@@ -18,11 +18,6 @@ private enum HoldTranscriptionState {
18
18
  }
19
19
  }
20
20
 
21
- private struct ActiveCommandActivity {
22
- let title: String
23
- let startedAt: Date
24
- }
25
-
26
21
  @MainActor
27
22
  final class AgentCommandRunner: ObservableObject {
28
23
  static let shared = AgentCommandRunner()
@@ -36,11 +31,7 @@ final class AgentCommandRunner: ObservableObject {
36
31
  private var recordingIndicator = RecordingIndicatorController()
37
32
  private let pasteController: TranscriptPasteController
38
33
  private let bootstrap: AgentBootstrap
39
- private var bootstrapPhaseStartedAt: Date?
40
- private var recordingStartedAt: Date?
41
- private var transcribingStartedAt: Date?
42
- private var activeCommandActivities: [String: ActiveCommandActivity] = [:]
43
- private var activeCommandActivityOrder: [String] = []
34
+ private var activityTracker = MenuActivityTracker()
44
35
  private var pendingStopRecordingCommands: Set<String> = []
45
36
  private var holdTranscriptionState: HoldTranscriptionState = .idle
46
37
  private var holdToTranscribePasteTarget: FocusedTextTarget?
@@ -60,36 +51,20 @@ final class AgentCommandRunner: ObservableObject {
60
51
  }
61
52
 
62
53
  func menuActivityStatus(now: Date) -> MenuActivityStatus {
63
- if bootstrapPhase.isPreparing {
64
- return MenuActivityStatus.active(
65
- title: bootstrapPhase.activityTitle,
66
- startedAt: bootstrapPhaseStartedAt ?? now,
67
- now: now
68
- )
69
- }
70
- if let transcribingStartedAt {
71
- return MenuActivityStatus.active(title: "Transcribing", startedAt: transcribingStartedAt, now: now)
72
- }
73
- if isRecording {
74
- return MenuActivityStatus.active(title: "Recording", startedAt: recordingStartedAt ?? now, now: now)
75
- }
76
- if let activity = currentCommandActivity {
77
- return MenuActivityStatus.active(title: activity.title, startedAt: activity.startedAt, now: now)
78
- }
79
54
  if hasLastError && statusMessage.localizedCaseInsensitiveContains("failed") {
80
- return MenuActivityStatus.inactive(message: "Last command failed")
55
+ return activityTracker.status(
56
+ now: now,
57
+ fallback: MenuActivityStatus.inactive(message: "Last command failed")
58
+ )
81
59
  }
82
- return MenuActivityStatus.completed(title: Self.compactMenuStatus(statusMessage))
60
+ return activityTracker.status(
61
+ now: now,
62
+ fallback: MenuActivityStatus.completed(title: Self.compactMenuStatus(statusMessage))
63
+ )
83
64
  }
84
65
 
85
66
  var menuBarIconState: MenuBarIconState {
86
- if isRecording {
87
- return .recording
88
- }
89
- if bootstrapPhase.isPreparing {
90
- return .preparing
91
- }
92
- return .idle
67
+ MenuBarIconState.current(isPreparing: bootstrapPhase.isPreparing, isRecording: isRecording)
93
68
  }
94
69
 
95
70
  init(
@@ -146,10 +121,10 @@ final class AgentCommandRunner: ObservableObject {
146
121
  bootstrapPhase = phase
147
122
  if phase.isPreparing {
148
123
  if !wasPreparing || phaseChanged {
149
- bootstrapPhaseStartedAt = Date()
124
+ activityTracker.beginBootstrap(title: phase.activityTitle)
150
125
  }
151
126
  } else {
152
- bootstrapPhaseStartedAt = nil
127
+ activityTracker.finishBootstrap()
153
128
  }
154
129
  }
155
130
 
@@ -390,34 +365,21 @@ final class AgentCommandRunner: ObservableObject {
390
365
  pendingStopRecordingCommands.remove(command.identifier)
391
366
  }
392
367
 
393
- private var currentCommandActivity: ActiveCommandActivity? {
394
- activeCommandActivityOrder.reversed().compactMap { activeCommandActivities[$0] }.first
395
- }
396
-
397
368
  private func beginCommandActivity(for command: AgentCommand) {
398
- if activeCommandActivities[command.identifier] == nil {
399
- activeCommandActivityOrder.append(command.identifier)
400
- }
401
- activeCommandActivities[command.identifier] = ActiveCommandActivity(
402
- title: command.menuActivityTitle,
403
- startedAt: Date()
404
- )
369
+ activityTracker.beginCommand(identifier: command.identifier, title: command.menuActivityTitle)
405
370
  }
406
371
 
407
372
  private func finishCommandActivity(for command: AgentCommand) {
408
- activeCommandActivities.removeValue(forKey: command.identifier)
409
- activeCommandActivityOrder.removeAll { $0 == command.identifier }
373
+ activityTracker.finishCommand(identifier: command.identifier)
410
374
  }
411
375
 
412
376
  private func beginTranscribingActivity() {
413
- if transcribingStartedAt == nil {
414
- transcribingStartedAt = Date()
415
- }
377
+ activityTracker.beginTranscribing()
416
378
  }
417
379
 
418
380
  private func clearTranscribingActivityIfFinished() {
419
381
  if pendingStopRecordingCommands.isEmpty && !holdTranscriptionState.isFinishing {
420
- transcribingStartedAt = nil
382
+ activityTracker.finishTranscribing()
421
383
  }
422
384
  }
423
385
 
@@ -447,7 +409,7 @@ final class AgentCommandRunner: ObservableObject {
447
409
  recordingIndicator.begin(for: command)
448
410
  isRecording = recordingIndicator.isRecording
449
411
  if !wasRecording && isRecording {
450
- recordingStartedAt = Date()
412
+ activityTracker.beginRecording()
451
413
  }
452
414
  return true
453
415
  }
@@ -456,7 +418,7 @@ final class AgentCommandRunner: ObservableObject {
456
418
  recordingIndicator.end(for: command)
457
419
  isRecording = recordingIndicator.isRecording
458
420
  if !isRecording {
459
- recordingStartedAt = nil
421
+ activityTracker.finishRecording()
460
422
  }
461
423
  }
462
424
 
@@ -12,6 +12,21 @@ private enum AgentCLIRuntimeMode: Equatable {
12
12
  }
13
13
  }
14
14
 
15
+ private final class UserInstalledCLICheckCache {
16
+ private let lock = NSLock()
17
+ private var isAvailable = false
18
+
19
+ func hasSuccessfulCheck() -> Bool {
20
+ lock.withLock { isAvailable }
21
+ }
22
+
23
+ func update(with result: CommandResult) {
24
+ lock.withLock {
25
+ isAvailable = result.exitCode == 0
26
+ }
27
+ }
28
+ }
29
+
15
30
  typealias AgentProcessRunner = (URL, [String], [String: String]) -> CommandResult
16
31
  typealias LocalhostConnector = (UInt16) -> Bool
17
32
 
@@ -42,6 +57,7 @@ struct AgentRuntime {
42
57
  private let userDefaults: UserDefaults
43
58
  private let processRunner: AgentProcessRunner
44
59
  private let localhostConnector: LocalhostConnector
60
+ private let userInstalledCLICheckCache: UserInstalledCLICheckCache
45
61
  private let whisperReadyTimeout: TimeInterval
46
62
  let appSupportURL: URL
47
63
  let bundledUVURL: URL
@@ -73,6 +89,7 @@ struct AgentRuntime {
73
89
  self.userDefaults = userDefaults
74
90
  self.processRunner = processRunner
75
91
  self.localhostConnector = localhostConnector
92
+ self.userInstalledCLICheckCache = UserInstalledCLICheckCache()
76
93
  self.whisperReadyTimeout = whisperReadyTimeout
77
94
 
78
95
  if let override = environment["AGENTCLI_APP_SUPPORT_DIR"], !override.isEmpty {
@@ -196,8 +213,13 @@ struct AgentRuntime {
196
213
  }
197
214
 
198
215
  if mode == .userInstalled {
216
+ if !force, userInstalledCLICheckCache.hasSuccessfulCheck() {
217
+ return CommandResult(exitCode: 0, output: "")
218
+ }
199
219
  progress(.checkingRuntime)
200
- return ensureUserInstalledCLIAvailable()
220
+ let result = ensureUserInstalledCLIAvailable()
221
+ userInstalledCLICheckCache.update(with: result)
222
+ return result
201
223
  }
202
224
 
203
225
  if !force,
@@ -217,7 +217,6 @@ final class ConfigurableHotkeyController {
217
217
 
218
218
  private func handleFunctionKeyChanged(type: CGEventType, event: CGEvent) -> Bool {
219
219
  guard type == .flagsChanged,
220
- Int(event.getIntegerValueField(.keyboardEventKeycode)) == kVK_Function,
221
220
  let shortcut = KeyboardShortcuts.getShortcut(for: .holdToTranscribe),
222
221
  isBareFunctionShortcut(shortcut) else {
223
222
  return false
@@ -225,12 +224,13 @@ final class ConfigurableHotkeyController {
225
224
 
226
225
  let isFunctionDown = event.flags.contains(CGEventFlags.maskSecondaryFn)
227
226
  if isFunctionDown {
228
- guard !functionKeyIsDown else { return true }
227
+ guard !functionKeyIsDown else { return false }
229
228
  functionKeyIsDown = true
230
229
  schedulePendingHoldToTranscribe()
231
230
  return true
232
231
  }
233
232
 
233
+ guard functionKeyIsDown else { return false }
234
234
  functionKeyIsDown = false
235
235
  cancelPendingHoldToTranscribe()
236
236
  guard !suppressNextFunctionKeyRelease else {
@@ -0,0 +1,26 @@
1
+ import AppKit
2
+
3
+ @MainActor
4
+ final class MenuActivityStatusRow {
5
+ private let prefix: String
6
+ private let item: NSMenuItem
7
+ private let separator: NSMenuItem
8
+
9
+ init(prefix: String) {
10
+ self.prefix = prefix
11
+ item = NSMenuItem(title: "", action: nil, keyEquivalent: "")
12
+ item.isEnabled = false
13
+ separator = .separator()
14
+ }
15
+
16
+ func add(to menu: NSMenu) {
17
+ menu.addItem(item)
18
+ menu.addItem(separator)
19
+ }
20
+
21
+ func update(_ activityStatus: MenuActivityStatus) {
22
+ item.title = "\(prefix)\(activityStatus.message)"
23
+ item.isHidden = !activityStatus.isActive
24
+ separator.isHidden = !activityStatus.isActive
25
+ }
26
+ }
@@ -0,0 +1,64 @@
1
+ import Foundation
2
+
3
+ struct MenuActivityTracker {
4
+ private struct Activity {
5
+ let title: String
6
+ let startedAt: Date
7
+ }
8
+
9
+ private var bootstrapActivity: Activity?
10
+ private var recordingActivity: Activity?
11
+ private var transcribingActivity: Activity?
12
+ private var commandActivities: [String: Activity] = [:]
13
+ private var commandActivityOrder: [String] = []
14
+
15
+ mutating func beginBootstrap(title: String, at startedAt: Date = Date()) {
16
+ bootstrapActivity = Activity(title: title, startedAt: startedAt)
17
+ }
18
+
19
+ mutating func finishBootstrap() {
20
+ bootstrapActivity = nil
21
+ }
22
+
23
+ mutating func beginRecording(at startedAt: Date = Date()) {
24
+ guard recordingActivity == nil else { return }
25
+ recordingActivity = Activity(title: "Recording", startedAt: startedAt)
26
+ }
27
+
28
+ mutating func finishRecording() {
29
+ recordingActivity = nil
30
+ }
31
+
32
+ mutating func beginTranscribing(at startedAt: Date = Date()) {
33
+ guard transcribingActivity == nil else { return }
34
+ transcribingActivity = Activity(title: "Transcribing", startedAt: startedAt)
35
+ }
36
+
37
+ mutating func finishTranscribing() {
38
+ transcribingActivity = nil
39
+ }
40
+
41
+ mutating func beginCommand(identifier: String, title: String, at startedAt: Date = Date()) {
42
+ if commandActivities[identifier] == nil {
43
+ commandActivityOrder.append(identifier)
44
+ }
45
+ commandActivities[identifier] = Activity(title: title, startedAt: startedAt)
46
+ }
47
+
48
+ mutating func finishCommand(identifier: String) {
49
+ commandActivities.removeValue(forKey: identifier)
50
+ commandActivityOrder.removeAll { $0 == identifier }
51
+ }
52
+
53
+ func status(now: Date = Date(), fallback: MenuActivityStatus) -> MenuActivityStatus {
54
+ guard let activity = currentActivity else { return fallback }
55
+ return MenuActivityStatus.active(title: activity.title, startedAt: activity.startedAt, now: now)
56
+ }
57
+
58
+ private var currentActivity: Activity? {
59
+ bootstrapActivity
60
+ ?? transcribingActivity
61
+ ?? recordingActivity
62
+ ?? commandActivityOrder.reversed().compactMap { commandActivities[$0] }.first
63
+ }
64
+ }
@@ -6,6 +6,16 @@ enum MenuBarIconState: Equatable {
6
6
  case idle
7
7
  case preparing
8
8
  case recording
9
+
10
+ static func current(isPreparing: Bool, isRecording: Bool) -> Self {
11
+ if isPreparing {
12
+ return .preparing
13
+ }
14
+ if isRecording {
15
+ return .recording
16
+ }
17
+ return .idle
18
+ }
9
19
  }
10
20
 
11
21
  struct AgentCLIMenuBarIcon: View {
@@ -94,12 +104,15 @@ enum MenuBarIconImage {
94
104
 
95
105
  let image = NSImage(size: NSSize(width: 22, height: 18))
96
106
  image.lockFocus()
107
+ let logoRect = NSRect(x: 0, y: 0, width: 18, height: 18)
97
108
  avatar.draw(
98
- in: NSRect(x: 0, y: 0, width: 18, height: 18),
109
+ in: logoRect,
99
110
  from: .zero,
100
111
  operation: .sourceOver,
101
112
  fraction: 1
102
113
  )
114
+ NSColor.white.setFill()
115
+ logoRect.fill(using: .sourceIn)
103
116
 
104
117
  NSColor.white.setFill()
105
118
  NSBezierPath(ovalIn: NSRect(x: 12.5, y: 0.5, width: 10, height: 10)).fill()
@@ -18,7 +18,7 @@ enum RecordingSoundEvent: Hashable {
18
18
  case .startedRecording:
19
19
  return NSSound.Name("Frog")
20
20
  case .finishedRecording:
21
- return NSSound.Name("Funk")
21
+ return NSSound.Name("Purr")
22
22
  }
23
23
  }
24
24
  }
@@ -308,7 +308,7 @@ struct SettingsView: View {
308
308
  } header: {
309
309
  Text("General")
310
310
  } footer: {
311
- Text("Runs the agent-cli found on PATH with your normal config instead of the app's private bundled-uv runtime. Recording sounds use Frog when recording starts and Funk when recording ends.")
311
+ Text("Runs the agent-cli found on PATH with your normal config instead of the app's private bundled-uv runtime. Recording sounds use Frog when recording starts and Purr when recording ends.")
312
312
  }
313
313
 
314
314
  Section {
@@ -20,10 +20,8 @@ final class StatusMenuController: NSObject, NSMenuDelegate {
20
20
  private let recentRecordingsMenu = NSMenu()
21
21
  private let troubleshootingMenu = NSMenu()
22
22
  private var voiceStatusItem: NSMenuItem?
23
- private var recentActivityStatusItem: NSMenuItem?
24
- private var recentActivityStatusSeparator: NSMenuItem?
25
- private var troubleshootingActivityStatusItem: NSMenuItem?
26
- private var troubleshootingActivityStatusSeparator: NSMenuItem?
23
+ private var recentActivityStatusRow: MenuActivityStatusRow?
24
+ private var troubleshootingActivityStatusRow: MenuActivityStatusRow?
27
25
  private var statusRefreshTimer: Timer?
28
26
 
29
27
  private override init() {
@@ -113,12 +111,7 @@ final class StatusMenuController: NSObject, NSMenuDelegate {
113
111
 
114
112
  private func rebuildRecentRecordingsMenu() {
115
113
  recentRecordingsMenu.removeAllItems()
116
- let activityItem = disabledItem("")
117
- let activitySeparator = NSMenuItem.separator()
118
- recentRecordingsMenu.addItem(activityItem)
119
- recentRecordingsMenu.addItem(activitySeparator)
120
- recentActivityStatusItem = activityItem
121
- recentActivityStatusSeparator = activitySeparator
114
+ recentActivityStatusRow = activityStatusRow(in: recentRecordingsMenu)
122
115
 
123
116
  let recentTranscriptions = RecentTranscriptionReader.recentTranscriptions()
124
117
  if recentTranscriptions.isEmpty {
@@ -141,12 +134,7 @@ final class StatusMenuController: NSObject, NSMenuDelegate {
141
134
 
142
135
  private func rebuildTroubleshootingMenu() {
143
136
  troubleshootingMenu.removeAllItems()
144
- let activityItem = disabledItem("")
145
- let activitySeparator = NSMenuItem.separator()
146
- troubleshootingMenu.addItem(activityItem)
147
- troubleshootingMenu.addItem(activitySeparator)
148
- troubleshootingActivityStatusItem = activityItem
149
- troubleshootingActivityStatusSeparator = activitySeparator
137
+ troubleshootingActivityStatusRow = activityStatusRow(in: troubleshootingMenu)
150
138
 
151
139
  troubleshootingMenu.addItem(actionItem(
152
140
  "Voice Service Status",
@@ -240,26 +228,14 @@ final class StatusMenuController: NSObject, NSMenuDelegate {
240
228
  }
241
229
 
242
230
  private func updateSubmenuActivityStatus(_ activityStatus: MenuActivityStatus) {
243
- updateSubmenuActivityStatus(
244
- item: recentActivityStatusItem,
245
- separator: recentActivityStatusSeparator,
246
- activityStatus: activityStatus
247
- )
248
- updateSubmenuActivityStatus(
249
- item: troubleshootingActivityStatusItem,
250
- separator: troubleshootingActivityStatusSeparator,
251
- activityStatus: activityStatus
252
- )
231
+ recentActivityStatusRow?.update(activityStatus)
232
+ troubleshootingActivityStatusRow?.update(activityStatus)
253
233
  }
254
234
 
255
- private func updateSubmenuActivityStatus(
256
- item: NSMenuItem?,
257
- separator: NSMenuItem?,
258
- activityStatus: MenuActivityStatus
259
- ) {
260
- item?.title = "\(Self.activityStatusTitlePrefix)\(activityStatus.message)"
261
- item?.isHidden = !activityStatus.isActive
262
- separator?.isHidden = !activityStatus.isActive
235
+ private func activityStatusRow(in menu: NSMenu) -> MenuActivityStatusRow {
236
+ let row = MenuActivityStatusRow(prefix: Self.activityStatusTitlePrefix)
237
+ row.add(to: menu)
238
+ return row
263
239
  }
264
240
 
265
241
  private var usesUserInstalledAgentCLI: Bool {
@@ -195,7 +195,8 @@ final class VoiceLevelMeter: NSObject, ObservableObject {
195
195
 
196
196
  private static func normalizedPower(_ power: Float, minimumPower: Float) -> CGFloat {
197
197
  guard power > minimumPower else { return 0.08 }
198
- return CGFloat((power - minimumPower) / abs(minimumPower))
198
+ let linearLevel = CGFloat((power - minimumPower) / abs(minimumPower))
199
+ return CGFloat(sqrt(Double(linearLevel)))
199
200
  }
200
201
 
201
202
  private static func samples(from buffer: AVAudioPCMBuffer) -> [Float]? {
@@ -108,6 +108,33 @@ final class AgentCommandTests: XCTestCase {
108
108
  XCTAssertTrue(runtime.commandEnvironment()["PATH"]?.contains("/custom/bin") == true)
109
109
  }
110
110
 
111
+ func testUserInstalledRuntimeCachesSuccessfulCLIAvailabilityCheck() {
112
+ let defaults = UserDefaults(suiteName: "AgentCLITests.user-runtime-cache")!
113
+ defaults.removePersistentDomain(forName: "AgentCLITests.user-runtime-cache")
114
+ defaults.set(true, forKey: RuntimeSettings.useUserInstalledAgentCLIKey)
115
+ var processArguments: [[String]] = []
116
+ let runtime = AgentRuntime(
117
+ environment: [
118
+ "AGENTCLI_APP_SUPPORT_DIR": "/tmp/agentcli-test-support",
119
+ "PATH": "/custom/bin",
120
+ "SHELL": "/no/such/shell",
121
+ ],
122
+ userDefaults: defaults,
123
+ processRunner: { _, arguments, _ in
124
+ processArguments.append(arguments)
125
+ return CommandResult(exitCode: 0, output: "agent-cli 1.2.3")
126
+ }
127
+ )
128
+
129
+ var phases: [BootstrapPhase] = []
130
+ XCTAssertEqual(runtime.ensureReady(for: .cliRuntime) { phases.append($0) }.exitCode, 0)
131
+ XCTAssertEqual(runtime.ensureReady(for: .cliRuntime) { phases.append($0) }.exitCode, 0)
132
+ XCTAssertEqual(runtime.ensureReady(for: .cliRuntime, force: true) { phases.append($0) }.exitCode, 0)
133
+
134
+ XCTAssertEqual(processArguments, [["agent-cli", "--version"], ["agent-cli", "--version"]])
135
+ XCTAssertEqual(phases, [.checkingRuntime, .checkingRuntime])
136
+ }
137
+
111
138
  func testUserInstalledCLIPathUsesLoginShellPathAndCommonUvBins() {
112
139
  let defaults = UserDefaults(suiteName: "AgentCLITests.user-runtime-path")!
113
140
  defaults.removePersistentDomain(forName: "AgentCLITests.user-runtime-path")
@@ -280,6 +307,13 @@ final class AgentCommandTests: XCTestCase {
280
307
  )
281
308
  }
282
309
 
310
+ func testMenuBarIconShowsPreparingBeforeRecording() {
311
+ XCTAssertEqual(MenuBarIconState.current(isPreparing: false, isRecording: false), .idle)
312
+ XCTAssertEqual(MenuBarIconState.current(isPreparing: false, isRecording: true), .recording)
313
+ XCTAssertEqual(MenuBarIconState.current(isPreparing: true, isRecording: false), .preparing)
314
+ XCTAssertEqual(MenuBarIconState.current(isPreparing: true, isRecording: true), .preparing)
315
+ }
316
+
283
317
  func testMenuActivityStatusFormatsActiveWorkWithSpinnerAndElapsedCounter() {
284
318
  let startedAt = Date(timeIntervalSinceReferenceDate: 1_000)
285
319
  let now = Date(timeIntervalSinceReferenceDate: 1_125)
@@ -297,6 +331,68 @@ final class AgentCommandTests: XCTestCase {
297
331
  XCTAssertFalse(MenuActivityStatus.completed(title: "Ready").isActive)
298
332
  }
299
333
 
334
+ func testMenuActivityTrackerPrioritizesAndRestoresActivities() {
335
+ var tracker = MenuActivityTracker()
336
+ let startedAt = Date(timeIntervalSinceReferenceDate: 1_000)
337
+ let now = Date(timeIntervalSinceReferenceDate: 1_065)
338
+ let fallback = MenuActivityStatus.completed(title: "Ready")
339
+
340
+ tracker.beginCommand(identifier: "autocorrect", title: "Autocorrect Clipboard", at: startedAt)
341
+ XCTAssertEqual(
342
+ tracker.status(now: now, fallback: fallback),
343
+ MenuActivityStatus.active(title: "Autocorrect Clipboard", startedAt: startedAt, now: now)
344
+ )
345
+
346
+ tracker.beginRecording(at: startedAt.addingTimeInterval(10))
347
+ XCTAssertEqual(
348
+ tracker.status(now: now, fallback: fallback),
349
+ MenuActivityStatus.active(title: "Recording", startedAt: startedAt.addingTimeInterval(10), now: now)
350
+ )
351
+
352
+ tracker.beginTranscribing(at: startedAt.addingTimeInterval(20))
353
+ XCTAssertEqual(
354
+ tracker.status(now: now, fallback: fallback),
355
+ MenuActivityStatus.active(title: "Transcribing", startedAt: startedAt.addingTimeInterval(20), now: now)
356
+ )
357
+
358
+ tracker.beginBootstrap(title: "Installing CLI runtime", at: startedAt.addingTimeInterval(30))
359
+ XCTAssertEqual(
360
+ tracker.status(now: now, fallback: fallback),
361
+ MenuActivityStatus.active(
362
+ title: "Installing CLI runtime",
363
+ startedAt: startedAt.addingTimeInterval(30),
364
+ now: now
365
+ )
366
+ )
367
+
368
+ tracker.finishBootstrap()
369
+ XCTAssertEqual(
370
+ tracker.status(now: now, fallback: fallback),
371
+ MenuActivityStatus.active(title: "Transcribing", startedAt: startedAt.addingTimeInterval(20), now: now)
372
+ )
373
+
374
+ tracker.finishTranscribing()
375
+ tracker.finishRecording()
376
+ tracker.finishCommand(identifier: "autocorrect")
377
+
378
+ XCTAssertEqual(tracker.status(now: now, fallback: fallback), fallback)
379
+ }
380
+
381
+ func testMenuActivityTrackerRestoresPreviousCommandWhenLatestFinishes() {
382
+ var tracker = MenuActivityTracker()
383
+ let startedAt = Date(timeIntervalSinceReferenceDate: 2_000)
384
+ let fallback = MenuActivityStatus.completed(title: "Ready")
385
+
386
+ tracker.beginCommand(identifier: "first", title: "First Command", at: startedAt)
387
+ tracker.beginCommand(identifier: "second", title: "Second Command", at: startedAt.addingTimeInterval(4))
388
+ tracker.finishCommand(identifier: "second")
389
+
390
+ XCTAssertEqual(
391
+ tracker.status(now: startedAt.addingTimeInterval(12), fallback: fallback),
392
+ MenuActivityStatus.active(title: "First Command", startedAt: startedAt, now: startedAt.addingTimeInterval(12))
393
+ )
394
+ }
395
+
300
396
  @MainActor
301
397
  func testIdleMenuStatusUsesCompletedCheckmark() {
302
398
  let runner = AgentCommandRunner { _, _, _ in
@@ -1,4 +1,5 @@
1
1
  #if canImport(XCTest)
2
+ import AppKit
2
3
  import XCTest
3
4
  @testable import AgentCLI
4
5
 
@@ -28,6 +29,11 @@ final class RecordingIndicatorControllerTests: XCTestCase {
28
29
  XCTAssertEqual(player.events, [.startedRecording, .finishedRecording])
29
30
  }
30
31
 
32
+ func testRecordingSoundCueNamesUsePurrForFinishedRecording() {
33
+ XCTAssertEqual(RecordingSoundEvent.startedRecording.cueName, NSSound.Name("Frog"))
34
+ XCTAssertEqual(RecordingSoundEvent.finishedRecording.cueName, NSSound.Name("Purr"))
35
+ }
36
+
31
37
  func testFinishSoundPlaysOnlyWhenAllRecordingCommandsHaveEnded() {
32
38
  let defaults = UserDefaults(suiteName: "AgentCLITests.recording-sounds-nested")!
33
39
  defaults.removePersistentDomain(forName: "AgentCLITests.recording-sounds-nested")
@@ -9,7 +9,7 @@ final class VoiceLevelMeterTests: XCTestCase {
9
9
 
10
10
  let level = VoiceLevelMeter.normalizedLevel(from: quietTone)
11
11
 
12
- XCTAssertGreaterThan(level, 0.2)
12
+ XCTAssertGreaterThan(level, 0.5)
13
13
  }
14
14
 
15
15
  func testSilenceUsesIdleLevel() {