agent-cli 0.95.6__tar.gz → 0.95.7__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 (427) hide show
  1. {agent_cli-0.95.6 → agent_cli-0.95.7}/PKG-INFO +1 -1
  2. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +1 -1
  3. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -6
  4. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +53 -16
  5. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +33 -9
  6. agent_cli-0.95.7/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +48 -0
  7. agent_cli-0.95.7/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +111 -0
  8. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +5 -1
  9. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_git_integration.py +1 -0
  10. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_macos_app.py +49 -10
  11. agent_cli-0.95.6/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -67
  12. {agent_cli-0.95.6 → agent_cli-0.95.7}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  13. {agent_cli-0.95.6 → agent_cli-0.95.7}/.claude/skills/agent-cli-dev/examples.md +0 -0
  14. {agent_cli-0.95.6 → agent_cli-0.95.7}/.claude-plugin/README.md +0 -0
  15. {agent_cli-0.95.6 → agent_cli-0.95.7}/.claude-plugin/marketplace.json +0 -0
  16. {agent_cli-0.95.6 → agent_cli-0.95.7}/.claude-plugin/plugin.json +0 -0
  17. {agent_cli-0.95.6 → agent_cli-0.95.7}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  18. {agent_cli-0.95.6 → agent_cli-0.95.7}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  19. {agent_cli-0.95.6 → agent_cli-0.95.7}/.cursorrules +0 -0
  20. {agent_cli-0.95.6 → agent_cli-0.95.7}/.dockerignore +0 -0
  21. {agent_cli-0.95.6 → agent_cli-0.95.7}/.env.example +0 -0
  22. {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/logo.svg +0 -0
  23. {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/release-drafter.yml +0 -0
  24. {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/renovate.json +0 -0
  25. {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/scripts/check_extras_sync.py +0 -0
  26. {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/scripts/check_plugin_skill_sync.py +0 -0
  27. {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/scripts/sync_extras.py +0 -0
  28. {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/scripts/sync_requirements.py +0 -0
  29. {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/workflows/automerge.yml +0 -0
  30. {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/workflows/docker.yml +0 -0
  31. {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/workflows/docs.yml +0 -0
  32. {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/workflows/markdown-code-runner.yml +0 -0
  33. {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/workflows/pytest.yml +0 -0
  34. {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/workflows/release-drafter.yml +0 -0
  35. {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/workflows/release.yml +0 -0
  36. {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/workflows/toc.yaml +0 -0
  37. {agent_cli-0.95.6 → agent_cli-0.95.7}/.gitignore +0 -0
  38. {agent_cli-0.95.6 → agent_cli-0.95.7}/.jscpd.json +0 -0
  39. {agent_cli-0.95.6 → agent_cli-0.95.7}/.pre-commit-config.yaml +0 -0
  40. {agent_cli-0.95.6 → agent_cli-0.95.7}/.prompts/docs-review.md +0 -0
  41. {agent_cli-0.95.6 → agent_cli-0.95.7}/.prompts/pr-review.md +0 -0
  42. {agent_cli-0.95.6 → agent_cli-0.95.7}/CLAUDE.md +0 -0
  43. {agent_cli-0.95.6 → agent_cli-0.95.7}/LICENSE +0 -0
  44. {agent_cli-0.95.6 → agent_cli-0.95.7}/LLAMA_SERVER_USAGE.md +0 -0
  45. {agent_cli-0.95.6 → agent_cli-0.95.7}/README.md +0 -0
  46. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/__init__.py +0 -0
  47. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/__main__.py +0 -0
  48. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_extras.json +0 -0
  49. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/.gitkeep +0 -0
  50. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/audio.txt +0 -0
  51. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/diarization.txt +0 -0
  52. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/faster-whisper.txt +0 -0
  53. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/kokoro.txt +0 -0
  54. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/llm.txt +0 -0
  55. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/memory.txt +0 -0
  56. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  57. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/piper.txt +0 -0
  58. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/rag.txt +0 -0
  59. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/server.txt +0 -0
  60. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/speed.txt +0 -0
  61. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/vad.txt +0 -0
  62. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/vectordb.txt +0 -0
  63. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  64. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/wyoming.txt +0 -0
  65. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_tools.py +0 -0
  66. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/__init__.py +0 -0
  67. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/_voice_agent_common.py +0 -0
  68. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/assistant.py +0 -0
  69. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/autocorrect.py +0 -0
  70. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/chat.py +0 -0
  71. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/diarize_live_session.py +0 -0
  72. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/memory/__init__.py +0 -0
  73. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/memory/add.py +0 -0
  74. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/memory/proxy.py +0 -0
  75. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/rag_proxy.py +0 -0
  76. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/speak.py +0 -0
  77. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/speakers.py +0 -0
  78. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/transcribe.py +0 -0
  79. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/transcribe_live.py +0 -0
  80. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/voice_edit.py +0 -0
  81. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/api.py +0 -0
  82. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/cli.py +0 -0
  83. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/config.py +0 -0
  84. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/config_cmd.py +0 -0
  85. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/constants.py +0 -0
  86. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/__init__.py +0 -0
  87. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/alignment.py +0 -0
  88. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/audio.py +0 -0
  89. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/audio_format.py +0 -0
  90. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/chroma.py +0 -0
  91. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/deps.py +0 -0
  92. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/diarization.py +0 -0
  93. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/openai_proxy.py +0 -0
  94. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/process.py +0 -0
  95. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/reranker.py +0 -0
  96. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/speaker_identity.py +0 -0
  97. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/sse.py +0 -0
  98. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/transcription_logger.py +0 -0
  99. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/utils.py +0 -0
  100. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/vad.py +0 -0
  101. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/watch.py +0 -0
  102. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/daemon/__init__.py +0 -0
  103. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/daemon/cli.py +0 -0
  104. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/__init__.py +0 -0
  105. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/_branch_name.py +0 -0
  106. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/_config.py +0 -0
  107. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/_output.py +0 -0
  108. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/cleanup.py +0 -0
  109. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/cli.py +0 -0
  110. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/__init__.py +0 -0
  111. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/aider.py +0 -0
  112. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/base.py +0 -0
  113. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/claude.py +0 -0
  114. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/codex.py +0 -0
  115. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  116. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/copilot.py +0 -0
  117. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  118. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/gemini.py +0 -0
  119. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/opencode.py +0 -0
  120. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/registry.py +0 -0
  121. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/__init__.py +0 -0
  122. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/base.py +0 -0
  123. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/cursor.py +0 -0
  124. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/emacs.py +0 -0
  125. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/jetbrains.py +0 -0
  126. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/nano.py +0 -0
  127. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/neovim.py +0 -0
  128. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/registry.py +0 -0
  129. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/sublime.py +0 -0
  130. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/vim.py +0 -0
  131. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/vscode.py +0 -0
  132. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/zed.py +0 -0
  133. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/hooks.py +0 -0
  134. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/launch.py +0 -0
  135. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/project.py +0 -0
  136. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/registry.py +0 -0
  137. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/skill/SKILL.md +0 -0
  138. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/skill/examples.md +0 -0
  139. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/__init__.py +0 -0
  140. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  141. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/base.py +0 -0
  142. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/gnome.py +0 -0
  143. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/iterm2.py +0 -0
  144. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/kitty.py +0 -0
  145. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/registry.py +0 -0
  146. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/tmux.py +0 -0
  147. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/warp.py +0 -0
  148. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/zellij.py +0 -0
  149. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/worktree.py +0 -0
  150. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/docs_gen.py +0 -0
  151. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/example-config.toml +0 -0
  152. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/install/__init__.py +0 -0
  153. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/install/common.py +0 -0
  154. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/install/extras.py +0 -0
  155. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/install/hotkeys.py +0 -0
  156. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/install/launchd.py +0 -0
  157. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/install/service_config.py +0 -0
  158. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/install/services.py +0 -0
  159. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/install/systemd.py +0 -0
  160. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/__init__.py +0 -0
  161. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_files.py +0 -0
  162. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_filters.py +0 -0
  163. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_git.py +0 -0
  164. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_indexer.py +0 -0
  165. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_ingest.py +0 -0
  166. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_persistence.py +0 -0
  167. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_prompt.py +0 -0
  168. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_retrieval.py +0 -0
  169. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_store.py +0 -0
  170. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_streaming.py +0 -0
  171. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_tasks.py +0 -0
  172. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/api.py +0 -0
  173. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/client.py +0 -0
  174. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/engine.py +0 -0
  175. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/entities.py +0 -0
  176. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/models.py +0 -0
  177. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/opts.py +0 -0
  178. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/py.typed +0 -0
  179. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/__init__.py +0 -0
  180. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/_indexer.py +0 -0
  181. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/_indexing.py +0 -0
  182. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/_prompt.py +0 -0
  183. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/_retriever.py +0 -0
  184. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/_store.py +0 -0
  185. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/_utils.py +0 -0
  186. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/api.py +0 -0
  187. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/client.py +0 -0
  188. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/engine.py +0 -0
  189. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/models.py +0 -0
  190. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  191. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/__init__.py +0 -0
  192. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  193. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  194. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  195. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  196. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  197. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  198. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  199. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  200. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  201. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  202. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  203. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  204. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  205. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  206. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/run-openwakeword.sh +0 -0
  207. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  208. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/setup-linux.sh +0 -0
  209. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  210. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/setup-macos.sh +0 -0
  211. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/setup-windows.ps1 +0 -0
  212. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  213. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/start-all-services.sh +0 -0
  214. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/__init__.py +0 -0
  215. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/cli.py +0 -0
  216. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/common.py +0 -0
  217. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/model_manager.py +0 -0
  218. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/model_registry.py +0 -0
  219. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/proxy/__init__.py +0 -0
  220. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/proxy/api.py +0 -0
  221. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/streaming.py +0 -0
  222. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/tts/__init__.py +0 -0
  223. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/tts/api.py +0 -0
  224. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/tts/backends/__init__.py +0 -0
  225. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/tts/backends/base.py +0 -0
  226. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/tts/backends/kokoro.py +0 -0
  227. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/tts/backends/piper.py +0 -0
  228. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/tts/model_manager.py +0 -0
  229. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/tts/model_registry.py +0 -0
  230. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/tts/wyoming_handler.py +0 -0
  231. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/__init__.py +0 -0
  232. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/api.py +0 -0
  233. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/backends/__init__.py +0 -0
  234. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/backends/base.py +0 -0
  235. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  236. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/backends/mlx.py +0 -0
  237. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/backends/transformers.py +0 -0
  238. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/languages.py +0 -0
  239. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/model_manager.py +0 -0
  240. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/model_registry.py +0 -0
  241. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  242. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/services/__init__.py +0 -0
  243. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/services/_wyoming_utils.py +0 -0
  244. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/services/asr.py +0 -0
  245. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/services/llm.py +0 -0
  246. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/services/tts.py +0 -0
  247. {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/services/wake_word.py +0 -0
  248. {agent_cli-0.95.6 → agent_cli-0.95.7}/docker/docker-compose.yml +0 -0
  249. {agent_cli-0.95.6 → agent_cli-0.95.7}/docker/memory-proxy.Dockerfile +0 -0
  250. {agent_cli-0.95.6 → agent_cli-0.95.7}/docker/rag-proxy.Dockerfile +0 -0
  251. {agent_cli-0.95.6 → agent_cli-0.95.7}/docker/transcribe-proxy.Dockerfile +0 -0
  252. {agent_cli-0.95.6 → agent_cli-0.95.7}/docker/tts.Dockerfile +0 -0
  253. {agent_cli-0.95.6 → agent_cli-0.95.7}/docker/whisper.Dockerfile +0 -0
  254. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/CNAME +0 -0
  255. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/architecture/index.md +0 -0
  256. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/architecture/memory.md +0 -0
  257. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/architecture/rag.md +0 -0
  258. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/assistant.md +0 -0
  259. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/autocorrect.md +0 -0
  260. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/chat.md +0 -0
  261. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/config.md +0 -0
  262. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/daemon.md +0 -0
  263. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/dev.md +0 -0
  264. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/diarize-live-session.md +0 -0
  265. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/index.md +0 -0
  266. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/install-extras.md +0 -0
  267. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/install-hotkeys.md +0 -0
  268. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/install-services.md +0 -0
  269. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/memory.md +0 -0
  270. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/rag-proxy.md +0 -0
  271. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/server/index.md +0 -0
  272. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/server/transcribe-proxy.md +0 -0
  273. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/server/tts.md +0 -0
  274. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/server/whisper.md +0 -0
  275. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/speak.md +0 -0
  276. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/speakers.md +0 -0
  277. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/start-services.md +0 -0
  278. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/transcribe-live.md +0 -0
  279. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/transcribe.md +0 -0
  280. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/voice-edit.md +0 -0
  281. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/configuration.md +0 -0
  282. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/getting-started.md +0 -0
  283. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/iOS_Shortcut_Guide.md +0 -0
  284. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/index.md +0 -0
  285. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/installation/docker.md +0 -0
  286. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/installation/index.md +0 -0
  287. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/installation/linux.md +0 -0
  288. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/installation/macos.md +0 -0
  289. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/installation/nixos.md +0 -0
  290. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/installation/windows.md +0 -0
  291. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/logo-avatar.svg +0 -0
  292. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/logo-clean.svg +0 -0
  293. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  294. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/run_markdown_code_runner.py +0 -0
  295. {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/system-integration.md +0 -0
  296. {agent_cli-0.95.6 → agent_cli-0.95.7}/example.agent-cli-config.toml +0 -0
  297. {agent_cli-0.95.6 → agent_cli-0.95.7}/justfile +0 -0
  298. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Package.resolved +0 -0
  299. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Package.swift +0 -0
  300. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/README.md +0 -0
  301. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
  302. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Resources/Info.plist +0 -0
  303. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
  304. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
  305. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
  306. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
  307. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
  308. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
  309. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
  310. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
  311. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
  312. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +0 -0
  313. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
  314. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
  315. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
  316. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
  317. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
  318. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/build-macos-app.sh +0 -0
  319. {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/test-macos-app-e2e.sh +0 -0
  320. {agent_cli-0.95.6 → agent_cli-0.95.7}/pyproject.toml +0 -0
  321. {agent_cli-0.95.6 → agent_cli-0.95.7}/reddit.md +0 -0
  322. {agent_cli-0.95.6 → agent_cli-0.95.7}/shell.nix +0 -0
  323. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/__init__.py +0 -0
  324. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/__init__.py +0 -0
  325. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_fix_my_text.py +0 -0
  326. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_interactive.py +0 -0
  327. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_interactive_extra.py +0 -0
  328. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_memory_add.py +0 -0
  329. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_speak.py +0 -0
  330. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_speak_e2e.py +0 -0
  331. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_speakers.py +0 -0
  332. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_transcribe.py +0 -0
  333. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_transcribe_agent.py +0 -0
  334. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_transcribe_e2e.py +0 -0
  335. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_transcribe_live.py +0 -0
  336. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_transcribe_recovery.py +0 -0
  337. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_tts_common.py +0 -0
  338. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_tts_common_extra.py +0 -0
  339. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_voice_agent_common.py +0 -0
  340. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_voice_edit.py +0 -0
  341. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_voice_edit_e2e.py +0 -0
  342. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_wake_word_assistant.py +0 -0
  343. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/conftest.py +0 -0
  344. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/core/__init__.py +0 -0
  345. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/core/test_audio.py +0 -0
  346. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/core/test_audio_format.py +0 -0
  347. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/core/test_chroma.py +0 -0
  348. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/core/test_sse.py +0 -0
  349. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/core/test_vad.py +0 -0
  350. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/core/test_watch.py +0 -0
  351. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/__init__.py +0 -0
  352. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_cleanup.py +0 -0
  353. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_cli.py +0 -0
  354. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_coding_agents.py +0 -0
  355. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_editors.py +0 -0
  356. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_hooks.py +0 -0
  357. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_launch.py +0 -0
  358. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_project.py +0 -0
  359. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_terminals.py +0 -0
  360. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_verification.py +0 -0
  361. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_worktree.py +0 -0
  362. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/install/__init__.py +0 -0
  363. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/install/test_extras.py +0 -0
  364. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/install/test_launchd.py +0 -0
  365. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/__init__.py +0 -0
  366. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_api_health.py +0 -0
  367. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_api_integration_liveish.py +0 -0
  368. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_client.py +0 -0
  369. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_engine.py +0 -0
  370. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_files.py +0 -0
  371. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_filters.py +0 -0
  372. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_indexer.py +0 -0
  373. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_memory_integration.py +0 -0
  374. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_proxy_passthrough.py +0 -0
  375. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_store.py +0 -0
  376. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_utils.py +0 -0
  377. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/mocks/__init__.py +0 -0
  378. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/mocks/audio.py +0 -0
  379. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/mocks/llm.py +0 -0
  380. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/mocks/wyoming.py +0 -0
  381. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/__init__.py +0 -0
  382. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_api.py +0 -0
  383. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_engine.py +0 -0
  384. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_history.py +0 -0
  385. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_indexer.py +0 -0
  386. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_indexing.py +0 -0
  387. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_rag_client.py +0 -0
  388. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_rag_integration_liveish.py +0 -0
  389. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  390. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_retriever.py +0 -0
  391. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_store.py +0 -0
  392. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_utils.py +0 -0
  393. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_alignment.py +0 -0
  394. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_api.py +0 -0
  395. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_api_integration.py +0 -0
  396. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_asr.py +0 -0
  397. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_asr_recovery.py +0 -0
  398. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_audio_e2e.py +0 -0
  399. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_cli.py +0 -0
  400. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_config.py +0 -0
  401. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_config_cmd.py +0 -0
  402. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_daemon.py +0 -0
  403. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_diarization.py +0 -0
  404. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_diarize_live_session.py +0 -0
  405. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_docs_gen.py +0 -0
  406. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_env_vars.py +0 -0
  407. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_faster_whisper_backend.py +0 -0
  408. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_json_output.py +0 -0
  409. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_llm.py +0 -0
  410. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_llm_gemini.py +0 -0
  411. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_memory_tools.py +0 -0
  412. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_mlx_backend.py +0 -0
  413. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_process_manager.py +0 -0
  414. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_requires_extras.py +0 -0
  415. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_server_streaming.py +0 -0
  416. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_server_tts.py +0 -0
  417. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_server_whisper.py +0 -0
  418. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_services.py +0 -0
  419. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_speaker_identity.py +0 -0
  420. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_tools.py +0 -0
  421. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_transformers_backend.py +0 -0
  422. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_tts.py +0 -0
  423. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_utils.py +0 -0
  424. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_wake_word.py +0 -0
  425. {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_wyoming_utils.py +0 -0
  426. {agent_cli-0.95.6 → agent_cli-0.95.7}/uv.lock +0 -0
  427. {agent_cli-0.95.6 → agent_cli-0.95.7}/zensical.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-cli
3
- Version: 0.95.6
3
+ Version: 0.95.7
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>
@@ -167,7 +167,7 @@ struct AgentCLIApp: App {
167
167
  Label("Quit", systemImage: "power")
168
168
  }
169
169
  } label: {
170
- AgentCLIMenuBarIcon(isRecording: runner.isRecording)
170
+ AgentCLIMenuBarIcon(state: runner.menuBarIconState)
171
171
  }
172
172
  .menuBarExtraStyle(.menu)
173
173
 
@@ -1,11 +1,5 @@
1
1
  import Foundation
2
2
 
3
- enum AgentBootstrapRequirement: Equatable {
4
- case cliRuntime
5
- case transcription
6
- case transcriptionModel
7
- }
8
-
9
3
  struct AgentCommand {
10
4
  let identifier: String
11
5
  let title: String
@@ -19,8 +19,6 @@ private enum HoldTranscriptionState {
19
19
  }
20
20
  }
21
21
 
22
- typealias AgentBootstrap = @Sendable (AgentBootstrapRequirement, Bool) -> CommandResult
23
-
24
22
  @MainActor
25
23
  final class AgentCommandRunner: ObservableObject {
26
24
  static let shared = AgentCommandRunner()
@@ -29,6 +27,7 @@ final class AgentCommandRunner: ObservableObject {
29
27
  @Published var lastOutput = ""
30
28
  @Published private(set) var hasLastError = false
31
29
  @Published private(set) var isRecording = false
30
+ @Published private(set) var bootstrapPhase: BootstrapPhase = .idle
32
31
  @Published private var activeCommandCount = 0
33
32
  private var recordingIndicator = RecordingIndicatorController()
34
33
  private let pasteController: TranscriptPasteController
@@ -47,6 +46,9 @@ final class AgentCommandRunner: ObservableObject {
47
46
  if isRecording {
48
47
  return "Recording"
49
48
  }
49
+ if bootstrapPhase.isPreparing {
50
+ return bootstrapPhase.statusMessage
51
+ }
50
52
  if holdTranscriptionState.isFinishing {
51
53
  return "Transcribing..."
52
54
  }
@@ -56,10 +58,20 @@ final class AgentCommandRunner: ObservableObject {
56
58
  return Self.compactMenuStatus(statusMessage)
57
59
  }
58
60
 
61
+ var menuBarIconState: MenuBarIconState {
62
+ if isRecording {
63
+ return .recording
64
+ }
65
+ if bootstrapPhase.isPreparing {
66
+ return .preparing
67
+ }
68
+ return .idle
69
+ }
70
+
59
71
  init(
60
72
  pasteController: TranscriptPasteController = TranscriptPasteController(),
61
- bootstrap: @escaping AgentBootstrap = { requirement, force in
62
- AgentRuntime.shared.ensureReady(for: requirement, force: force)
73
+ bootstrap: @escaping AgentBootstrap = { requirement, force, progress in
74
+ AgentRuntime.shared.ensureReady(for: requirement, force: force, progress: progress)
63
75
  }
64
76
  ) {
65
77
  self.pasteController = pasteController
@@ -82,13 +94,12 @@ final class AgentCommandRunner: ObservableObject {
82
94
  hasStartedTranscriptionWarmUp = true
83
95
 
84
96
  activeCommandCount += 1
85
- if statusMessage == "Ready" {
86
- statusMessage = "Preparing voice service..."
87
- }
97
+ reportBootstrapPhase(.checkingRuntime)
88
98
 
89
99
  let bootstrap = self.bootstrap
100
+ let reportBootstrapPhase = makeBootstrapProgressReporter()
90
101
  DispatchQueue.global(qos: .utility).async {
91
- let result = bootstrap(.transcriptionModel, false)
102
+ let result = bootstrap(.transcriptionModel, false, reportBootstrapPhase)
92
103
 
93
104
  Task { @MainActor in
94
105
  self.activeCommandCount = max(0, self.activeCommandCount - 1)
@@ -97,12 +108,11 @@ final class AgentCommandRunner: ObservableObject {
97
108
  }
98
109
 
99
110
  if result.exitCode == 0 {
100
- if self.statusMessage == "Preparing voice service..." {
101
- self.statusMessage = "Ready"
102
- }
111
+ self.reportBootstrapPhase(.idle)
103
112
  return
104
113
  }
105
114
 
115
+ self.reportBootstrapPhase(.failed)
106
116
  self.recordFailure(title: "Startup Voice Service Warm-Up", result: result)
107
117
  self.statusMessage = result.output.isEmpty
108
118
  ? "Voice service warm-up failed with exit code \(result.exitCode)"
@@ -111,6 +121,18 @@ final class AgentCommandRunner: ObservableObject {
111
121
  }
112
122
  }
113
123
 
124
+ private func reportBootstrapPhase(_ phase: BootstrapPhase) {
125
+ bootstrapPhase = phase
126
+ }
127
+
128
+ private func makeBootstrapProgressReporter() -> AgentBootstrapProgress {
129
+ { [weak self] phase in
130
+ Task { @MainActor in
131
+ self?.reportBootstrapPhase(phase)
132
+ }
133
+ }
134
+ }
135
+
114
136
  @discardableResult
115
137
  func beginHoldToTranscribe() -> Bool {
116
138
  guard holdTranscriptionState == .idle else {
@@ -171,19 +193,23 @@ final class AgentCommandRunner: ObservableObject {
171
193
  }
172
194
 
173
195
  activeCommandCount += 1
174
- statusMessage = isStopRequest
175
- ? "Stopping \(command.title)..."
176
- : "Running \(command.title)..."
196
+ if !self.bootstrapPhase.isPreparing {
197
+ statusMessage = isStopRequest
198
+ ? "Stopping \(command.title)..."
199
+ : "Running \(command.title)..."
200
+ }
177
201
 
178
202
  let bootstrap = self.bootstrap
203
+ let reportBootstrapPhase = makeBootstrapProgressReporter()
179
204
  let commandArguments = command.resolvedArguments(extraInstructions: TranscriptionSettings.extraInstructions)
180
205
  DispatchQueue.global(qos: .userInitiated).async {
181
- let bootstrapResult = bootstrap(command.bootstrapRequirement, command.forceBootstrap)
206
+ let bootstrapResult = bootstrap(command.bootstrapRequirement, command.forceBootstrap, reportBootstrapPhase)
182
207
  guard bootstrapResult.exitCode == 0 else {
183
208
  let message = Self.statusMessage(for: command, result: bootstrapResult)
184
209
  let notificationTitle = Self.notificationTitle(for: command, result: bootstrapResult)
185
210
  let notificationBody = Self.notificationBody(for: command, result: bootstrapResult, statusMessage: message)
186
211
  Task { @MainActor in
212
+ self.reportBootstrapPhase(.failed)
187
213
  if isStopRequest {
188
214
  self.clearStopRequested(for: command)
189
215
  }
@@ -200,6 +226,10 @@ final class AgentCommandRunner: ObservableObject {
200
226
  return
201
227
  }
202
228
 
229
+ Task { @MainActor in
230
+ self.reportBootstrapPhase(.idle)
231
+ }
232
+
203
233
  if shouldStartRecording {
204
234
  Task { @MainActor in
205
235
  if self.beginRecordingIndicator(for: command) {
@@ -261,14 +291,17 @@ final class AgentCommandRunner: ObservableObject {
261
291
  statusMessage = "Stopping Toggle Transcription..."
262
292
 
263
293
  let bootstrap = self.bootstrap
294
+ let reportBootstrapPhase = makeBootstrapProgressReporter()
264
295
  DispatchQueue.global(qos: .userInitiated).async {
265
296
  let bootstrapResult = bootstrap(
266
297
  AgentCommand.stopTranscription.bootstrapRequirement,
267
- AgentCommand.stopTranscription.forceBootstrap
298
+ AgentCommand.stopTranscription.forceBootstrap,
299
+ reportBootstrapPhase
268
300
  )
269
301
  guard bootstrapResult.exitCode == 0 else {
270
302
  let message = Self.statusMessage(for: AgentCommand.stopTranscription, result: bootstrapResult)
271
303
  Task { @MainActor in
304
+ self.reportBootstrapPhase(.failed)
272
305
  self.holdTranscriptionState = .idle
273
306
  self.lastOutput = bootstrapResult.output
274
307
  self.recordFailure(command: AgentCommand.stopTranscription, result: bootstrapResult)
@@ -281,6 +314,10 @@ final class AgentCommandRunner: ObservableObject {
281
314
  return
282
315
  }
283
316
 
317
+ Task { @MainActor in
318
+ self.reportBootstrapPhase(.idle)
319
+ }
320
+
284
321
  let result = AgentRuntime.shared.runAgentCLI(arguments: AgentCommand.stopTranscription.arguments)
285
322
 
286
323
  Task { @MainActor in
@@ -170,7 +170,10 @@ struct AgentRuntime {
170
170
  exit(0)
171
171
  }
172
172
 
173
- func ensureInstalled(force: Bool = false) -> CommandResult {
173
+ func ensureInstalled(
174
+ force: Bool = false,
175
+ progress: AgentBootstrapProgress = { _ in }
176
+ ) -> CommandResult {
174
177
  let mode = runtimeMode
175
178
  do {
176
179
  try prepareDirectories(for: mode)
@@ -179,6 +182,7 @@ struct AgentRuntime {
179
182
  }
180
183
 
181
184
  if mode == .userInstalled {
185
+ progress(.checkingRuntime)
182
186
  return ensureUserInstalledCLIAvailable()
183
187
  }
184
188
 
@@ -188,6 +192,7 @@ struct AgentRuntime {
188
192
  return CommandResult(exitCode: 0, output: "")
189
193
  }
190
194
 
195
+ progress(.installingRuntime)
191
196
  guard fileManager.isExecutableFile(atPath: bundledUVURL.path) else {
192
197
  return CommandResult(
193
198
  exitCode: 127,
@@ -243,36 +248,54 @@ struct AgentRuntime {
243
248
  "packageSource=\(agentCLIPackageSource)\ninstallRequirement=\(agentCLIInstallRequirement)\n"
244
249
  }
245
250
 
246
- func ensureReady(for requirement: AgentBootstrapRequirement, force: Bool = false) -> CommandResult {
251
+ func ensureReady(
252
+ for requirement: AgentBootstrapRequirement,
253
+ force: Bool = false,
254
+ progress: AgentBootstrapProgress = { _ in }
255
+ ) -> CommandResult {
247
256
  Self.bootstrapQueue.sync {
248
- ensureReadyUnsynchronized(for: requirement, force: force)
257
+ ensureReadyUnsynchronized(for: requirement, force: force, progress: progress)
249
258
  }
250
259
  }
251
260
 
252
- private func ensureReadyUnsynchronized(for requirement: AgentBootstrapRequirement, force: Bool = false) -> CommandResult {
261
+ private func ensureReadyUnsynchronized(
262
+ for requirement: AgentBootstrapRequirement,
263
+ force: Bool = false,
264
+ progress: AgentBootstrapProgress
265
+ ) -> CommandResult {
253
266
  switch requirement {
254
267
  case .cliRuntime:
255
- return ensureInstalled(force: force)
268
+ return ensureInstalled(force: force, progress: progress)
256
269
  case .transcription:
257
- let installResult = ensureInstalled(force: force)
270
+ let installResult = ensureInstalled(force: force, progress: progress)
258
271
  guard installResult.exitCode == 0 else {
259
272
  return installResult
260
273
  }
261
- return ensureWhisperDaemon(force: force)
274
+ return ensureWhisperDaemon(force: force, progress: progress)
262
275
  case .transcriptionModel:
263
- let daemonResult = ensureReadyUnsynchronized(for: .transcription, force: force)
276
+ let daemonResult = ensureReadyUnsynchronized(
277
+ for: .transcription,
278
+ force: force,
279
+ progress: progress
280
+ )
264
281
  guard daemonResult.exitCode == 0 else {
265
282
  return daemonResult
266
283
  }
284
+ progress(.warmingWhisperModel)
267
285
  return warmUpWhisperModel()
268
286
  }
269
287
  }
270
288
 
271
- private func ensureWhisperDaemon(force: Bool = false) -> CommandResult {
289
+ private func ensureWhisperDaemon(
290
+ force: Bool = false,
291
+ progress: AgentBootstrapProgress
292
+ ) -> CommandResult {
272
293
  if !force, (try? String(contentsOf: whisperDaemonMarkerURL)) == whisperDaemonMarkerContents {
294
+ progress(.waitingForVoiceService)
273
295
  return waitForWhisperDaemonReady()
274
296
  }
275
297
 
298
+ progress(.installingVoiceService)
276
299
  let result = runAgentCLI(arguments: ["daemon", "install", "whisper", "-y"])
277
300
  guard result.exitCode == 0 else {
278
301
  return result
@@ -283,6 +306,7 @@ struct AgentRuntime {
283
306
  atomically: true,
284
307
  encoding: .utf8
285
308
  )
309
+ progress(.waitingForVoiceService)
286
310
  return waitForWhisperDaemonReady()
287
311
  }
288
312
 
@@ -0,0 +1,48 @@
1
+ import Foundation
2
+
3
+ enum AgentBootstrapRequirement: Equatable {
4
+ case cliRuntime
5
+ case transcription
6
+ case transcriptionModel
7
+ }
8
+
9
+ enum BootstrapPhase: Equatable {
10
+ case idle
11
+ case checkingRuntime
12
+ case installingRuntime
13
+ case installingVoiceService
14
+ case waitingForVoiceService
15
+ case warmingWhisperModel
16
+ case failed
17
+
18
+ var isPreparing: Bool {
19
+ switch self {
20
+ case .idle, .failed:
21
+ return false
22
+ case .checkingRuntime, .installingRuntime, .installingVoiceService, .waitingForVoiceService, .warmingWhisperModel:
23
+ return true
24
+ }
25
+ }
26
+
27
+ var statusMessage: String {
28
+ switch self {
29
+ case .idle:
30
+ return "Ready"
31
+ case .checkingRuntime:
32
+ return "Checking CLI runtime..."
33
+ case .installingRuntime:
34
+ return "Installing CLI runtime..."
35
+ case .installingVoiceService:
36
+ return "Installing voice service..."
37
+ case .waitingForVoiceService:
38
+ return "Waiting for voice service..."
39
+ case .warmingWhisperModel:
40
+ return "Warming Whisper model..."
41
+ case .failed:
42
+ return "Voice service warm-up failed"
43
+ }
44
+ }
45
+ }
46
+
47
+ typealias AgentBootstrapProgress = (BootstrapPhase) -> Void
48
+ typealias AgentBootstrap = (AgentBootstrapRequirement, Bool, @escaping AgentBootstrapProgress) -> CommandResult
@@ -0,0 +1,111 @@
1
+ import AppKit
2
+ import Foundation
3
+ import SwiftUI
4
+
5
+ enum MenuBarIconState: Equatable {
6
+ case idle
7
+ case preparing
8
+ case recording
9
+ }
10
+
11
+ struct AgentCLIMenuBarIcon: View {
12
+ let state: MenuBarIconState
13
+
14
+ var body: some View {
15
+ if let image = Self.logoImage(state: state) {
16
+ Image(nsImage: image)
17
+ .resizable()
18
+ .aspectRatio(contentMode: .fit)
19
+ .frame(width: 22, height: 18)
20
+ .id(state)
21
+ .accessibilityLabel(accessibilityLabel)
22
+ } else {
23
+ Image(systemName: fallbackSystemImage)
24
+ .id(state)
25
+ .accessibilityLabel(accessibilityLabel)
26
+ }
27
+ }
28
+
29
+ private var accessibilityLabel: Text {
30
+ switch state {
31
+ case .idle:
32
+ return Text("Agent CLI")
33
+ case .preparing:
34
+ return Text("Agent CLI preparing")
35
+ case .recording:
36
+ return Text("Agent CLI recording")
37
+ }
38
+ }
39
+
40
+ private var fallbackSystemImage: String {
41
+ switch state {
42
+ case .idle:
43
+ return "person.crop.circle"
44
+ case .preparing:
45
+ return "arrow.triangle.2.circlepath.circle.fill"
46
+ case .recording:
47
+ return "record.circle.fill"
48
+ }
49
+ }
50
+
51
+ private static func logoImage(state: MenuBarIconState) -> NSImage? {
52
+ switch state {
53
+ case .idle:
54
+ return idleLogoImage
55
+ case .preparing:
56
+ return preparingLogoImage
57
+ case .recording:
58
+ return recordingLogoImage
59
+ }
60
+ }
61
+
62
+ private static let idleLogoImage: NSImage? = {
63
+ guard let url = Bundle.main.url(forResource: "logo-avatar", withExtension: "svg"),
64
+ let image = NSImage(contentsOf: url)
65
+ else {
66
+ return nil
67
+ }
68
+ image.isTemplate = true
69
+ image.size = NSSize(width: 18, height: 18)
70
+ return image
71
+ }()
72
+
73
+ private static let recordingLogoImage: NSImage? = makeRecordingLogoImage()
74
+ private static let preparingLogoImage: NSImage? = makePreparingLogoImage()
75
+
76
+ private static func makeRecordingLogoImage() -> NSImage? {
77
+ makeBadgedLogoImage(badgeColor: .systemRed, badgeDiameter: 7)
78
+ }
79
+
80
+ private static func makePreparingLogoImage() -> NSImage? {
81
+ makeBadgedLogoImage(badgeColor: .controlAccentColor, badgeDiameter: 7)
82
+ }
83
+
84
+ private static func makeBadgedLogoImage(badgeColor: NSColor, badgeDiameter: CGFloat) -> NSImage? {
85
+ guard let url = Bundle.main.url(forResource: "logo-avatar", withExtension: "svg"),
86
+ let avatar = NSImage(contentsOf: url)
87
+ else {
88
+ return nil
89
+ }
90
+
91
+ avatar.size = NSSize(width: 18, height: 18)
92
+
93
+ let image = NSImage(size: NSSize(width: 22, height: 18))
94
+ image.lockFocus()
95
+ avatar.draw(
96
+ in: NSRect(x: 0, y: 0, width: 18, height: 18),
97
+ from: .zero,
98
+ operation: .sourceOver,
99
+ fraction: 1
100
+ )
101
+
102
+ NSColor.white.setFill()
103
+ NSBezierPath(ovalIn: NSRect(x: 12.5, y: 0.5, width: 10, height: 10)).fill()
104
+ badgeColor.setFill()
105
+ NSBezierPath(ovalIn: NSRect(x: 14, y: 2, width: badgeDiameter, height: badgeDiameter)).fill()
106
+ image.unlockFocus()
107
+
108
+ image.isTemplate = false
109
+ return image
110
+ }
111
+ }
@@ -156,7 +156,11 @@ private final class BootstrapRecorder {
156
156
  lock.withLock { storedCalls }
157
157
  }
158
158
 
159
- func bootstrap(requirement: AgentBootstrapRequirement, force: Bool) -> CommandResult {
159
+ func bootstrap(
160
+ requirement: AgentBootstrapRequirement,
161
+ force: Bool,
162
+ progress: AgentBootstrapProgress
163
+ ) -> CommandResult {
160
164
  lock.withLock {
161
165
  storedCalls.append(.init(requirement: requirement, force: force))
162
166
  }
@@ -35,6 +35,7 @@ def _git_log(path: Path) -> list[str]:
35
35
 
36
36
 
37
37
  @pytest.mark.skipif(shutil.which("git") is None, reason="git not installed")
38
+ @pytest.mark.timeout(60)
38
39
  @pytest.mark.asyncio
39
40
  async def test_memory_client_git_versioning(
40
41
  tmp_path: Path,
@@ -50,6 +50,7 @@ def test_macos_app_package_files_exist() -> None:
50
50
  "AgentCommandRunner.swift",
51
51
  "AgentRuntime.swift",
52
52
  "AppDelegate.swift",
53
+ "BootstrapState.swift",
53
54
  "CommandResult.swift",
54
55
  "ConfigurableHotkeyController.swift",
55
56
  "FocusedTextTarget.swift",
@@ -211,6 +212,8 @@ def test_macos_app_menu_prioritizes_daily_voice_actions() -> None:
211
212
  assert troubleshooting_menu_index < copy_output_index < troubleshooting_label_index
212
213
  assert 'Menu("Setup")' not in source
213
214
  assert 'Text("Voice: \\(runner.menuStatusMessage)")' in source
215
+ assert "var menuBarIconState: MenuBarIconState" in source
216
+ assert "AgentCLIMenuBarIcon(state: runner.menuBarIconState)" in source
214
217
  assert "var menuStatusMessage: String" in source
215
218
  assert "menuStatusMaxLength" in source
216
219
  assert "Text(runner.statusMessage)" not in source
@@ -252,18 +255,18 @@ def test_macos_app_uses_avatar_svg_as_menu_bar_icon() -> None:
252
255
  assert MENU_BAR_LOGO_SVG.is_file()
253
256
  avatar_svg = MENU_BAR_LOGO_SVG.read_text()
254
257
 
255
- assert "AgentCLIMenuBarIcon(isRecording: runner.isRecording)" in source
256
- assert "Self.logoImage(isRecording: isRecording)" in source
258
+ assert "AgentCLIMenuBarIcon(state: runner.menuBarIconState)" in source
259
+ assert "Self.logoImage(state: state)" in source
257
260
  assert "Image(nsImage: image)" in source
258
- assert ".id(isRecording)" in source
259
- assert "private static func logoImage(isRecording: Bool) -> NSImage?" in source
261
+ assert ".id(state)" in source
262
+ assert "private static func logoImage(state: MenuBarIconState) -> NSImage?" in source
260
263
  assert "private static let idleLogoImage" in source
261
264
  assert "private static let recordingLogoImage" in source
262
265
  assert "makeRecordingLogoImage" in source
263
266
  assert 'forResource: "logo-avatar", withExtension: "svg"' in source
264
267
  assert "NSImage(contentsOf:" in source
265
268
  assert "image.isTemplate = true" in source
266
- assert "NSColor.systemRed.setFill()" in source
269
+ assert "badgeColor: .systemRed" in source
267
270
  assert 'MENU_BAR_LOGO_SVG="$ROOT_DIR/docs/logo-avatar.svg"' in build_script
268
271
  assert "Contents/Resources/logo-avatar.svg" in build_script
269
272
  assert 'test -f "$APP/Contents/Resources/logo-avatar.svg"' in e2e_script
@@ -485,8 +488,14 @@ def test_macos_app_uses_bootstrap_requirement_model() -> None:
485
488
  assert "case transcription" in source
486
489
  assert "case transcriptionModel" in source
487
490
  assert "let bootstrapRequirement: AgentBootstrapRequirement" in source
488
- assert "AgentRuntime.shared.ensureReady(for: requirement, force: force)" in source
489
- assert "bootstrap(command.bootstrapRequirement, command.forceBootstrap)" in source
491
+ assert (
492
+ "AgentRuntime.shared.ensureReady(for: requirement, force: force, progress: progress)"
493
+ in source
494
+ )
495
+ assert (
496
+ "bootstrap(command.bootstrapRequirement, command.forceBootstrap, reportBootstrapPhase)"
497
+ in source
498
+ )
490
499
  assert "requiresWhisperDaemon" not in source
491
500
 
492
501
 
@@ -496,18 +505,48 @@ def test_macos_app_warms_transcription_on_launch() -> None:
496
505
 
497
506
  assert "AgentCommandRunner.shared.warmUpTranscription()" in source
498
507
  assert "private var hasStartedTranscriptionWarmUp = false" in source
499
- assert 'statusMessage = "Preparing voice service..."' in source
500
- assert "let result = bootstrap(.transcriptionModel, false)" in source
508
+ assert "@Published private(set) var bootstrapPhase: BootstrapPhase = .idle" in source
509
+ assert "let result = bootstrap(.transcriptionModel, false, reportBootstrapPhase)" in source
501
510
  assert 'recordFailure(title: "Startup Voice Service Warm-Up", result: result)' in source
502
511
  assert 'DispatchQueue(label: "lt.nijho.agent-cli.bootstrap")' in source
503
512
 
504
513
 
514
+ def test_macos_app_keeps_preparing_status_visible_during_command_bootstrap() -> None:
515
+ """A command started during launch warm-up should not hide preparation progress."""
516
+ source = swift_source()
517
+
518
+ assert "enum BootstrapPhase: Equatable" in source
519
+ assert "var isPreparing: Bool" in source
520
+ assert "var statusMessage: String" in source
521
+ assert (
522
+ "if bootstrapPhase.isPreparing {\n return bootstrapPhase.statusMessage" in source
523
+ )
524
+ assert (
525
+ "if !self.bootstrapPhase.isPreparing {\n statusMessage = isStopRequest" in source
526
+ )
527
+ assert "self.reportBootstrapPhase(.idle)" in source
528
+ assert 'statusMessage == "Preparing voice service..."' not in source
529
+
530
+
531
+ def test_macos_app_shows_preparing_menu_bar_icon_state() -> None:
532
+ """Initial setup should be visible in the menu bar without opening the menu."""
533
+ source = swift_source()
534
+
535
+ assert "enum MenuBarIconState: Equatable" in source
536
+ assert "case preparing" in source
537
+ assert "if bootstrapPhase.isPreparing {\n return .preparing" in source
538
+ assert "private static let preparingLogoImage" in source
539
+ assert "makePreparingLogoImage()" in source
540
+ assert "badgeColor: .controlAccentColor" in source
541
+ assert 'return Text("Agent CLI preparing")' in source
542
+
543
+
505
544
  def test_macos_app_warms_whisper_model_on_launch() -> None:
506
545
  """Startup warm-up should force Whisper's lazily loaded model to initialize."""
507
546
  source = swift_source()
508
547
 
509
548
  assert "case transcriptionModel" in source
510
- assert "let result = bootstrap(.transcriptionModel, false)" in source
549
+ assert "let result = bootstrap(.transcriptionModel, false, reportBootstrapPhase)" in source
511
550
  assert "warmUpWhisperModel()" in source
512
551
  assert "writeWhisperWarmUpAudio()" in source
513
552
  assert 'appendingPathComponent("whisper-model-warmup.wav")' in source
@@ -1,67 +0,0 @@
1
- import AppKit
2
- import Foundation
3
- import SwiftUI
4
-
5
- struct AgentCLIMenuBarIcon: View {
6
- let isRecording: Bool
7
-
8
- var body: some View {
9
- if let image = Self.logoImage(isRecording: isRecording) {
10
- Image(nsImage: image)
11
- .resizable()
12
- .aspectRatio(contentMode: .fit)
13
- .frame(width: 22, height: 18)
14
- .id(isRecording)
15
- .accessibilityLabel(Text(isRecording ? "Agent CLI recording" : "Agent CLI"))
16
- } else {
17
- Image(systemName: isRecording ? "record.circle.fill" : "person.crop.circle")
18
- .id(isRecording)
19
- .accessibilityLabel(Text(isRecording ? "Agent CLI recording" : "Agent CLI"))
20
- }
21
- }
22
-
23
- private static func logoImage(isRecording: Bool) -> NSImage? {
24
- isRecording ? recordingLogoImage : idleLogoImage
25
- }
26
-
27
- private static let idleLogoImage: NSImage? = {
28
- guard let url = Bundle.main.url(forResource: "logo-avatar", withExtension: "svg"),
29
- let image = NSImage(contentsOf: url)
30
- else {
31
- return nil
32
- }
33
- image.isTemplate = true
34
- image.size = NSSize(width: 18, height: 18)
35
- return image
36
- }()
37
-
38
- private static let recordingLogoImage: NSImage? = makeRecordingLogoImage()
39
-
40
- private static func makeRecordingLogoImage() -> NSImage? {
41
- guard let url = Bundle.main.url(forResource: "logo-avatar", withExtension: "svg"),
42
- let avatar = NSImage(contentsOf: url)
43
- else {
44
- return nil
45
- }
46
-
47
- avatar.size = NSSize(width: 18, height: 18)
48
-
49
- let image = NSImage(size: NSSize(width: 22, height: 18))
50
- image.lockFocus()
51
- avatar.draw(
52
- in: NSRect(x: 0, y: 0, width: 18, height: 18),
53
- from: .zero,
54
- operation: .sourceOver,
55
- fraction: 1
56
- )
57
-
58
- NSColor.white.setFill()
59
- NSBezierPath(ovalIn: NSRect(x: 12.5, y: 0.5, width: 10, height: 10)).fill()
60
- NSColor.systemRed.setFill()
61
- NSBezierPath(ovalIn: NSRect(x: 14, y: 2, width: 7, height: 7)).fill()
62
- image.unlockFocus()
63
-
64
- image.isTemplate = false
65
- return image
66
- }
67
- }
File without changes