agent-cli 0.95.9__tar.gz → 0.95.11__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 (436) hide show
  1. {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/workflows/release.yml +52 -10
  2. {agent_cli-0.95.9 → agent_cli-0.95.11}/Casks/agent-cli.rb +2 -2
  3. {agent_cli-0.95.9 → agent_cli-0.95.11}/PKG-INFO +1 -1
  4. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/daemon/cli.py +109 -0
  5. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/daemon.md +4 -0
  6. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Package.resolved +9 -0
  7. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Package.swift +2 -0
  8. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/README.md +12 -0
  9. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Resources/Info.plist +4 -0
  10. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +9 -2
  11. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +2 -2
  12. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +45 -21
  13. agent_cli-0.95.11/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +46 -0
  14. agent_cli-0.95.11/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +33 -0
  15. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +23 -0
  16. agent_cli-0.95.11/macos/AgentCLI/Sources/AgentCLI/VoiceStatusMenuItem.swift +60 -0
  17. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +102 -0
  18. agent_cli-0.95.11/macos/appcast.xml +26 -0
  19. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/build-macos-app.sh +41 -5
  20. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_daemon.py +118 -0
  21. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_macos_app.py +76 -24
  22. {agent_cli-0.95.9 → agent_cli-0.95.11}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  23. {agent_cli-0.95.9 → agent_cli-0.95.11}/.claude/skills/agent-cli-dev/examples.md +0 -0
  24. {agent_cli-0.95.9 → agent_cli-0.95.11}/.claude-plugin/README.md +0 -0
  25. {agent_cli-0.95.9 → agent_cli-0.95.11}/.claude-plugin/marketplace.json +0 -0
  26. {agent_cli-0.95.9 → agent_cli-0.95.11}/.claude-plugin/plugin.json +0 -0
  27. {agent_cli-0.95.9 → agent_cli-0.95.11}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  28. {agent_cli-0.95.9 → agent_cli-0.95.11}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  29. {agent_cli-0.95.9 → agent_cli-0.95.11}/.cursorrules +0 -0
  30. {agent_cli-0.95.9 → agent_cli-0.95.11}/.dockerignore +0 -0
  31. {agent_cli-0.95.9 → agent_cli-0.95.11}/.env.example +0 -0
  32. {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/logo.svg +0 -0
  33. {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/release-drafter.yml +0 -0
  34. {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/renovate.json +0 -0
  35. {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/scripts/check_extras_sync.py +0 -0
  36. {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/scripts/check_plugin_skill_sync.py +0 -0
  37. {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/scripts/sync_extras.py +0 -0
  38. {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/scripts/sync_requirements.py +0 -0
  39. {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/scripts/update_cask.py +0 -0
  40. {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/workflows/automerge.yml +0 -0
  41. {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/workflows/docker.yml +0 -0
  42. {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/workflows/docs.yml +0 -0
  43. {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/workflows/markdown-code-runner.yml +0 -0
  44. {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/workflows/pytest.yml +0 -0
  45. {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/workflows/release-drafter.yml +0 -0
  46. {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/workflows/toc.yaml +0 -0
  47. {agent_cli-0.95.9 → agent_cli-0.95.11}/.gitignore +0 -0
  48. {agent_cli-0.95.9 → agent_cli-0.95.11}/.jscpd.json +0 -0
  49. {agent_cli-0.95.9 → agent_cli-0.95.11}/.pre-commit-config.yaml +0 -0
  50. {agent_cli-0.95.9 → agent_cli-0.95.11}/.prompts/docs-review.md +0 -0
  51. {agent_cli-0.95.9 → agent_cli-0.95.11}/.prompts/pr-review.md +0 -0
  52. {agent_cli-0.95.9 → agent_cli-0.95.11}/CLAUDE.md +0 -0
  53. {agent_cli-0.95.9 → agent_cli-0.95.11}/LICENSE +0 -0
  54. {agent_cli-0.95.9 → agent_cli-0.95.11}/LLAMA_SERVER_USAGE.md +0 -0
  55. {agent_cli-0.95.9 → agent_cli-0.95.11}/README.md +0 -0
  56. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/__init__.py +0 -0
  57. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/__main__.py +0 -0
  58. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_extras.json +0 -0
  59. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/.gitkeep +0 -0
  60. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/audio.txt +0 -0
  61. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/diarization.txt +0 -0
  62. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/faster-whisper.txt +0 -0
  63. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/kokoro.txt +0 -0
  64. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/llm.txt +0 -0
  65. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/memory.txt +0 -0
  66. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  67. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/piper.txt +0 -0
  68. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/rag.txt +0 -0
  69. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/server.txt +0 -0
  70. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/speed.txt +0 -0
  71. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/vad.txt +0 -0
  72. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/vectordb.txt +0 -0
  73. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  74. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/wyoming.txt +0 -0
  75. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_tools.py +0 -0
  76. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/__init__.py +0 -0
  77. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/_voice_agent_common.py +0 -0
  78. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/assistant.py +0 -0
  79. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/autocorrect.py +0 -0
  80. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/chat.py +0 -0
  81. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/diarize_live_session.py +0 -0
  82. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/memory/__init__.py +0 -0
  83. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/memory/add.py +0 -0
  84. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/memory/proxy.py +0 -0
  85. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/rag_proxy.py +0 -0
  86. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/speak.py +0 -0
  87. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/speakers.py +0 -0
  88. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/transcribe.py +0 -0
  89. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/transcribe_live.py +0 -0
  90. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/voice_edit.py +0 -0
  91. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/api.py +0 -0
  92. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/cli.py +0 -0
  93. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/config.py +0 -0
  94. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/config_cmd.py +0 -0
  95. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/constants.py +0 -0
  96. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/__init__.py +0 -0
  97. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/alignment.py +0 -0
  98. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/audio.py +0 -0
  99. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/audio_format.py +0 -0
  100. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/chroma.py +0 -0
  101. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/deps.py +0 -0
  102. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/diarization.py +0 -0
  103. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/openai_proxy.py +0 -0
  104. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/process.py +0 -0
  105. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/reranker.py +0 -0
  106. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/speaker_identity.py +0 -0
  107. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/sse.py +0 -0
  108. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/transcription_logger.py +0 -0
  109. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/utils.py +0 -0
  110. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/vad.py +0 -0
  111. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/watch.py +0 -0
  112. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/daemon/__init__.py +0 -0
  113. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/__init__.py +0 -0
  114. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/_branch_name.py +0 -0
  115. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/_config.py +0 -0
  116. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/_output.py +0 -0
  117. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/cleanup.py +0 -0
  118. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/cli.py +0 -0
  119. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/__init__.py +0 -0
  120. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/aider.py +0 -0
  121. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/base.py +0 -0
  122. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/claude.py +0 -0
  123. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/codex.py +0 -0
  124. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  125. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/copilot.py +0 -0
  126. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  127. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/gemini.py +0 -0
  128. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/opencode.py +0 -0
  129. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/registry.py +0 -0
  130. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/__init__.py +0 -0
  131. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/base.py +0 -0
  132. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/cursor.py +0 -0
  133. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/emacs.py +0 -0
  134. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/jetbrains.py +0 -0
  135. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/nano.py +0 -0
  136. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/neovim.py +0 -0
  137. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/registry.py +0 -0
  138. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/sublime.py +0 -0
  139. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/vim.py +0 -0
  140. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/vscode.py +0 -0
  141. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/zed.py +0 -0
  142. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/hooks.py +0 -0
  143. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/launch.py +0 -0
  144. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/project.py +0 -0
  145. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/registry.py +0 -0
  146. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/skill/SKILL.md +0 -0
  147. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/skill/examples.md +0 -0
  148. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/__init__.py +0 -0
  149. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  150. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/base.py +0 -0
  151. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/gnome.py +0 -0
  152. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/iterm2.py +0 -0
  153. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/kitty.py +0 -0
  154. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/registry.py +0 -0
  155. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/tmux.py +0 -0
  156. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/warp.py +0 -0
  157. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/zellij.py +0 -0
  158. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/worktree.py +0 -0
  159. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/docs_gen.py +0 -0
  160. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/example-config.toml +0 -0
  161. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/install/__init__.py +0 -0
  162. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/install/common.py +0 -0
  163. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/install/extras.py +0 -0
  164. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/install/hotkeys.py +0 -0
  165. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/install/launchd.py +0 -0
  166. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/install/service_config.py +0 -0
  167. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/install/services.py +0 -0
  168. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/install/systemd.py +0 -0
  169. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/__init__.py +0 -0
  170. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_files.py +0 -0
  171. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_filters.py +0 -0
  172. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_git.py +0 -0
  173. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_indexer.py +0 -0
  174. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_ingest.py +0 -0
  175. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_persistence.py +0 -0
  176. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_prompt.py +0 -0
  177. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_retrieval.py +0 -0
  178. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_store.py +0 -0
  179. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_streaming.py +0 -0
  180. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_tasks.py +0 -0
  181. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/api.py +0 -0
  182. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/client.py +0 -0
  183. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/engine.py +0 -0
  184. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/entities.py +0 -0
  185. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/models.py +0 -0
  186. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/opts.py +0 -0
  187. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/py.typed +0 -0
  188. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/__init__.py +0 -0
  189. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/_indexer.py +0 -0
  190. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/_indexing.py +0 -0
  191. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/_prompt.py +0 -0
  192. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/_retriever.py +0 -0
  193. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/_store.py +0 -0
  194. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/_utils.py +0 -0
  195. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/api.py +0 -0
  196. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/client.py +0 -0
  197. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/engine.py +0 -0
  198. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/models.py +0 -0
  199. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  200. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/__init__.py +0 -0
  201. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  202. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  203. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  204. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  205. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  206. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  207. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  208. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  209. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  210. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  211. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  212. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  213. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  214. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  215. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/run-openwakeword.sh +0 -0
  216. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  217. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/setup-linux.sh +0 -0
  218. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  219. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/setup-macos.sh +0 -0
  220. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/setup-windows.ps1 +0 -0
  221. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  222. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/start-all-services.sh +0 -0
  223. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/__init__.py +0 -0
  224. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/cli.py +0 -0
  225. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/common.py +0 -0
  226. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/model_manager.py +0 -0
  227. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/model_registry.py +0 -0
  228. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/proxy/__init__.py +0 -0
  229. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/proxy/api.py +0 -0
  230. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/streaming.py +0 -0
  231. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/tts/__init__.py +0 -0
  232. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/tts/api.py +0 -0
  233. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/tts/backends/__init__.py +0 -0
  234. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/tts/backends/base.py +0 -0
  235. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/tts/backends/kokoro.py +0 -0
  236. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/tts/backends/piper.py +0 -0
  237. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/tts/model_manager.py +0 -0
  238. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/tts/model_registry.py +0 -0
  239. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/tts/wyoming_handler.py +0 -0
  240. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/__init__.py +0 -0
  241. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/api.py +0 -0
  242. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/backends/__init__.py +0 -0
  243. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/backends/base.py +0 -0
  244. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  245. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/backends/mlx.py +0 -0
  246. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/backends/transformers.py +0 -0
  247. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/languages.py +0 -0
  248. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/model_manager.py +0 -0
  249. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/model_registry.py +0 -0
  250. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  251. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/services/__init__.py +0 -0
  252. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/services/_wyoming_utils.py +0 -0
  253. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/services/asr.py +0 -0
  254. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/services/llm.py +0 -0
  255. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/services/tts.py +0 -0
  256. {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/services/wake_word.py +0 -0
  257. {agent_cli-0.95.9 → agent_cli-0.95.11}/docker/docker-compose.yml +0 -0
  258. {agent_cli-0.95.9 → agent_cli-0.95.11}/docker/memory-proxy.Dockerfile +0 -0
  259. {agent_cli-0.95.9 → agent_cli-0.95.11}/docker/rag-proxy.Dockerfile +0 -0
  260. {agent_cli-0.95.9 → agent_cli-0.95.11}/docker/transcribe-proxy.Dockerfile +0 -0
  261. {agent_cli-0.95.9 → agent_cli-0.95.11}/docker/tts.Dockerfile +0 -0
  262. {agent_cli-0.95.9 → agent_cli-0.95.11}/docker/whisper.Dockerfile +0 -0
  263. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/CNAME +0 -0
  264. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/architecture/index.md +0 -0
  265. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/architecture/memory.md +0 -0
  266. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/architecture/rag.md +0 -0
  267. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/assistant.md +0 -0
  268. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/autocorrect.md +0 -0
  269. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/chat.md +0 -0
  270. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/config.md +0 -0
  271. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/dev.md +0 -0
  272. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/diarize-live-session.md +0 -0
  273. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/index.md +0 -0
  274. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/install-extras.md +0 -0
  275. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/install-hotkeys.md +0 -0
  276. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/install-services.md +0 -0
  277. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/memory.md +0 -0
  278. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/rag-proxy.md +0 -0
  279. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/server/index.md +0 -0
  280. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/server/transcribe-proxy.md +0 -0
  281. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/server/tts.md +0 -0
  282. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/server/whisper.md +0 -0
  283. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/speak.md +0 -0
  284. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/speakers.md +0 -0
  285. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/start-services.md +0 -0
  286. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/transcribe-live.md +0 -0
  287. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/transcribe.md +0 -0
  288. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/voice-edit.md +0 -0
  289. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/configuration.md +0 -0
  290. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/getting-started.md +0 -0
  291. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/iOS_Shortcut_Guide.md +0 -0
  292. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/index.md +0 -0
  293. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/installation/docker.md +0 -0
  294. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/installation/index.md +0 -0
  295. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/installation/linux.md +0 -0
  296. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/installation/macos.md +0 -0
  297. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/installation/nixos.md +0 -0
  298. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/installation/windows.md +0 -0
  299. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/logo-avatar.svg +0 -0
  300. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/logo-clean.svg +0 -0
  301. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  302. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/run_markdown_code_runner.py +0 -0
  303. {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/system-integration.md +0 -0
  304. {agent_cli-0.95.9 → agent_cli-0.95.11}/example.agent-cli-config.toml +0 -0
  305. {agent_cli-0.95.9 → agent_cli-0.95.11}/justfile +0 -0
  306. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
  307. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
  308. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
  309. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
  310. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
  311. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
  312. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
  313. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
  314. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
  315. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
  316. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
  317. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
  318. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
  319. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
  320. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
  321. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
  322. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
  323. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
  324. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
  325. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +0 -0
  326. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
  327. {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/test-macos-app-e2e.sh +0 -0
  328. {agent_cli-0.95.9 → agent_cli-0.95.11}/pyproject.toml +0 -0
  329. {agent_cli-0.95.9 → agent_cli-0.95.11}/reddit.md +0 -0
  330. {agent_cli-0.95.9 → agent_cli-0.95.11}/shell.nix +0 -0
  331. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/__init__.py +0 -0
  332. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/__init__.py +0 -0
  333. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_fix_my_text.py +0 -0
  334. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_interactive.py +0 -0
  335. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_interactive_extra.py +0 -0
  336. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_memory_add.py +0 -0
  337. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_speak.py +0 -0
  338. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_speak_e2e.py +0 -0
  339. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_speakers.py +0 -0
  340. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_transcribe.py +0 -0
  341. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_transcribe_agent.py +0 -0
  342. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_transcribe_e2e.py +0 -0
  343. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_transcribe_live.py +0 -0
  344. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_transcribe_recovery.py +0 -0
  345. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_tts_common.py +0 -0
  346. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_tts_common_extra.py +0 -0
  347. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_voice_agent_common.py +0 -0
  348. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_voice_edit.py +0 -0
  349. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_voice_edit_e2e.py +0 -0
  350. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_wake_word_assistant.py +0 -0
  351. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/conftest.py +0 -0
  352. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/core/__init__.py +0 -0
  353. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/core/test_audio.py +0 -0
  354. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/core/test_audio_format.py +0 -0
  355. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/core/test_chroma.py +0 -0
  356. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/core/test_sse.py +0 -0
  357. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/core/test_vad.py +0 -0
  358. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/core/test_watch.py +0 -0
  359. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/__init__.py +0 -0
  360. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_cleanup.py +0 -0
  361. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_cli.py +0 -0
  362. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_coding_agents.py +0 -0
  363. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_editors.py +0 -0
  364. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_hooks.py +0 -0
  365. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_launch.py +0 -0
  366. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_project.py +0 -0
  367. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_terminals.py +0 -0
  368. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_verification.py +0 -0
  369. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_worktree.py +0 -0
  370. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/install/__init__.py +0 -0
  371. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/install/test_extras.py +0 -0
  372. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/install/test_launchd.py +0 -0
  373. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/__init__.py +0 -0
  374. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_api_health.py +0 -0
  375. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_api_integration_liveish.py +0 -0
  376. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_client.py +0 -0
  377. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_engine.py +0 -0
  378. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_files.py +0 -0
  379. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_filters.py +0 -0
  380. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_git_integration.py +0 -0
  381. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_indexer.py +0 -0
  382. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_memory_integration.py +0 -0
  383. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_proxy_passthrough.py +0 -0
  384. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_store.py +0 -0
  385. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_utils.py +0 -0
  386. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/mocks/__init__.py +0 -0
  387. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/mocks/audio.py +0 -0
  388. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/mocks/llm.py +0 -0
  389. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/mocks/wyoming.py +0 -0
  390. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/__init__.py +0 -0
  391. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_api.py +0 -0
  392. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_engine.py +0 -0
  393. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_history.py +0 -0
  394. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_indexer.py +0 -0
  395. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_indexing.py +0 -0
  396. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_rag_client.py +0 -0
  397. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_rag_integration_liveish.py +0 -0
  398. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  399. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_retriever.py +0 -0
  400. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_store.py +0 -0
  401. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_utils.py +0 -0
  402. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_alignment.py +0 -0
  403. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_api.py +0 -0
  404. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_api_integration.py +0 -0
  405. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_asr.py +0 -0
  406. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_asr_recovery.py +0 -0
  407. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_audio_e2e.py +0 -0
  408. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_cli.py +0 -0
  409. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_config.py +0 -0
  410. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_config_cmd.py +0 -0
  411. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_diarization.py +0 -0
  412. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_diarize_live_session.py +0 -0
  413. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_docs_gen.py +0 -0
  414. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_env_vars.py +0 -0
  415. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_faster_whisper_backend.py +0 -0
  416. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_json_output.py +0 -0
  417. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_llm.py +0 -0
  418. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_llm_gemini.py +0 -0
  419. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_memory_tools.py +0 -0
  420. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_mlx_backend.py +0 -0
  421. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_process_manager.py +0 -0
  422. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_requires_extras.py +0 -0
  423. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_server_streaming.py +0 -0
  424. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_server_tts.py +0 -0
  425. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_server_whisper.py +0 -0
  426. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_services.py +0 -0
  427. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_speaker_identity.py +0 -0
  428. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_tools.py +0 -0
  429. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_transformers_backend.py +0 -0
  430. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_tts.py +0 -0
  431. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_update_cask.py +0 -0
  432. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_utils.py +0 -0
  433. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_wake_word.py +0 -0
  434. {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_wyoming_utils.py +0 -0
  435. {agent_cli-0.95.9 → agent_cli-0.95.11}/uv.lock +0 -0
  436. {agent_cli-0.95.9 → agent_cli-0.95.11}/zensical.toml +0 -0
@@ -58,34 +58,76 @@ jobs:
58
58
  APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
59
59
  APP_VERSION: ${{ github.event.release.tag_name }}
60
60
  BUILD_VERSION: ${{ github.run_number }}
61
- run: NOTARIZE=1 macos/build-macos-app.sh --dmg
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
62
69
  - name: Upload macOS app to GitHub Release
63
70
  env:
64
71
  GH_TOKEN: ${{ github.token }}
65
72
  TAG_NAME: ${{ github.event.release.tag_name }}
66
- run: gh release upload "$TAG_NAME" dist/macos/AgentCLI.dmg --clobber
67
- - name: Update Homebrew cask
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
68
113
  env:
69
114
  TAG_NAME: ${{ github.event.release.tag_name }}
70
115
  run: |
71
116
  VERSION="${TAG_NAME#v}"
72
117
  SHA256=$(shasum -a 256 dist/macos/AgentCLI.dmg | awk '{ print $1 }')
73
118
 
74
- git fetch origin main
75
- git switch --force-create cask-update origin/main
76
-
77
119
  python3 .github/scripts/update_cask.py \
78
120
  --version "$VERSION" \
79
121
  --sha256 "$SHA256"
80
122
 
81
- if git diff --quiet -- Casks/agent-cli.rb; then
82
- echo "Casks/agent-cli.rb is already up to date."
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."
83
125
  exit 0
84
126
  fi
85
127
 
86
128
  git config user.name "github-actions[bot]"
87
129
  git config user.email "github-actions[bot]@users.noreply.github.com"
88
- git add Casks/agent-cli.rb
89
- git commit -m "Update AgentCLI cask to ${TAG_NAME}"
130
+ git add Casks/agent-cli.rb macos/appcast.xml
131
+ git commit -m "Update AgentCLI release metadata to ${TAG_NAME}"
90
132
  git pull --rebase origin main
91
133
  git push origin HEAD:main
@@ -1,6 +1,6 @@
1
1
  cask "agent-cli" do
2
- version "0.95.8"
3
- sha256 "60273504f3c4bea181db64033790e0290bf1b53b86a1386afa3d41216a172029"
2
+ version "0.95.10"
3
+ sha256 "ac6924d40452ded9757ed30c4fb6a066dbb2969a99998f4b3e63ceb301173e1e"
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.9
3
+ Version: 0.95.11
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
@@ -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
 
@@ -0,0 +1,46 @@
1
+ import Foundation
2
+
3
+ struct SparkleConfiguration: Equatable {
4
+ let feedURL: String
5
+ let publicEDKey: String
6
+
7
+ var isConfigured: Bool {
8
+ !feedURL.isEmpty && !publicEDKey.isEmpty
9
+ }
10
+ }
11
+
12
+ enum AppMetadata {
13
+ static var versionDisplayString: String {
14
+ versionDisplayString(infoDictionary: Bundle.main.infoDictionary ?? [:])
15
+ }
16
+
17
+ static var sparkleConfiguration: SparkleConfiguration {
18
+ sparkleConfiguration(infoDictionary: Bundle.main.infoDictionary ?? [:])
19
+ }
20
+
21
+ static func versionDisplayString(infoDictionary: [String: Any]) -> String {
22
+ let shortVersion = stringValue(
23
+ infoDictionary["CFBundleShortVersionString"],
24
+ fallback: "Unknown"
25
+ )
26
+ let buildVersion = stringValue(infoDictionary["CFBundleVersion"])
27
+
28
+ guard !buildVersion.isEmpty, buildVersion != shortVersion else {
29
+ return shortVersion
30
+ }
31
+ return "\(shortVersion) (\(buildVersion))"
32
+ }
33
+
34
+ static func sparkleConfiguration(infoDictionary: [String: Any]) -> SparkleConfiguration {
35
+ SparkleConfiguration(
36
+ feedURL: stringValue(infoDictionary["SUFeedURL"]),
37
+ publicEDKey: stringValue(infoDictionary["SUPublicEDKey"])
38
+ )
39
+ }
40
+
41
+ private static func stringValue(_ value: Any?, fallback: String = "") -> String {
42
+ guard let string = value as? String else { return fallback }
43
+ let trimmed = string.trimmingCharacters(in: .whitespacesAndNewlines)
44
+ return trimmed.isEmpty ? fallback : trimmed
45
+ }
46
+ }
@@ -0,0 +1,33 @@
1
+ import Foundation
2
+ import Sparkle
3
+
4
+ @MainActor
5
+ final class AppUpdater: ObservableObject {
6
+ static let shared = AppUpdater()
7
+
8
+ private let updaterController: SPUStandardUpdaterController?
9
+
10
+ var canCheckForUpdates: Bool {
11
+ updaterController != nil
12
+ }
13
+
14
+ private init(configuration: SparkleConfiguration = AppMetadata.sparkleConfiguration) {
15
+ guard configuration.isConfigured else {
16
+ updaterController = nil
17
+ return
18
+ }
19
+ updaterController = SPUStandardUpdaterController(
20
+ startingUpdater: true,
21
+ updaterDelegate: nil,
22
+ userDriverDelegate: nil
23
+ )
24
+ }
25
+
26
+ func checkForUpdates() {
27
+ guard let updaterController else {
28
+ AgentCommandRunner.shared.statusMessage = "App updates are not configured for this build"
29
+ return
30
+ }
31
+ updaterController.checkForUpdates(nil)
32
+ }
33
+ }
@@ -276,6 +276,7 @@ enum ShortcutDefaultsMigrator {
276
276
 
277
277
  struct SettingsView: View {
278
278
  @ObservedObject private var loginItemController = LoginItemController.shared
279
+ @ObservedObject private var appUpdater = AppUpdater.shared
279
280
  @AppStorage(RuntimeSettings.useUserInstalledAgentCLIKey)
280
281
  private var useUserInstalledAgentCLI = false
281
282
  @AppStorage(RecordingSoundSettings.enabledKey)
@@ -321,6 +322,28 @@ struct SettingsView: View {
321
322
  Text("Names, vocabulary, and guidance to pass as initial transcription context.")
322
323
  }
323
324
 
325
+ Section {
326
+ HStack {
327
+ Text("Version")
328
+ Spacer()
329
+ Text(AppMetadata.versionDisplayString)
330
+ .foregroundStyle(.secondary)
331
+ }
332
+
333
+ Button("Check for Updates...") {
334
+ appUpdater.checkForUpdates()
335
+ }
336
+ .disabled(!appUpdater.canCheckForUpdates)
337
+ } header: {
338
+ Text("Updates")
339
+ } footer: {
340
+ Text(
341
+ appUpdater.canCheckForUpdates
342
+ ? "Uses Sparkle to install signed Agent CLI app updates."
343
+ : "App updates are not configured for this build."
344
+ )
345
+ }
346
+
324
347
  Section {
325
348
  ShortcutRecorderRow(
326
349
  title: "Toggle Transcription",