agent-cli 0.95.8__tar.gz → 0.95.10__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 (437) hide show
  1. agent_cli-0.95.10/.github/scripts/update_cask.py +87 -0
  2. agent_cli-0.95.10/.github/workflows/release.yml +133 -0
  3. {agent_cli-0.95.8 → agent_cli-0.95.10}/Casks/agent-cli.rb +2 -2
  4. {agent_cli-0.95.8 → agent_cli-0.95.10}/PKG-INFO +1 -1
  5. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/daemon/cli.py +109 -0
  6. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/daemon.md +4 -0
  7. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Package.resolved +9 -0
  8. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Package.swift +2 -0
  9. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/README.md +12 -0
  10. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Resources/Info.plist +4 -0
  11. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +9 -2
  12. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +3 -3
  13. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +45 -21
  14. agent_cli-0.95.10/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +46 -0
  15. agent_cli-0.95.10/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +33 -0
  16. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +24 -3
  17. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +102 -43
  18. agent_cli-0.95.10/macos/AgentCLI/Sources/AgentCLI/VoiceStatusMenuItem.swift +27 -0
  19. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +120 -6
  20. agent_cli-0.95.10/macos/appcast.xml +8 -0
  21. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/build-macos-app.sh +41 -5
  22. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_daemon.py +118 -0
  23. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_macos_app.py +93 -40
  24. agent_cli-0.95.10/tests/test_update_cask.py +51 -0
  25. agent_cli-0.95.8/.github/workflows/release.yml +0 -66
  26. {agent_cli-0.95.8 → agent_cli-0.95.10}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  27. {agent_cli-0.95.8 → agent_cli-0.95.10}/.claude/skills/agent-cli-dev/examples.md +0 -0
  28. {agent_cli-0.95.8 → agent_cli-0.95.10}/.claude-plugin/README.md +0 -0
  29. {agent_cli-0.95.8 → agent_cli-0.95.10}/.claude-plugin/marketplace.json +0 -0
  30. {agent_cli-0.95.8 → agent_cli-0.95.10}/.claude-plugin/plugin.json +0 -0
  31. {agent_cli-0.95.8 → agent_cli-0.95.10}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  32. {agent_cli-0.95.8 → agent_cli-0.95.10}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  33. {agent_cli-0.95.8 → agent_cli-0.95.10}/.cursorrules +0 -0
  34. {agent_cli-0.95.8 → agent_cli-0.95.10}/.dockerignore +0 -0
  35. {agent_cli-0.95.8 → agent_cli-0.95.10}/.env.example +0 -0
  36. {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/logo.svg +0 -0
  37. {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/release-drafter.yml +0 -0
  38. {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/renovate.json +0 -0
  39. {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/scripts/check_extras_sync.py +0 -0
  40. {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/scripts/check_plugin_skill_sync.py +0 -0
  41. {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/scripts/sync_extras.py +0 -0
  42. {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/scripts/sync_requirements.py +0 -0
  43. {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/workflows/automerge.yml +0 -0
  44. {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/workflows/docker.yml +0 -0
  45. {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/workflows/docs.yml +0 -0
  46. {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/workflows/markdown-code-runner.yml +0 -0
  47. {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/workflows/pytest.yml +0 -0
  48. {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/workflows/release-drafter.yml +0 -0
  49. {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/workflows/toc.yaml +0 -0
  50. {agent_cli-0.95.8 → agent_cli-0.95.10}/.gitignore +0 -0
  51. {agent_cli-0.95.8 → agent_cli-0.95.10}/.jscpd.json +0 -0
  52. {agent_cli-0.95.8 → agent_cli-0.95.10}/.pre-commit-config.yaml +0 -0
  53. {agent_cli-0.95.8 → agent_cli-0.95.10}/.prompts/docs-review.md +0 -0
  54. {agent_cli-0.95.8 → agent_cli-0.95.10}/.prompts/pr-review.md +0 -0
  55. {agent_cli-0.95.8 → agent_cli-0.95.10}/CLAUDE.md +0 -0
  56. {agent_cli-0.95.8 → agent_cli-0.95.10}/LICENSE +0 -0
  57. {agent_cli-0.95.8 → agent_cli-0.95.10}/LLAMA_SERVER_USAGE.md +0 -0
  58. {agent_cli-0.95.8 → agent_cli-0.95.10}/README.md +0 -0
  59. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/__init__.py +0 -0
  60. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/__main__.py +0 -0
  61. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_extras.json +0 -0
  62. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/.gitkeep +0 -0
  63. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/audio.txt +0 -0
  64. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/diarization.txt +0 -0
  65. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/faster-whisper.txt +0 -0
  66. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/kokoro.txt +0 -0
  67. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/llm.txt +0 -0
  68. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/memory.txt +0 -0
  69. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  70. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/piper.txt +0 -0
  71. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/rag.txt +0 -0
  72. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/server.txt +0 -0
  73. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/speed.txt +0 -0
  74. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/vad.txt +0 -0
  75. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/vectordb.txt +0 -0
  76. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  77. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/wyoming.txt +0 -0
  78. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_tools.py +0 -0
  79. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/__init__.py +0 -0
  80. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/_voice_agent_common.py +0 -0
  81. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/assistant.py +0 -0
  82. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/autocorrect.py +0 -0
  83. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/chat.py +0 -0
  84. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/diarize_live_session.py +0 -0
  85. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/memory/__init__.py +0 -0
  86. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/memory/add.py +0 -0
  87. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/memory/proxy.py +0 -0
  88. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/rag_proxy.py +0 -0
  89. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/speak.py +0 -0
  90. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/speakers.py +0 -0
  91. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/transcribe.py +0 -0
  92. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/transcribe_live.py +0 -0
  93. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/voice_edit.py +0 -0
  94. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/api.py +0 -0
  95. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/cli.py +0 -0
  96. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/config.py +0 -0
  97. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/config_cmd.py +0 -0
  98. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/constants.py +0 -0
  99. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/__init__.py +0 -0
  100. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/alignment.py +0 -0
  101. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/audio.py +0 -0
  102. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/audio_format.py +0 -0
  103. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/chroma.py +0 -0
  104. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/deps.py +0 -0
  105. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/diarization.py +0 -0
  106. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/openai_proxy.py +0 -0
  107. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/process.py +0 -0
  108. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/reranker.py +0 -0
  109. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/speaker_identity.py +0 -0
  110. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/sse.py +0 -0
  111. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/transcription_logger.py +0 -0
  112. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/utils.py +0 -0
  113. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/vad.py +0 -0
  114. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/watch.py +0 -0
  115. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/daemon/__init__.py +0 -0
  116. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/__init__.py +0 -0
  117. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/_branch_name.py +0 -0
  118. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/_config.py +0 -0
  119. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/_output.py +0 -0
  120. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/cleanup.py +0 -0
  121. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/cli.py +0 -0
  122. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/__init__.py +0 -0
  123. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/aider.py +0 -0
  124. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/base.py +0 -0
  125. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/claude.py +0 -0
  126. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/codex.py +0 -0
  127. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  128. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/copilot.py +0 -0
  129. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  130. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/gemini.py +0 -0
  131. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/opencode.py +0 -0
  132. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/registry.py +0 -0
  133. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/__init__.py +0 -0
  134. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/base.py +0 -0
  135. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/cursor.py +0 -0
  136. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/emacs.py +0 -0
  137. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/jetbrains.py +0 -0
  138. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/nano.py +0 -0
  139. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/neovim.py +0 -0
  140. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/registry.py +0 -0
  141. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/sublime.py +0 -0
  142. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/vim.py +0 -0
  143. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/vscode.py +0 -0
  144. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/zed.py +0 -0
  145. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/hooks.py +0 -0
  146. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/launch.py +0 -0
  147. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/project.py +0 -0
  148. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/registry.py +0 -0
  149. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/skill/SKILL.md +0 -0
  150. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/skill/examples.md +0 -0
  151. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/__init__.py +0 -0
  152. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  153. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/base.py +0 -0
  154. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/gnome.py +0 -0
  155. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/iterm2.py +0 -0
  156. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/kitty.py +0 -0
  157. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/registry.py +0 -0
  158. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/tmux.py +0 -0
  159. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/warp.py +0 -0
  160. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/zellij.py +0 -0
  161. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/worktree.py +0 -0
  162. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/docs_gen.py +0 -0
  163. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/example-config.toml +0 -0
  164. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/install/__init__.py +0 -0
  165. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/install/common.py +0 -0
  166. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/install/extras.py +0 -0
  167. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/install/hotkeys.py +0 -0
  168. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/install/launchd.py +0 -0
  169. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/install/service_config.py +0 -0
  170. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/install/services.py +0 -0
  171. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/install/systemd.py +0 -0
  172. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/__init__.py +0 -0
  173. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_files.py +0 -0
  174. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_filters.py +0 -0
  175. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_git.py +0 -0
  176. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_indexer.py +0 -0
  177. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_ingest.py +0 -0
  178. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_persistence.py +0 -0
  179. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_prompt.py +0 -0
  180. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_retrieval.py +0 -0
  181. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_store.py +0 -0
  182. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_streaming.py +0 -0
  183. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_tasks.py +0 -0
  184. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/api.py +0 -0
  185. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/client.py +0 -0
  186. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/engine.py +0 -0
  187. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/entities.py +0 -0
  188. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/models.py +0 -0
  189. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/opts.py +0 -0
  190. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/py.typed +0 -0
  191. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/__init__.py +0 -0
  192. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/_indexer.py +0 -0
  193. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/_indexing.py +0 -0
  194. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/_prompt.py +0 -0
  195. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/_retriever.py +0 -0
  196. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/_store.py +0 -0
  197. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/_utils.py +0 -0
  198. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/api.py +0 -0
  199. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/client.py +0 -0
  200. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/engine.py +0 -0
  201. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/models.py +0 -0
  202. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  203. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/__init__.py +0 -0
  204. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  205. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  206. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  207. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  208. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  209. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  210. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  211. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  212. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  213. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  214. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  215. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  216. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  217. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  218. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/run-openwakeword.sh +0 -0
  219. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  220. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/setup-linux.sh +0 -0
  221. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  222. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/setup-macos.sh +0 -0
  223. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/setup-windows.ps1 +0 -0
  224. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  225. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/start-all-services.sh +0 -0
  226. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/__init__.py +0 -0
  227. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/cli.py +0 -0
  228. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/common.py +0 -0
  229. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/model_manager.py +0 -0
  230. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/model_registry.py +0 -0
  231. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/proxy/__init__.py +0 -0
  232. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/proxy/api.py +0 -0
  233. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/streaming.py +0 -0
  234. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/tts/__init__.py +0 -0
  235. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/tts/api.py +0 -0
  236. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/tts/backends/__init__.py +0 -0
  237. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/tts/backends/base.py +0 -0
  238. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/tts/backends/kokoro.py +0 -0
  239. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/tts/backends/piper.py +0 -0
  240. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/tts/model_manager.py +0 -0
  241. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/tts/model_registry.py +0 -0
  242. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/tts/wyoming_handler.py +0 -0
  243. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/__init__.py +0 -0
  244. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/api.py +0 -0
  245. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/backends/__init__.py +0 -0
  246. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/backends/base.py +0 -0
  247. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  248. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/backends/mlx.py +0 -0
  249. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/backends/transformers.py +0 -0
  250. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/languages.py +0 -0
  251. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/model_manager.py +0 -0
  252. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/model_registry.py +0 -0
  253. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  254. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/services/__init__.py +0 -0
  255. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/services/_wyoming_utils.py +0 -0
  256. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/services/asr.py +0 -0
  257. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/services/llm.py +0 -0
  258. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/services/tts.py +0 -0
  259. {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/services/wake_word.py +0 -0
  260. {agent_cli-0.95.8 → agent_cli-0.95.10}/docker/docker-compose.yml +0 -0
  261. {agent_cli-0.95.8 → agent_cli-0.95.10}/docker/memory-proxy.Dockerfile +0 -0
  262. {agent_cli-0.95.8 → agent_cli-0.95.10}/docker/rag-proxy.Dockerfile +0 -0
  263. {agent_cli-0.95.8 → agent_cli-0.95.10}/docker/transcribe-proxy.Dockerfile +0 -0
  264. {agent_cli-0.95.8 → agent_cli-0.95.10}/docker/tts.Dockerfile +0 -0
  265. {agent_cli-0.95.8 → agent_cli-0.95.10}/docker/whisper.Dockerfile +0 -0
  266. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/CNAME +0 -0
  267. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/architecture/index.md +0 -0
  268. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/architecture/memory.md +0 -0
  269. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/architecture/rag.md +0 -0
  270. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/assistant.md +0 -0
  271. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/autocorrect.md +0 -0
  272. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/chat.md +0 -0
  273. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/config.md +0 -0
  274. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/dev.md +0 -0
  275. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/diarize-live-session.md +0 -0
  276. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/index.md +0 -0
  277. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/install-extras.md +0 -0
  278. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/install-hotkeys.md +0 -0
  279. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/install-services.md +0 -0
  280. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/memory.md +0 -0
  281. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/rag-proxy.md +0 -0
  282. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/server/index.md +0 -0
  283. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/server/transcribe-proxy.md +0 -0
  284. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/server/tts.md +0 -0
  285. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/server/whisper.md +0 -0
  286. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/speak.md +0 -0
  287. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/speakers.md +0 -0
  288. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/start-services.md +0 -0
  289. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/transcribe-live.md +0 -0
  290. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/transcribe.md +0 -0
  291. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/voice-edit.md +0 -0
  292. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/configuration.md +0 -0
  293. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/getting-started.md +0 -0
  294. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/iOS_Shortcut_Guide.md +0 -0
  295. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/index.md +0 -0
  296. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/installation/docker.md +0 -0
  297. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/installation/index.md +0 -0
  298. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/installation/linux.md +0 -0
  299. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/installation/macos.md +0 -0
  300. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/installation/nixos.md +0 -0
  301. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/installation/windows.md +0 -0
  302. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/logo-avatar.svg +0 -0
  303. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/logo-clean.svg +0 -0
  304. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  305. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/run_markdown_code_runner.py +0 -0
  306. {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/system-integration.md +0 -0
  307. {agent_cli-0.95.8 → agent_cli-0.95.10}/example.agent-cli-config.toml +0 -0
  308. {agent_cli-0.95.8 → agent_cli-0.95.10}/justfile +0 -0
  309. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
  310. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
  311. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
  312. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
  313. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
  314. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
  315. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
  316. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
  317. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
  318. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
  319. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
  320. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
  321. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
  322. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
  323. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
  324. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
  325. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
  326. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
  327. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +0 -0
  328. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
  329. {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/test-macos-app-e2e.sh +0 -0
  330. {agent_cli-0.95.8 → agent_cli-0.95.10}/pyproject.toml +0 -0
  331. {agent_cli-0.95.8 → agent_cli-0.95.10}/reddit.md +0 -0
  332. {agent_cli-0.95.8 → agent_cli-0.95.10}/shell.nix +0 -0
  333. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/__init__.py +0 -0
  334. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/__init__.py +0 -0
  335. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_fix_my_text.py +0 -0
  336. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_interactive.py +0 -0
  337. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_interactive_extra.py +0 -0
  338. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_memory_add.py +0 -0
  339. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_speak.py +0 -0
  340. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_speak_e2e.py +0 -0
  341. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_speakers.py +0 -0
  342. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_transcribe.py +0 -0
  343. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_transcribe_agent.py +0 -0
  344. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_transcribe_e2e.py +0 -0
  345. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_transcribe_live.py +0 -0
  346. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_transcribe_recovery.py +0 -0
  347. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_tts_common.py +0 -0
  348. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_tts_common_extra.py +0 -0
  349. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_voice_agent_common.py +0 -0
  350. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_voice_edit.py +0 -0
  351. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_voice_edit_e2e.py +0 -0
  352. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_wake_word_assistant.py +0 -0
  353. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/conftest.py +0 -0
  354. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/core/__init__.py +0 -0
  355. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/core/test_audio.py +0 -0
  356. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/core/test_audio_format.py +0 -0
  357. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/core/test_chroma.py +0 -0
  358. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/core/test_sse.py +0 -0
  359. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/core/test_vad.py +0 -0
  360. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/core/test_watch.py +0 -0
  361. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/__init__.py +0 -0
  362. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_cleanup.py +0 -0
  363. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_cli.py +0 -0
  364. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_coding_agents.py +0 -0
  365. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_editors.py +0 -0
  366. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_hooks.py +0 -0
  367. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_launch.py +0 -0
  368. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_project.py +0 -0
  369. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_terminals.py +0 -0
  370. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_verification.py +0 -0
  371. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_worktree.py +0 -0
  372. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/install/__init__.py +0 -0
  373. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/install/test_extras.py +0 -0
  374. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/install/test_launchd.py +0 -0
  375. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/__init__.py +0 -0
  376. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_api_health.py +0 -0
  377. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_api_integration_liveish.py +0 -0
  378. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_client.py +0 -0
  379. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_engine.py +0 -0
  380. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_files.py +0 -0
  381. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_filters.py +0 -0
  382. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_git_integration.py +0 -0
  383. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_indexer.py +0 -0
  384. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_memory_integration.py +0 -0
  385. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_proxy_passthrough.py +0 -0
  386. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_store.py +0 -0
  387. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_utils.py +0 -0
  388. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/mocks/__init__.py +0 -0
  389. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/mocks/audio.py +0 -0
  390. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/mocks/llm.py +0 -0
  391. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/mocks/wyoming.py +0 -0
  392. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/__init__.py +0 -0
  393. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_api.py +0 -0
  394. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_engine.py +0 -0
  395. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_history.py +0 -0
  396. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_indexer.py +0 -0
  397. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_indexing.py +0 -0
  398. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_rag_client.py +0 -0
  399. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_rag_integration_liveish.py +0 -0
  400. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  401. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_retriever.py +0 -0
  402. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_store.py +0 -0
  403. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_utils.py +0 -0
  404. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_alignment.py +0 -0
  405. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_api.py +0 -0
  406. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_api_integration.py +0 -0
  407. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_asr.py +0 -0
  408. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_asr_recovery.py +0 -0
  409. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_audio_e2e.py +0 -0
  410. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_cli.py +0 -0
  411. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_config.py +0 -0
  412. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_config_cmd.py +0 -0
  413. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_diarization.py +0 -0
  414. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_diarize_live_session.py +0 -0
  415. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_docs_gen.py +0 -0
  416. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_env_vars.py +0 -0
  417. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_faster_whisper_backend.py +0 -0
  418. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_json_output.py +0 -0
  419. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_llm.py +0 -0
  420. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_llm_gemini.py +0 -0
  421. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_memory_tools.py +0 -0
  422. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_mlx_backend.py +0 -0
  423. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_process_manager.py +0 -0
  424. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_requires_extras.py +0 -0
  425. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_server_streaming.py +0 -0
  426. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_server_tts.py +0 -0
  427. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_server_whisper.py +0 -0
  428. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_services.py +0 -0
  429. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_speaker_identity.py +0 -0
  430. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_tools.py +0 -0
  431. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_transformers_backend.py +0 -0
  432. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_tts.py +0 -0
  433. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_utils.py +0 -0
  434. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_wake_word.py +0 -0
  435. {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_wyoming_utils.py +0 -0
  436. {agent_cli-0.95.8 → agent_cli-0.95.10}/uv.lock +0 -0
  437. {agent_cli-0.95.8 → agent_cli-0.95.10}/zensical.toml +0 -0
@@ -0,0 +1,87 @@
1
+ """Update the Agent CLI Homebrew cask version and checksum."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ import re
7
+ from pathlib import Path
8
+
9
+ VERSION_RE = re.compile(r'^(?P<indent>\s*)version "[^"]+"$')
10
+ SHA256_RE = re.compile(r'^(?P<indent>\s*)sha256 "[0-9a-f]{64}"$')
11
+
12
+
13
+ def _validate_sha256(value: str) -> str:
14
+ if not re.fullmatch(r"[0-9a-f]{64}", value):
15
+ msg = "sha256 must be 64 lowercase hexadecimal characters"
16
+ raise ValueError(msg)
17
+ return value
18
+
19
+
20
+ def _validate_version(value: str) -> str:
21
+ value = value.removeprefix("v")
22
+ if not re.fullmatch(r"\d+(?:\.\d+)*(?:[-,._A-Za-z0-9]+)?", value):
23
+ msg = f"unsupported cask version: {value}"
24
+ raise ValueError(msg)
25
+ return value
26
+
27
+
28
+ def update_cask_text(text: str, *, version: str, sha256: str) -> str:
29
+ """Replace the single version and sha256 stanzas in a cask."""
30
+ version = _validate_version(version)
31
+ sha256 = _validate_sha256(sha256)
32
+
33
+ version_count = 0
34
+ sha256_count = 0
35
+ lines: list[str] = []
36
+ for source_line in text.splitlines(keepends=True):
37
+ newline = "\n" if source_line.endswith("\n") else ""
38
+ content = source_line.removesuffix("\n")
39
+
40
+ if match := VERSION_RE.match(content):
41
+ output_line = f'{match.group("indent")}version "{version}"{newline}'
42
+ version_count += 1
43
+ elif match := SHA256_RE.match(content):
44
+ output_line = f'{match.group("indent")}sha256 "{sha256}"{newline}'
45
+ sha256_count += 1
46
+ else:
47
+ output_line = source_line
48
+ lines.append(output_line)
49
+
50
+ if version_count != 1:
51
+ msg = f"expected exactly one version stanza, found {version_count}"
52
+ raise ValueError(msg)
53
+ if sha256_count != 1:
54
+ msg = f"expected exactly one sha256 stanza, found {sha256_count}"
55
+ raise ValueError(msg)
56
+
57
+ return "".join(lines)
58
+
59
+
60
+ def update_cask_file(path: Path, *, version: str, sha256: str) -> None:
61
+ """Update a cask file in place."""
62
+ path.write_text(
63
+ update_cask_text(path.read_text(), version=version, sha256=sha256),
64
+ encoding="utf-8",
65
+ )
66
+
67
+
68
+ def main() -> None:
69
+ """Run the command-line cask updater."""
70
+ parser = argparse.ArgumentParser(description=__doc__)
71
+ parser.add_argument(
72
+ "--cask",
73
+ type=Path,
74
+ default=Path("Casks/agent-cli.rb"),
75
+ help="Path to the cask file to update.",
76
+ )
77
+ parser.add_argument(
78
+ "--version", required=True, help="Release version, with or without v prefix."
79
+ )
80
+ parser.add_argument("--sha256", required=True, help="SHA-256 checksum for the release DMG.")
81
+ args = parser.parse_args()
82
+
83
+ update_cask_file(args.cask, version=args.version, sha256=args.sha256)
84
+
85
+
86
+ if __name__ == "__main__":
87
+ main()
@@ -0,0 +1,133 @@
1
+ name: Publish Release
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ jobs:
8
+ deploy:
9
+ name: Publish Python package
10
+ runs-on: ubuntu-latest
11
+ environment:
12
+ name: pypi
13
+ url: https://pypi.org/p/${{ github.repository }}
14
+ permissions:
15
+ id-token: write
16
+ steps:
17
+ - uses: actions/checkout@v6
18
+ - name: Install uv
19
+ uses: astral-sh/setup-uv@v8.1.0
20
+ - name: Build
21
+ run: uv build
22
+ - name: Publish package distributions to PyPI
23
+ uses: pypa/gh-action-pypi-publish@release/v1
24
+
25
+ build_macos_app:
26
+ name: Build and publish macOS app
27
+ runs-on: macos-latest
28
+ timeout-minutes: 45
29
+ permissions:
30
+ contents: write
31
+ steps:
32
+ - uses: actions/checkout@v6
33
+ - name: Install uv
34
+ uses: astral-sh/setup-uv@v8.1.0
35
+ - name: Import Developer ID certificate
36
+ uses: apple-actions/import-codesign-certs@v7
37
+ with:
38
+ p12-file-base64: ${{ secrets.MACOS_CODESIGN_CERTIFICATE_BASE64 }}
39
+ p12-password: ${{ secrets.MACOS_CODESIGN_CERTIFICATE_PASSWORD }}
40
+ keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }}
41
+ - name: Resolve Developer ID identity
42
+ id: codesign
43
+ run: |
44
+ IDENTITY=$(
45
+ security find-identity -v -p codesigning |
46
+ awk -F '"' '/Developer ID Application/ { print $2; exit }'
47
+ )
48
+ if [[ -z "$IDENTITY" ]]; then
49
+ echo "Developer ID Application signing identity not found." >&2
50
+ exit 1
51
+ fi
52
+ echo "identity=$IDENTITY" >> "$GITHUB_OUTPUT"
53
+ - name: Build notarized macOS DMG
54
+ env:
55
+ CODESIGN_IDENTITY: ${{ steps.codesign.outputs.identity }}
56
+ APPLE_ID: ${{ secrets.APPLE_ID }}
57
+ APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
58
+ APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
59
+ APP_VERSION: ${{ github.event.release.tag_name }}
60
+ BUILD_VERSION: ${{ github.run_number }}
61
+ SPARKLE_PUBLIC_ED_KEY: ${{ vars.SPARKLE_PUBLIC_ED_KEY }}
62
+ run: |
63
+ if [[ -z "$SPARKLE_PUBLIC_ED_KEY" ]]; then
64
+ echo "SPARKLE_PUBLIC_ED_KEY repository variable is required to enable Sparkle updates." >&2
65
+ exit 1
66
+ fi
67
+ NOTARIZE=1 macos/build-macos-app.sh --dmg
68
+ ditto -c -k --keepParent dist/macos/AgentCLI.app dist/macos/AgentCLI.zip
69
+ - name: Upload macOS app to GitHub Release
70
+ env:
71
+ GH_TOKEN: ${{ github.token }}
72
+ TAG_NAME: ${{ github.event.release.tag_name }}
73
+ run: gh release upload "$TAG_NAME" dist/macos/AgentCLI.dmg dist/macos/AgentCLI.zip --clobber
74
+ - name: Update Sparkle appcast
75
+ env:
76
+ GH_TOKEN: ${{ github.token }}
77
+ TAG_NAME: ${{ github.event.release.tag_name }}
78
+ SPARKLE_PRIVATE_ED_KEY: ${{ secrets.SPARKLE_PRIVATE_ED_KEY }}
79
+ run: |
80
+ git fetch origin main
81
+ git switch --force-create release-metadata origin/main
82
+
83
+ if [[ -z "$SPARKLE_PRIVATE_ED_KEY" ]]; then
84
+ echo "SPARKLE_PRIVATE_ED_KEY is required to sign Sparkle updates." >&2
85
+ exit 1
86
+ fi
87
+
88
+ SPARKLE_GENERATE_APPCAST="macos/AgentCLI/.build/artifacts/sparkle/Sparkle/bin/generate_appcast"
89
+ if [[ ! -x "$SPARKLE_GENERATE_APPCAST" ]]; then
90
+ echo "Sparkle generate_appcast not found: $SPARKLE_GENERATE_APPCAST" >&2
91
+ exit 1
92
+ fi
93
+
94
+ APPCAST_DIR="$RUNNER_TEMP/agentcli-appcast"
95
+ rm -rf "$APPCAST_DIR"
96
+ mkdir -p "$APPCAST_DIR"
97
+ cp dist/macos/AgentCLI.zip "$APPCAST_DIR/AgentCLI.zip"
98
+ cp macos/appcast.xml "$APPCAST_DIR/appcast.xml"
99
+ gh release view "$TAG_NAME" --json body --jq .body >"$APPCAST_DIR/AgentCLI.md"
100
+
101
+ printf '%s' "$SPARKLE_PRIVATE_ED_KEY" |
102
+ "$SPARKLE_GENERATE_APPCAST" \
103
+ --ed-key-file - \
104
+ --download-url-prefix "https://github.com/basnijholt/agent-cli/releases/download/${TAG_NAME}/" \
105
+ --link "https://github.com/basnijholt/agent-cli" \
106
+ --embed-release-notes \
107
+ --maximum-versions 10 \
108
+ -o "$APPCAST_DIR/appcast.xml" \
109
+ "$APPCAST_DIR"
110
+
111
+ cp "$APPCAST_DIR/appcast.xml" macos/appcast.xml
112
+ - name: Update Homebrew cask and Sparkle appcast
113
+ env:
114
+ TAG_NAME: ${{ github.event.release.tag_name }}
115
+ run: |
116
+ VERSION="${TAG_NAME#v}"
117
+ SHA256=$(shasum -a 256 dist/macos/AgentCLI.dmg | awk '{ print $1 }')
118
+
119
+ python3 .github/scripts/update_cask.py \
120
+ --version "$VERSION" \
121
+ --sha256 "$SHA256"
122
+
123
+ if git diff --quiet -- Casks/agent-cli.rb macos/appcast.xml; then
124
+ echo "Casks/agent-cli.rb and macos/appcast.xml are already up to date."
125
+ exit 0
126
+ fi
127
+
128
+ git config user.name "github-actions[bot]"
129
+ git config user.email "github-actions[bot]@users.noreply.github.com"
130
+ git add Casks/agent-cli.rb macos/appcast.xml
131
+ git commit -m "Update AgentCLI release metadata to ${TAG_NAME}"
132
+ git pull --rebase origin main
133
+ git push origin HEAD:main
@@ -1,6 +1,6 @@
1
1
  cask "agent-cli" do
2
- version "0.95.7"
3
- sha256 "9db4a8d9f44765e1197d687a46e4cde041ada2d5284e6a22324c706d2a40848e"
2
+ version "0.95.9"
3
+ sha256 "b2d7dd26b67fceb32db31d5506c0890f9c879f56d049e6fd051fac151b68a300"
4
4
 
5
5
  url "https://github.com/basnijholt/agent-cli/releases/download/v#{version}/AgentCLI.dmg"
6
6
  name "Agent CLI"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-cli
3
- Version: 0.95.8
3
+ Version: 0.95.10
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>
@@ -7,6 +7,7 @@ Manage agent-cli servers as background daemons:
7
7
 
8
8
  from __future__ import annotations
9
9
 
10
+ import json
10
11
  import platform
11
12
  from typing import Annotated
12
13
 
@@ -17,6 +18,7 @@ from agent_cli.cli import app as main_app
17
18
  from agent_cli.core.utils import console, err_console
18
19
  from agent_cli.install.service_config import (
19
20
  SERVICES,
21
+ ServiceStatus,
20
22
  get_default_services,
21
23
  get_service_manager,
22
24
  )
@@ -42,6 +44,9 @@ Install, uninstall, and monitor agent-cli servers running as system daemons
42
44
  **Examples:**
43
45
 
44
46
  ```bash
47
+ # Ensure whisper is installed and running
48
+ agent-cli daemon ensure whisper
49
+
45
50
  # Install whisper as a background daemon
46
51
  agent-cli daemon install whisper
47
52
 
@@ -196,6 +201,110 @@ def _ensure_uv_installed(no_confirm: bool) -> None:
196
201
  raise typer.Exit(1)
197
202
 
198
203
 
204
+ def _service_status_payload(
205
+ *,
206
+ service: str,
207
+ action: str,
208
+ status: ServiceStatus,
209
+ message: str,
210
+ ) -> dict[str, object]:
211
+ installed = bool(status.installed)
212
+ running = bool(status.running)
213
+ return {
214
+ "service": service,
215
+ "action": action,
216
+ "installed": installed,
217
+ "running": running,
218
+ "pid": getattr(status, "pid", None) if running else None,
219
+ "message": message,
220
+ }
221
+
222
+
223
+ @app.command("ensure")
224
+ def ensure_cmd(
225
+ service: Annotated[
226
+ str,
227
+ typer.Argument(help="Service to ensure is installed and running"),
228
+ ],
229
+ json_output: Annotated[
230
+ bool,
231
+ typer.Option("--json", help="Output machine-readable status as JSON"),
232
+ ] = False,
233
+ quiet: Annotated[
234
+ bool,
235
+ typer.Option("--quiet", "-q", help="Suppress normal success output"),
236
+ ] = False,
237
+ ) -> None:
238
+ """Ensure one daemon is installed and running.
239
+
240
+ This is intended for app integrations that need a single repair command
241
+ instead of parsing human-oriented `daemon status` output.
242
+ """
243
+ if service not in SERVICES:
244
+ err_console.print(
245
+ f"[bold red]Error:[/bold red] Unknown service '{service}'. "
246
+ f"Available: {', '.join(SERVICES.keys())}",
247
+ )
248
+ raise typer.Exit(1)
249
+
250
+ try:
251
+ manager = get_service_manager()
252
+ except RuntimeError as e:
253
+ err_console.print(f"[bold red]Error:[/bold red] {e}")
254
+ raise typer.Exit(1) from None
255
+
256
+ status = manager.get_service_status(service)
257
+ if status.installed and status.running:
258
+ payload = _service_status_payload(
259
+ service=service,
260
+ action="already_running",
261
+ status=status,
262
+ message="Already running",
263
+ )
264
+ else:
265
+ action = "installed" if not status.installed else "restarted"
266
+ result = manager.install_service(service)
267
+ if not result.success:
268
+ payload = _service_status_payload(
269
+ service=service,
270
+ action="failed",
271
+ status=status,
272
+ message=result.message,
273
+ )
274
+ if json_output:
275
+ console.print(json.dumps(payload))
276
+ else:
277
+ err_console.print(f"[bold red]Error:[/bold red] {service}: {result.message}")
278
+ raise typer.Exit(1)
279
+
280
+ status = manager.get_service_status(service)
281
+ if not status.installed or not status.running:
282
+ message = f"{result.message}, but service is not running"
283
+ payload = _service_status_payload(
284
+ service=service,
285
+ action="failed",
286
+ status=status,
287
+ message=message,
288
+ )
289
+ if json_output:
290
+ console.print(json.dumps(payload))
291
+ else:
292
+ err_console.print(f"[bold red]Error:[/bold red] {service}: {message}")
293
+ raise typer.Exit(1)
294
+
295
+ payload = _service_status_payload(
296
+ service=service,
297
+ action=action,
298
+ status=status,
299
+ message=result.message,
300
+ )
301
+
302
+ if json_output:
303
+ console.print(json.dumps(payload))
304
+ elif not quiet:
305
+ console.print(f"{service}: {payload['message']}")
306
+
307
+
199
308
  @app.command("install")
200
309
  def install_cmd( # noqa: PLR0912, PLR0915
201
310
  services: Annotated[
@@ -147,6 +147,9 @@ agent-cli daemon uninstall whisper
147
147
  Examples:
148
148
 
149
149
 
150
+ # Ensure whisper is installed and running
151
+ agent-cli daemon ensure whisper
152
+
150
153
  # Install whisper as a background daemon
151
154
  agent-cli daemon install whisper
152
155
 
@@ -167,6 +170,7 @@ agent-cli daemon uninstall whisper
167
170
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
168
171
  ╭─ Commands ─────────────────────────────────────────────────────────────────────────────╮
169
172
  │ status Check status of installed daemons. │
173
+ │ ensure Ensure one daemon is installed and running. │
170
174
  │ install Install server daemons as background processes. │
171
175
  │ uninstall Uninstall server daemons. │
172
176
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
@@ -8,6 +8,15 @@
8
8
  "revision" : "70caa8dea43e2d273cd5ab78885d7eff01df550c",
9
9
  "version" : "1.10.0"
10
10
  }
11
+ },
12
+ {
13
+ "identity" : "sparkle",
14
+ "kind" : "remoteSourceControl",
15
+ "location" : "https://github.com/sparkle-project/Sparkle",
16
+ "state" : {
17
+ "revision" : "6276ba2b404829d139c45ff98427cf90e2efc59b",
18
+ "version" : "2.9.2"
19
+ }
11
20
  }
12
21
  ],
13
22
  "version" : 2
@@ -12,12 +12,14 @@ let package = Package(
12
12
  ],
13
13
  dependencies: [
14
14
  .package(url: "https://github.com/sindresorhus/KeyboardShortcuts", exact: "1.10.0"),
15
+ .package(url: "https://github.com/sparkle-project/Sparkle", exact: "2.9.2"),
15
16
  ],
16
17
  targets: [
17
18
  .executableTarget(
18
19
  name: "AgentCLI",
19
20
  dependencies: [
20
21
  .product(name: "KeyboardShortcuts", package: "KeyboardShortcuts"),
22
+ .product(name: "Sparkle", package: "Sparkle"),
21
23
  ],
22
24
  path: "Sources/AgentCLI"
23
25
  ),
@@ -30,6 +30,12 @@ clipboard utility shortcuts still use `KeyboardShortcuts` global handlers. The
30
30
  login option uses Apple's login item API for the main app bundle, so macOS may
31
31
  require approval in System Settings → General → Login Items.
32
32
 
33
+ The app uses Sparkle for direct app updates. Release builds stamp
34
+ `SUPublicEDKey` into `Info.plist`, publish signed updates in `macos/appcast.xml`,
35
+ upload `AgentCLI.zip` for Sparkle, and expose **Check for Updates...** from the
36
+ menu bar and Settings. Local builds without a Sparkle public key still run, but
37
+ update checks are disabled.
38
+
33
39
  ## Build
34
40
 
35
41
  From the repository root:
@@ -86,6 +92,7 @@ NOTARIZE=1 \
86
92
  APPLE_ID="you@example.com" \
87
93
  APPLE_APP_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx" \
88
94
  APPLE_TEAM_ID="TEAMID" \
95
+ SPARKLE_PUBLIC_ED_KEY="public-ed25519-key" \
89
96
  ./macos/build-macos-app.sh --dmg
90
97
  ```
91
98
 
@@ -103,3 +110,8 @@ workflow expects these repository secrets:
103
110
  - `APPLE_ID`: Apple ID email for notarization
104
111
  - `APPLE_APP_SPECIFIC_PASSWORD`: app-specific password for `notarytool`
105
112
  - `APPLE_TEAM_ID`: Apple Developer Team ID
113
+ - `SPARKLE_PRIVATE_ED_KEY`: private Sparkle EdDSA key for signing updates
114
+
115
+ The workflow also expects the repository variable `SPARKLE_PUBLIC_ED_KEY`.
116
+ Generate the key pair with Sparkle's `generate_keys` tool and store only the
117
+ private key as a GitHub secret.
@@ -28,5 +28,9 @@
28
28
  <true/>
29
29
  <key>NSMicrophoneUsageDescription</key>
30
30
  <string>Agent CLI uses microphone access when you start transcription or voice editing from the menu bar.</string>
31
+ <key>SUEnableInstallerLauncherService</key>
32
+ <true/>
33
+ <key>SUFeedURL</key>
34
+ <string>https://raw.githubusercontent.com/basnijholt/agent-cli/main/macos/appcast.xml</string>
31
35
  </dict>
32
36
  </plist>
@@ -6,6 +6,7 @@ struct AgentCLIApp: App {
6
6
  @NSApplicationDelegateAdaptor(AppDelegate.self) private var appDelegate
7
7
  @Environment(\.openWindow) private var openWindow
8
8
  @StateObject private var runner = AgentCommandRunner.shared
9
+ @StateObject private var appUpdater = AppUpdater.shared
9
10
  @StateObject private var loginItemController = LoginItemController.shared
10
11
  @StateObject private var shortcutSummary = ShortcutSummaryState.shared
11
12
  @AppStorage(RuntimeSettings.useUserInstalledAgentCLIKey)
@@ -33,8 +34,7 @@ struct AgentCLIApp: App {
33
34
 
34
35
  Divider()
35
36
 
36
- Text("Voice: \(runner.menuStatusMessage)")
37
- .lineLimit(1)
37
+ VoiceStatusMenuItem(runner: runner)
38
38
 
39
39
  Text(shortcutSummary.summary)
40
40
  .lineLimit(1)
@@ -77,6 +77,13 @@ struct AgentCLIApp: App {
77
77
  Label("Settings...", systemImage: "gearshape")
78
78
  }
79
79
 
80
+ Button {
81
+ appUpdater.checkForUpdates()
82
+ } label: {
83
+ Label("Check for Updates...", systemImage: "arrow.down.circle")
84
+ }
85
+ .disabled(!appUpdater.canCheckForUpdates)
86
+
80
87
  Menu {
81
88
  Button {
82
89
  runner.run(.voiceServiceStatus)
@@ -29,8 +29,8 @@ final class AgentCommandRunner: ObservableObject {
29
29
  @Published private(set) var isRecording = false
30
30
  @Published private(set) var bootstrapPhase: BootstrapPhase = .idle
31
31
  @Published private var activeCommandCount = 0
32
- @Published private var bootstrapAnimationTick = 0
33
- @Published private var bootstrapElapsedSeconds = 0
32
+ private var bootstrapAnimationTick = 0
33
+ private var bootstrapElapsedSeconds = 0
34
34
  private var recordingIndicator = RecordingIndicatorController()
35
35
  private let pasteController: TranscriptPasteController
36
36
  private let bootstrap: AgentBootstrap
@@ -161,7 +161,7 @@ final class AgentCommandRunner: ObservableObject {
161
161
  self.stopBootstrapAnimationTimer()
162
162
  return
163
163
  }
164
- self.bootstrapAnimationTick = (self.bootstrapAnimationTick + 1) % 3
164
+ self.bootstrapAnimationTick = (self.bootstrapAnimationTick + 1) % 4
165
165
  if let startedAt = self.bootstrapPhaseStartedAt {
166
166
  self.bootstrapElapsedSeconds = max(0, Int(Date().timeIntervalSince(startedAt)))
167
167
  }
@@ -12,6 +12,9 @@ private enum AgentCLIRuntimeMode: Equatable {
12
12
  }
13
13
  }
14
14
 
15
+ typealias AgentProcessRunner = (URL, [String], [String: String]) -> CommandResult
16
+ typealias LocalhostConnector = (UInt16) -> Bool
17
+
15
18
  struct AgentRuntime {
16
19
  static let shared = AgentRuntime()
17
20
 
@@ -37,6 +40,9 @@ struct AgentRuntime {
37
40
  private let fileManager = FileManager.default
38
41
  private let baseEnvironment: [String: String]
39
42
  private let userDefaults: UserDefaults
43
+ private let processRunner: AgentProcessRunner
44
+ private let localhostConnector: LocalhostConnector
45
+ private let whisperReadyTimeout: TimeInterval
40
46
  let appSupportURL: URL
41
47
  let bundledUVURL: URL
42
48
  let bundledWheelsURL: URL
@@ -56,10 +62,18 @@ struct AgentRuntime {
56
62
  init(
57
63
  environment: [String: String] = ProcessInfo.processInfo.environment,
58
64
  bundle: Bundle = .main,
59
- userDefaults: UserDefaults = .standard
65
+ userDefaults: UserDefaults = .standard,
66
+ processRunner: @escaping AgentProcessRunner = {
67
+ AgentRuntime.runProcess(executableURL: $0, arguments: $1, environment: $2)
68
+ },
69
+ localhostConnector: @escaping LocalhostConnector = AgentRuntime.canConnectToLocalhost,
70
+ whisperReadyTimeout: TimeInterval = 180
60
71
  ) {
61
72
  self.baseEnvironment = environment
62
73
  self.userDefaults = userDefaults
74
+ self.processRunner = processRunner
75
+ self.localhostConnector = localhostConnector
76
+ self.whisperReadyTimeout = whisperReadyTimeout
63
77
 
64
78
  if let override = environment["AGENTCLI_APP_SUPPORT_DIR"], !override.isEmpty {
65
79
  appSupportURL = URL(fileURLWithPath: override, isDirectory: true)
@@ -201,9 +215,9 @@ struct AgentRuntime {
201
215
  }
202
216
 
203
217
  let installDescription = "uv tool install agent-cli[audio,llm]"
204
- let result = Self.runProcess(
205
- executableURL: bundledUVURL,
206
- arguments: [
218
+ let result = processRunner(
219
+ bundledUVURL,
220
+ [
207
221
  "tool",
208
222
  "install",
209
223
  "--managed-python",
@@ -212,7 +226,7 @@ struct AgentRuntime {
212
226
  "--force",
213
227
  agentCLIInstallRequirement
214
228
  ],
215
- environment: commandEnvironment()
229
+ commandEnvironment()
216
230
  )
217
231
  if result.exitCode != 0, result.output.isEmpty {
218
232
  return CommandResult(exitCode: result.exitCode, output: "\(installDescription) failed")
@@ -228,10 +242,10 @@ struct AgentRuntime {
228
242
  }
229
243
 
230
244
  private func ensureUserInstalledCLIAvailable() -> CommandResult {
231
- let result = Self.runProcess(
232
- executableURL: agentCLIExecutableURL,
233
- arguments: agentCLIProcessArguments(["--version"]),
234
- environment: commandEnvironment()
245
+ let result = processRunner(
246
+ agentCLIExecutableURL,
247
+ agentCLIProcessArguments(["--version"]),
248
+ commandEnvironment()
235
249
  )
236
250
  guard result.exitCode != 127 else {
237
251
  return CommandResult(
@@ -292,11 +306,17 @@ struct AgentRuntime {
292
306
  ) -> CommandResult {
293
307
  if !force, (try? String(contentsOf: whisperDaemonMarkerURL)) == whisperDaemonMarkerContents {
294
308
  progress(.waitingForVoiceService)
295
- return waitForWhisperDaemonReady()
309
+ if localhostConnector(10300) {
310
+ return CommandResult(exitCode: 0, output: "")
311
+ }
296
312
  }
297
313
 
314
+ return installWhisperDaemon(progress: progress)
315
+ }
316
+
317
+ private func installWhisperDaemon(progress: AgentBootstrapProgress) -> CommandResult {
298
318
  progress(.installingVoiceService)
299
- let result = runAgentCLI(arguments: ["daemon", "install", "whisper", "-y"])
319
+ let result = runAgentCLI(arguments: ["daemon", "ensure", "whisper", "--quiet"])
300
320
  guard result.exitCode == 0 else {
301
321
  return result
302
322
  }
@@ -395,10 +415,14 @@ struct AgentRuntime {
395
415
  }
396
416
  }
397
417
 
398
- private func waitForWhisperDaemonReady(timeout: TimeInterval = 180) -> CommandResult {
418
+ private func waitForWhisperDaemonReady() -> CommandResult {
419
+ waitForWhisperDaemonReady(timeout: whisperReadyTimeout)
420
+ }
421
+
422
+ private func waitForWhisperDaemonReady(timeout: TimeInterval) -> CommandResult {
399
423
  let deadline = Date().addingTimeInterval(timeout)
400
424
  while Date() < deadline {
401
- if Self.canConnectToLocalhost(port: 10300) {
425
+ if localhostConnector(10300) {
402
426
  return CommandResult(exitCode: 0, output: "")
403
427
  }
404
428
  Thread.sleep(forTimeInterval: 0.5)
@@ -555,18 +579,18 @@ struct AgentRuntime {
555
579
  }
556
580
 
557
581
  func runShell(_ shell: String) -> CommandResult {
558
- Self.runProcess(
559
- executableURL: URL(fileURLWithPath: "/bin/zsh"),
560
- arguments: ["-lc", shell],
561
- environment: commandEnvironment()
582
+ processRunner(
583
+ URL(fileURLWithPath: "/bin/zsh"),
584
+ ["-lc", shell],
585
+ commandEnvironment()
562
586
  )
563
587
  }
564
588
 
565
589
  func runAgentCLI(arguments: [String]) -> CommandResult {
566
- Self.runProcess(
567
- executableURL: agentCLIExecutableURL,
568
- arguments: agentCLIProcessArguments(arguments),
569
- environment: commandEnvironment()
590
+ processRunner(
591
+ agentCLIExecutableURL,
592
+ agentCLIProcessArguments(arguments),
593
+ commandEnvironment()
570
594
  )
571
595
  }
572
596