agent-cli 0.96.3__tar.gz → 0.96.4__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.4}/Casks/agent-cli.rb +2 -2
  2. {agent_cli-0.96.3 → agent_cli-0.96.4}/PKG-INFO +1 -1
  3. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +17 -49
  4. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +23 -1
  5. agent_cli-0.96.4/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatusRow.swift +26 -0
  6. agent_cli-0.96.4/macos/AgentCLI/Sources/AgentCLI/MenuActivityTracker.swift +64 -0
  7. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +10 -34
  8. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +89 -0
  9. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/appcast.xml +16 -0
  10. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_macos_app.py +2 -0
  11. {agent_cli-0.96.3 → agent_cli-0.96.4}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  12. {agent_cli-0.96.3 → agent_cli-0.96.4}/.claude/skills/agent-cli-dev/examples.md +0 -0
  13. {agent_cli-0.96.3 → agent_cli-0.96.4}/.claude-plugin/README.md +0 -0
  14. {agent_cli-0.96.3 → agent_cli-0.96.4}/.claude-plugin/marketplace.json +0 -0
  15. {agent_cli-0.96.3 → agent_cli-0.96.4}/.claude-plugin/plugin.json +0 -0
  16. {agent_cli-0.96.3 → agent_cli-0.96.4}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  17. {agent_cli-0.96.3 → agent_cli-0.96.4}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  18. {agent_cli-0.96.3 → agent_cli-0.96.4}/.cursorrules +0 -0
  19. {agent_cli-0.96.3 → agent_cli-0.96.4}/.dockerignore +0 -0
  20. {agent_cli-0.96.3 → agent_cli-0.96.4}/.env.example +0 -0
  21. {agent_cli-0.96.3 → agent_cli-0.96.4}/.github/logo.svg +0 -0
  22. {agent_cli-0.96.3 → agent_cli-0.96.4}/.github/release-drafter.yml +0 -0
  23. {agent_cli-0.96.3 → agent_cli-0.96.4}/.github/renovate.json +0 -0
  24. {agent_cli-0.96.3 → agent_cli-0.96.4}/.github/scripts/check_extras_sync.py +0 -0
  25. {agent_cli-0.96.3 → agent_cli-0.96.4}/.github/scripts/check_plugin_skill_sync.py +0 -0
  26. {agent_cli-0.96.3 → agent_cli-0.96.4}/.github/scripts/normalize_appcast.py +0 -0
  27. {agent_cli-0.96.3 → agent_cli-0.96.4}/.github/scripts/sync_extras.py +0 -0
  28. {agent_cli-0.96.3 → agent_cli-0.96.4}/.github/scripts/sync_requirements.py +0 -0
  29. {agent_cli-0.96.3 → agent_cli-0.96.4}/.github/scripts/update_cask.py +0 -0
  30. {agent_cli-0.96.3 → agent_cli-0.96.4}/.github/workflows/automerge.yml +0 -0
  31. {agent_cli-0.96.3 → agent_cli-0.96.4}/.github/workflows/docker.yml +0 -0
  32. {agent_cli-0.96.3 → agent_cli-0.96.4}/.github/workflows/docs.yml +0 -0
  33. {agent_cli-0.96.3 → agent_cli-0.96.4}/.github/workflows/markdown-code-runner.yml +0 -0
  34. {agent_cli-0.96.3 → agent_cli-0.96.4}/.github/workflows/pytest.yml +0 -0
  35. {agent_cli-0.96.3 → agent_cli-0.96.4}/.github/workflows/release-drafter.yml +0 -0
  36. {agent_cli-0.96.3 → agent_cli-0.96.4}/.github/workflows/release.yml +0 -0
  37. {agent_cli-0.96.3 → agent_cli-0.96.4}/.github/workflows/toc.yaml +0 -0
  38. {agent_cli-0.96.3 → agent_cli-0.96.4}/.gitignore +0 -0
  39. {agent_cli-0.96.3 → agent_cli-0.96.4}/.jscpd.json +0 -0
  40. {agent_cli-0.96.3 → agent_cli-0.96.4}/.pre-commit-config.yaml +0 -0
  41. {agent_cli-0.96.3 → agent_cli-0.96.4}/.prompts/docs-review.md +0 -0
  42. {agent_cli-0.96.3 → agent_cli-0.96.4}/.prompts/pr-review.md +0 -0
  43. {agent_cli-0.96.3 → agent_cli-0.96.4}/CLAUDE.md +0 -0
  44. {agent_cli-0.96.3 → agent_cli-0.96.4}/LICENSE +0 -0
  45. {agent_cli-0.96.3 → agent_cli-0.96.4}/LLAMA_SERVER_USAGE.md +0 -0
  46. {agent_cli-0.96.3 → agent_cli-0.96.4}/README.md +0 -0
  47. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/__init__.py +0 -0
  48. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/__main__.py +0 -0
  49. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/_extras.json +0 -0
  50. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/_requirements/.gitkeep +0 -0
  51. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/_requirements/audio.txt +0 -0
  52. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/_requirements/diarization.txt +0 -0
  53. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/_requirements/faster-whisper.txt +0 -0
  54. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/_requirements/kokoro.txt +0 -0
  55. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/_requirements/llm.txt +0 -0
  56. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/_requirements/memory.txt +0 -0
  57. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  58. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/_requirements/piper.txt +0 -0
  59. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/_requirements/rag.txt +0 -0
  60. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/_requirements/server.txt +0 -0
  61. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/_requirements/speed.txt +0 -0
  62. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/_requirements/vad.txt +0 -0
  63. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/_requirements/vectordb.txt +0 -0
  64. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  65. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/_requirements/wyoming.txt +0 -0
  66. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/_tools.py +0 -0
  67. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/agents/__init__.py +0 -0
  68. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/agents/_voice_agent_common.py +0 -0
  69. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/agents/assistant.py +0 -0
  70. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/agents/autocorrect.py +0 -0
  71. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/agents/chat.py +0 -0
  72. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/agents/diarize_live_session.py +0 -0
  73. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/agents/memory/__init__.py +0 -0
  74. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/agents/memory/add.py +0 -0
  75. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/agents/memory/proxy.py +0 -0
  76. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/agents/rag_proxy.py +0 -0
  77. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/agents/speak.py +0 -0
  78. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/agents/speakers.py +0 -0
  79. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/agents/transcribe.py +0 -0
  80. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/agents/transcribe_live.py +0 -0
  81. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/agents/voice_edit.py +0 -0
  82. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/api.py +0 -0
  83. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/cli.py +0 -0
  84. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/config.py +0 -0
  85. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/config_cmd.py +0 -0
  86. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/constants.py +0 -0
  87. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/core/__init__.py +0 -0
  88. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/core/alignment.py +0 -0
  89. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/core/audio.py +0 -0
  90. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/core/audio_format.py +0 -0
  91. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/core/chroma.py +0 -0
  92. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/core/deps.py +0 -0
  93. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/core/diarization.py +0 -0
  94. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/core/openai_proxy.py +0 -0
  95. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/core/process.py +0 -0
  96. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/core/reranker.py +0 -0
  97. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/core/speaker_identity.py +0 -0
  98. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/core/sse.py +0 -0
  99. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/core/transcription_logger.py +0 -0
  100. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/core/utils.py +0 -0
  101. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/core/vad.py +0 -0
  102. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/core/watch.py +0 -0
  103. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/daemon/__init__.py +0 -0
  104. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/daemon/cli.py +0 -0
  105. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/__init__.py +0 -0
  106. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/_branch_name.py +0 -0
  107. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/_config.py +0 -0
  108. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/_output.py +0 -0
  109. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/cleanup.py +0 -0
  110. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/cli.py +0 -0
  111. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/coding_agents/__init__.py +0 -0
  112. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/coding_agents/aider.py +0 -0
  113. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/coding_agents/base.py +0 -0
  114. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/coding_agents/claude.py +0 -0
  115. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/coding_agents/codex.py +0 -0
  116. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  117. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/coding_agents/copilot.py +0 -0
  118. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  119. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/coding_agents/gemini.py +0 -0
  120. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/coding_agents/opencode.py +0 -0
  121. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/coding_agents/registry.py +0 -0
  122. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/editors/__init__.py +0 -0
  123. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/editors/base.py +0 -0
  124. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/editors/cursor.py +0 -0
  125. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/editors/emacs.py +0 -0
  126. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/editors/jetbrains.py +0 -0
  127. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/editors/nano.py +0 -0
  128. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/editors/neovim.py +0 -0
  129. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/editors/registry.py +0 -0
  130. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/editors/sublime.py +0 -0
  131. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/editors/vim.py +0 -0
  132. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/editors/vscode.py +0 -0
  133. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/editors/zed.py +0 -0
  134. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/hooks.py +0 -0
  135. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/launch.py +0 -0
  136. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/project.py +0 -0
  137. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/registry.py +0 -0
  138. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/skill/SKILL.md +0 -0
  139. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/skill/examples.md +0 -0
  140. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/terminals/__init__.py +0 -0
  141. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  142. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/terminals/base.py +0 -0
  143. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/terminals/gnome.py +0 -0
  144. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/terminals/iterm2.py +0 -0
  145. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/terminals/kitty.py +0 -0
  146. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/terminals/registry.py +0 -0
  147. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/terminals/tmux.py +0 -0
  148. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/terminals/warp.py +0 -0
  149. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/terminals/zellij.py +0 -0
  150. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/dev/worktree.py +0 -0
  151. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/docs_gen.py +0 -0
  152. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/example-config.toml +0 -0
  153. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/install/__init__.py +0 -0
  154. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/install/common.py +0 -0
  155. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/install/extras.py +0 -0
  156. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/install/hotkeys.py +0 -0
  157. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/install/launchd.py +0 -0
  158. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/install/service_config.py +0 -0
  159. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/install/services.py +0 -0
  160. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/install/systemd.py +0 -0
  161. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/memory/__init__.py +0 -0
  162. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/memory/_files.py +0 -0
  163. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/memory/_filters.py +0 -0
  164. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/memory/_git.py +0 -0
  165. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/memory/_indexer.py +0 -0
  166. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/memory/_ingest.py +0 -0
  167. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/memory/_persistence.py +0 -0
  168. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/memory/_prompt.py +0 -0
  169. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/memory/_retrieval.py +0 -0
  170. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/memory/_store.py +0 -0
  171. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/memory/_streaming.py +0 -0
  172. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/memory/_tasks.py +0 -0
  173. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/memory/api.py +0 -0
  174. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/memory/client.py +0 -0
  175. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/memory/engine.py +0 -0
  176. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/memory/entities.py +0 -0
  177. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/memory/models.py +0 -0
  178. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/opts.py +0 -0
  179. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/py.typed +0 -0
  180. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/rag/__init__.py +0 -0
  181. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/rag/_indexer.py +0 -0
  182. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/rag/_indexing.py +0 -0
  183. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/rag/_prompt.py +0 -0
  184. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/rag/_retriever.py +0 -0
  185. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/rag/_store.py +0 -0
  186. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/rag/_utils.py +0 -0
  187. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/rag/api.py +0 -0
  188. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/rag/client.py +0 -0
  189. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/rag/engine.py +0 -0
  190. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/rag/models.py +0 -0
  191. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  192. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/__init__.py +0 -0
  193. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  194. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  195. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  196. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  197. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  198. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  199. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  200. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  201. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  202. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  203. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  204. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  205. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  206. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  207. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/run-openwakeword.sh +0 -0
  208. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  209. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/setup-linux.sh +0 -0
  210. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  211. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/setup-macos.sh +0 -0
  212. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/setup-windows.ps1 +0 -0
  213. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  214. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/scripts/start-all-services.sh +0 -0
  215. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/__init__.py +0 -0
  216. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/cli.py +0 -0
  217. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/common.py +0 -0
  218. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/model_manager.py +0 -0
  219. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/model_registry.py +0 -0
  220. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/proxy/__init__.py +0 -0
  221. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/proxy/api.py +0 -0
  222. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/streaming.py +0 -0
  223. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/tts/__init__.py +0 -0
  224. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/tts/api.py +0 -0
  225. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/tts/backends/__init__.py +0 -0
  226. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/tts/backends/base.py +0 -0
  227. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/tts/backends/kokoro.py +0 -0
  228. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/tts/backends/piper.py +0 -0
  229. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/tts/model_manager.py +0 -0
  230. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/tts/model_registry.py +0 -0
  231. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/tts/wyoming_handler.py +0 -0
  232. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/whisper/__init__.py +0 -0
  233. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/whisper/api.py +0 -0
  234. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/whisper/backends/__init__.py +0 -0
  235. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/whisper/backends/base.py +0 -0
  236. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  237. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/whisper/backends/mlx.py +0 -0
  238. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/whisper/backends/transformers.py +0 -0
  239. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/whisper/languages.py +0 -0
  240. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/whisper/model_manager.py +0 -0
  241. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/whisper/model_registry.py +0 -0
  242. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  243. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/services/__init__.py +0 -0
  244. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/services/_wyoming_utils.py +0 -0
  245. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/services/asr.py +0 -0
  246. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/services/llm.py +0 -0
  247. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/services/tts.py +0 -0
  248. {agent_cli-0.96.3 → agent_cli-0.96.4}/agent_cli/services/wake_word.py +0 -0
  249. {agent_cli-0.96.3 → agent_cli-0.96.4}/docker/docker-compose.yml +0 -0
  250. {agent_cli-0.96.3 → agent_cli-0.96.4}/docker/memory-proxy.Dockerfile +0 -0
  251. {agent_cli-0.96.3 → agent_cli-0.96.4}/docker/rag-proxy.Dockerfile +0 -0
  252. {agent_cli-0.96.3 → agent_cli-0.96.4}/docker/transcribe-proxy.Dockerfile +0 -0
  253. {agent_cli-0.96.3 → agent_cli-0.96.4}/docker/tts.Dockerfile +0 -0
  254. {agent_cli-0.96.3 → agent_cli-0.96.4}/docker/whisper.Dockerfile +0 -0
  255. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/CNAME +0 -0
  256. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/architecture/index.md +0 -0
  257. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/architecture/memory.md +0 -0
  258. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/architecture/rag.md +0 -0
  259. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/assistant.md +0 -0
  260. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/autocorrect.md +0 -0
  261. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/chat.md +0 -0
  262. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/config.md +0 -0
  263. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/daemon.md +0 -0
  264. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/dev.md +0 -0
  265. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/diarize-live-session.md +0 -0
  266. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/index.md +0 -0
  267. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/install-extras.md +0 -0
  268. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/install-hotkeys.md +0 -0
  269. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/install-services.md +0 -0
  270. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/memory.md +0 -0
  271. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/rag-proxy.md +0 -0
  272. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/server/index.md +0 -0
  273. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/server/transcribe-proxy.md +0 -0
  274. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/server/tts.md +0 -0
  275. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/server/whisper.md +0 -0
  276. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/speak.md +0 -0
  277. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/speakers.md +0 -0
  278. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/start-services.md +0 -0
  279. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/transcribe-live.md +0 -0
  280. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/transcribe.md +0 -0
  281. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/commands/voice-edit.md +0 -0
  282. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/configuration.md +0 -0
  283. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/getting-started.md +0 -0
  284. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/iOS_Shortcut_Guide.md +0 -0
  285. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/index.md +0 -0
  286. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/installation/docker.md +0 -0
  287. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/installation/index.md +0 -0
  288. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/installation/linux.md +0 -0
  289. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/installation/macos-app.md +0 -0
  290. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/installation/macos.md +0 -0
  291. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/installation/nixos.md +0 -0
  292. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/installation/windows.md +0 -0
  293. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/logo-avatar.svg +0 -0
  294. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/logo-clean.svg +0 -0
  295. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  296. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/run_markdown_code_runner.py +0 -0
  297. {agent_cli-0.96.3 → agent_cli-0.96.4}/docs/system-integration.md +0 -0
  298. {agent_cli-0.96.3 → agent_cli-0.96.4}/example.agent-cli-config.toml +0 -0
  299. {agent_cli-0.96.3 → agent_cli-0.96.4}/justfile +0 -0
  300. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Package.resolved +0 -0
  301. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Package.swift +0 -0
  302. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/README.md +0 -0
  303. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
  304. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Resources/Info.plist +0 -0
  305. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
  306. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
  307. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
  308. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
  309. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
  310. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
  311. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
  312. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
  313. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
  314. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
  315. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
  316. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatus.swift +0 -0
  317. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
  318. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
  319. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
  320. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
  321. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
  322. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +0 -0
  323. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +0 -0
  324. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
  325. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
  326. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
  327. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
  328. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
  329. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +0 -0
  330. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
  331. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/AgentCLI/Tests/AgentCLITests/VoiceLevelMeterTests.swift +0 -0
  332. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/build-macos-app.sh +0 -0
  333. {agent_cli-0.96.3 → agent_cli-0.96.4}/macos/test-macos-app-e2e.sh +0 -0
  334. {agent_cli-0.96.3 → agent_cli-0.96.4}/pyproject.toml +0 -0
  335. {agent_cli-0.96.3 → agent_cli-0.96.4}/reddit.md +0 -0
  336. {agent_cli-0.96.3 → agent_cli-0.96.4}/shell.nix +0 -0
  337. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/__init__.py +0 -0
  338. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/agents/__init__.py +0 -0
  339. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/agents/test_fix_my_text.py +0 -0
  340. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/agents/test_interactive.py +0 -0
  341. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/agents/test_interactive_extra.py +0 -0
  342. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/agents/test_memory_add.py +0 -0
  343. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/agents/test_speak.py +0 -0
  344. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/agents/test_speak_e2e.py +0 -0
  345. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/agents/test_speakers.py +0 -0
  346. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/agents/test_transcribe.py +0 -0
  347. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/agents/test_transcribe_agent.py +0 -0
  348. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/agents/test_transcribe_e2e.py +0 -0
  349. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/agents/test_transcribe_live.py +0 -0
  350. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/agents/test_transcribe_recovery.py +0 -0
  351. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/agents/test_tts_common.py +0 -0
  352. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/agents/test_tts_common_extra.py +0 -0
  353. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/agents/test_voice_agent_common.py +0 -0
  354. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/agents/test_voice_edit.py +0 -0
  355. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/agents/test_voice_edit_e2e.py +0 -0
  356. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/agents/test_wake_word_assistant.py +0 -0
  357. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/conftest.py +0 -0
  358. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/core/__init__.py +0 -0
  359. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/core/test_audio.py +0 -0
  360. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/core/test_audio_format.py +0 -0
  361. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/core/test_chroma.py +0 -0
  362. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/core/test_sse.py +0 -0
  363. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/core/test_vad.py +0 -0
  364. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/core/test_watch.py +0 -0
  365. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/dev/__init__.py +0 -0
  366. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/dev/test_cleanup.py +0 -0
  367. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/dev/test_cli.py +0 -0
  368. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/dev/test_coding_agents.py +0 -0
  369. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/dev/test_editors.py +0 -0
  370. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/dev/test_hooks.py +0 -0
  371. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/dev/test_launch.py +0 -0
  372. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/dev/test_project.py +0 -0
  373. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/dev/test_terminals.py +0 -0
  374. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/dev/test_verification.py +0 -0
  375. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/dev/test_worktree.py +0 -0
  376. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/install/__init__.py +0 -0
  377. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/install/test_extras.py +0 -0
  378. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/install/test_launchd.py +0 -0
  379. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/memory/__init__.py +0 -0
  380. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/memory/test_api_health.py +0 -0
  381. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/memory/test_api_integration_liveish.py +0 -0
  382. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/memory/test_client.py +0 -0
  383. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/memory/test_engine.py +0 -0
  384. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/memory/test_files.py +0 -0
  385. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/memory/test_filters.py +0 -0
  386. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/memory/test_git_integration.py +0 -0
  387. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/memory/test_indexer.py +0 -0
  388. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/memory/test_memory_integration.py +0 -0
  389. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/memory/test_proxy_passthrough.py +0 -0
  390. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/memory/test_store.py +0 -0
  391. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/memory/test_utils.py +0 -0
  392. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/mocks/__init__.py +0 -0
  393. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/mocks/audio.py +0 -0
  394. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/mocks/llm.py +0 -0
  395. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/mocks/wyoming.py +0 -0
  396. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/rag/__init__.py +0 -0
  397. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/rag/test_api.py +0 -0
  398. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/rag/test_engine.py +0 -0
  399. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/rag/test_history.py +0 -0
  400. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/rag/test_indexer.py +0 -0
  401. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/rag/test_indexing.py +0 -0
  402. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/rag/test_rag_client.py +0 -0
  403. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/rag/test_rag_integration_liveish.py +0 -0
  404. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  405. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/rag/test_retriever.py +0 -0
  406. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/rag/test_store.py +0 -0
  407. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/rag/test_utils.py +0 -0
  408. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_alignment.py +0 -0
  409. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_api.py +0 -0
  410. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_api_integration.py +0 -0
  411. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_asr.py +0 -0
  412. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_asr_recovery.py +0 -0
  413. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_audio_e2e.py +0 -0
  414. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_cli.py +0 -0
  415. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_config.py +0 -0
  416. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_config_cmd.py +0 -0
  417. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_daemon.py +0 -0
  418. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_diarization.py +0 -0
  419. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_diarize_live_session.py +0 -0
  420. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_docs_gen.py +0 -0
  421. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_env_vars.py +0 -0
  422. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_faster_whisper_backend.py +0 -0
  423. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_json_output.py +0 -0
  424. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_llm.py +0 -0
  425. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_llm_gemini.py +0 -0
  426. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_memory_tools.py +0 -0
  427. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_mlx_backend.py +0 -0
  428. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_normalize_appcast.py +0 -0
  429. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_process_manager.py +0 -0
  430. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_requires_extras.py +0 -0
  431. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_server_streaming.py +0 -0
  432. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_server_tts.py +0 -0
  433. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_server_whisper.py +0 -0
  434. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_services.py +0 -0
  435. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_speaker_identity.py +0 -0
  436. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_tools.py +0 -0
  437. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_transformers_backend.py +0 -0
  438. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_tts.py +0 -0
  439. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_update_cask.py +0 -0
  440. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_utils.py +0 -0
  441. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_wake_word.py +0 -0
  442. {agent_cli-0.96.3 → agent_cli-0.96.4}/tests/test_wyoming_utils.py +0 -0
  443. {agent_cli-0.96.3 → agent_cli-0.96.4}/uv.lock +0 -0
  444. {agent_cli-0.96.3 → agent_cli-0.96.4}/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.3"
3
+ sha256 "6346b0f335005094152ceb987b5e7d44fb08d817a07ca3433a05fba3fa85ec2f"
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.4
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,26 +51,16 @@ 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 {
@@ -146,10 +127,10 @@ final class AgentCommandRunner: ObservableObject {
146
127
  bootstrapPhase = phase
147
128
  if phase.isPreparing {
148
129
  if !wasPreparing || phaseChanged {
149
- bootstrapPhaseStartedAt = Date()
130
+ activityTracker.beginBootstrap(title: phase.activityTitle)
150
131
  }
151
132
  } else {
152
- bootstrapPhaseStartedAt = nil
133
+ activityTracker.finishBootstrap()
153
134
  }
154
135
  }
155
136
 
@@ -390,34 +371,21 @@ final class AgentCommandRunner: ObservableObject {
390
371
  pendingStopRecordingCommands.remove(command.identifier)
391
372
  }
392
373
 
393
- private var currentCommandActivity: ActiveCommandActivity? {
394
- activeCommandActivityOrder.reversed().compactMap { activeCommandActivities[$0] }.first
395
- }
396
-
397
374
  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
- )
375
+ activityTracker.beginCommand(identifier: command.identifier, title: command.menuActivityTitle)
405
376
  }
406
377
 
407
378
  private func finishCommandActivity(for command: AgentCommand) {
408
- activeCommandActivities.removeValue(forKey: command.identifier)
409
- activeCommandActivityOrder.removeAll { $0 == command.identifier }
379
+ activityTracker.finishCommand(identifier: command.identifier)
410
380
  }
411
381
 
412
382
  private func beginTranscribingActivity() {
413
- if transcribingStartedAt == nil {
414
- transcribingStartedAt = Date()
415
- }
383
+ activityTracker.beginTranscribing()
416
384
  }
417
385
 
418
386
  private func clearTranscribingActivityIfFinished() {
419
387
  if pendingStopRecordingCommands.isEmpty && !holdTranscriptionState.isFinishing {
420
- transcribingStartedAt = nil
388
+ activityTracker.finishTranscribing()
421
389
  }
422
390
  }
423
391
 
@@ -447,7 +415,7 @@ final class AgentCommandRunner: ObservableObject {
447
415
  recordingIndicator.begin(for: command)
448
416
  isRecording = recordingIndicator.isRecording
449
417
  if !wasRecording && isRecording {
450
- recordingStartedAt = Date()
418
+ activityTracker.beginRecording()
451
419
  }
452
420
  return true
453
421
  }
@@ -456,7 +424,7 @@ final class AgentCommandRunner: ObservableObject {
456
424
  recordingIndicator.end(for: command)
457
425
  isRecording = recordingIndicator.isRecording
458
426
  if !isRecording {
459
- recordingStartedAt = nil
427
+ activityTracker.finishRecording()
460
428
  }
461
429
  }
462
430
 
@@ -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,
@@ -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
+ }
@@ -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 {
@@ -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")
@@ -297,6 +324,68 @@ final class AgentCommandTests: XCTestCase {
297
324
  XCTAssertFalse(MenuActivityStatus.completed(title: "Ready").isActive)
298
325
  }
299
326
 
327
+ func testMenuActivityTrackerPrioritizesAndRestoresActivities() {
328
+ var tracker = MenuActivityTracker()
329
+ let startedAt = Date(timeIntervalSinceReferenceDate: 1_000)
330
+ let now = Date(timeIntervalSinceReferenceDate: 1_065)
331
+ let fallback = MenuActivityStatus.completed(title: "Ready")
332
+
333
+ tracker.beginCommand(identifier: "autocorrect", title: "Autocorrect Clipboard", at: startedAt)
334
+ XCTAssertEqual(
335
+ tracker.status(now: now, fallback: fallback),
336
+ MenuActivityStatus.active(title: "Autocorrect Clipboard", startedAt: startedAt, now: now)
337
+ )
338
+
339
+ tracker.beginRecording(at: startedAt.addingTimeInterval(10))
340
+ XCTAssertEqual(
341
+ tracker.status(now: now, fallback: fallback),
342
+ MenuActivityStatus.active(title: "Recording", startedAt: startedAt.addingTimeInterval(10), now: now)
343
+ )
344
+
345
+ tracker.beginTranscribing(at: startedAt.addingTimeInterval(20))
346
+ XCTAssertEqual(
347
+ tracker.status(now: now, fallback: fallback),
348
+ MenuActivityStatus.active(title: "Transcribing", startedAt: startedAt.addingTimeInterval(20), now: now)
349
+ )
350
+
351
+ tracker.beginBootstrap(title: "Installing CLI runtime", at: startedAt.addingTimeInterval(30))
352
+ XCTAssertEqual(
353
+ tracker.status(now: now, fallback: fallback),
354
+ MenuActivityStatus.active(
355
+ title: "Installing CLI runtime",
356
+ startedAt: startedAt.addingTimeInterval(30),
357
+ now: now
358
+ )
359
+ )
360
+
361
+ tracker.finishBootstrap()
362
+ XCTAssertEqual(
363
+ tracker.status(now: now, fallback: fallback),
364
+ MenuActivityStatus.active(title: "Transcribing", startedAt: startedAt.addingTimeInterval(20), now: now)
365
+ )
366
+
367
+ tracker.finishTranscribing()
368
+ tracker.finishRecording()
369
+ tracker.finishCommand(identifier: "autocorrect")
370
+
371
+ XCTAssertEqual(tracker.status(now: now, fallback: fallback), fallback)
372
+ }
373
+
374
+ func testMenuActivityTrackerRestoresPreviousCommandWhenLatestFinishes() {
375
+ var tracker = MenuActivityTracker()
376
+ let startedAt = Date(timeIntervalSinceReferenceDate: 2_000)
377
+ let fallback = MenuActivityStatus.completed(title: "Ready")
378
+
379
+ tracker.beginCommand(identifier: "first", title: "First Command", at: startedAt)
380
+ tracker.beginCommand(identifier: "second", title: "Second Command", at: startedAt.addingTimeInterval(4))
381
+ tracker.finishCommand(identifier: "second")
382
+
383
+ XCTAssertEqual(
384
+ tracker.status(now: startedAt.addingTimeInterval(12), fallback: fallback),
385
+ MenuActivityStatus.active(title: "First Command", startedAt: startedAt, now: startedAt.addingTimeInterval(12))
386
+ )
387
+ }
388
+
300
389
  @MainActor
301
390
  func testIdleMenuStatusUsesCompletedCheckmark() {
302
391
  let runner = AgentCommandRunner { _, _, _ in
@@ -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.96.3</title>
9
+ <pubDate>Fri, 29 May 2026 06:09:58 +0000</pubDate>
10
+ <link>https://github.com/basnijholt/agent-cli</link>
11
+ <sparkle:version>177</sparkle:version>
12
+ <sparkle:shortVersionString>0.96.3</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
+
17
+ * Restore volume-based wave overlay (#550) @basnijholt
18
+ * Add live menu activity timers (#549) @basnijholt
19
+
20
+ ]]></description>
21
+ <enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.96.3/AgentCLI.zip" length="22735617" type="application/octet-stream" sparkle:edSignature="GIH6s55wnjpesAtPrHdk5btvtZfxkFrqr1v0tX69WWlHdA9w+qTQFszuw8/K21wsmqnp3ynacGP7aa4YqrB7Bg=="/>
22
+ </item>
7
23
  <item>
8
24
  <title>0.96.2</title>
9
25
  <pubDate>Fri, 29 May 2026 05:56:37 +0000</pubDate>
@@ -51,6 +51,8 @@ def test_macos_app_package_files_exist() -> None:
51
51
  "FocusedTextTarget.swift",
52
52
  "MenuBarIcon.swift",
53
53
  "MenuActivityStatus.swift",
54
+ "MenuActivityStatusRow.swift",
55
+ "MenuActivityTracker.swift",
54
56
  "RecordingIndicatorController.swift",
55
57
  "SettingsWindowController.swift",
56
58
  "Shortcuts.swift",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes