agent-cli 0.94.2__tar.gz → 0.95.0__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 (416) hide show
  1. agent_cli-0.95.0/.github/workflows/release.yml +61 -0
  2. {agent_cli-0.94.2 → agent_cli-0.95.0}/.gitignore +1 -0
  3. {agent_cli-0.94.2 → agent_cli-0.95.0}/.pre-commit-config.yaml +1 -1
  4. {agent_cli-0.94.2 → agent_cli-0.95.0}/PKG-INFO +1 -1
  5. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/process.py +175 -25
  6. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/daemon/cli.py +4 -2
  7. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/install/launchd.py +23 -1
  8. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/install/service_config.py +8 -1
  9. agent_cli-0.95.0/docs/logo-avatar.svg +51 -0
  10. agent_cli-0.95.0/macos/AgentCLI/Package.resolved +14 -0
  11. agent_cli-0.95.0/macos/AgentCLI/Package.swift +25 -0
  12. agent_cli-0.95.0/macos/AgentCLI/README.md +97 -0
  13. agent_cli-0.95.0/macos/AgentCLI/Resources/Info.plist +32 -0
  14. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +145 -0
  15. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +82 -0
  16. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +579 -0
  17. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +322 -0
  18. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +85 -0
  19. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +6 -0
  20. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +32 -0
  21. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +40 -0
  22. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +67 -0
  23. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +309 -0
  24. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +180 -0
  25. agent_cli-0.95.0/macos/build-macos-app.sh +333 -0
  26. agent_cli-0.95.0/macos/test-macos-app-e2e.sh +168 -0
  27. agent_cli-0.95.0/tests/install/test_launchd.py +85 -0
  28. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_daemon.py +69 -0
  29. agent_cli-0.95.0/tests/test_macos_app.py +803 -0
  30. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_process_manager.py +63 -4
  31. agent_cli-0.94.2/.github/workflows/release.yml +0 -22
  32. agent_cli-0.94.2/tests/install/test_launchd.py +0 -23
  33. {agent_cli-0.94.2 → agent_cli-0.95.0}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  34. {agent_cli-0.94.2 → agent_cli-0.95.0}/.claude/skills/agent-cli-dev/examples.md +0 -0
  35. {agent_cli-0.94.2 → agent_cli-0.95.0}/.claude-plugin/README.md +0 -0
  36. {agent_cli-0.94.2 → agent_cli-0.95.0}/.claude-plugin/marketplace.json +0 -0
  37. {agent_cli-0.94.2 → agent_cli-0.95.0}/.claude-plugin/plugin.json +0 -0
  38. {agent_cli-0.94.2 → agent_cli-0.95.0}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  39. {agent_cli-0.94.2 → agent_cli-0.95.0}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  40. {agent_cli-0.94.2 → agent_cli-0.95.0}/.cursorrules +0 -0
  41. {agent_cli-0.94.2 → agent_cli-0.95.0}/.dockerignore +0 -0
  42. {agent_cli-0.94.2 → agent_cli-0.95.0}/.env.example +0 -0
  43. {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/logo.svg +0 -0
  44. {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/release-drafter.yml +0 -0
  45. {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/renovate.json +0 -0
  46. {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/scripts/check_extras_sync.py +0 -0
  47. {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/scripts/check_plugin_skill_sync.py +0 -0
  48. {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/scripts/sync_extras.py +0 -0
  49. {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/scripts/sync_requirements.py +0 -0
  50. {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/workflows/automerge.yml +0 -0
  51. {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/workflows/docker.yml +0 -0
  52. {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/workflows/docs.yml +0 -0
  53. {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/workflows/markdown-code-runner.yml +0 -0
  54. {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/workflows/pytest.yml +0 -0
  55. {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/workflows/release-drafter.yml +0 -0
  56. {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/workflows/toc.yaml +0 -0
  57. {agent_cli-0.94.2 → agent_cli-0.95.0}/.jscpd.json +0 -0
  58. {agent_cli-0.94.2 → agent_cli-0.95.0}/.prompts/docs-review.md +0 -0
  59. {agent_cli-0.94.2 → agent_cli-0.95.0}/.prompts/pr-review.md +0 -0
  60. {agent_cli-0.94.2 → agent_cli-0.95.0}/CLAUDE.md +0 -0
  61. {agent_cli-0.94.2 → agent_cli-0.95.0}/LICENSE +0 -0
  62. {agent_cli-0.94.2 → agent_cli-0.95.0}/LLAMA_SERVER_USAGE.md +0 -0
  63. {agent_cli-0.94.2 → agent_cli-0.95.0}/README.md +0 -0
  64. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/__init__.py +0 -0
  65. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/__main__.py +0 -0
  66. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_extras.json +0 -0
  67. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/.gitkeep +0 -0
  68. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/audio.txt +0 -0
  69. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/diarization.txt +0 -0
  70. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/faster-whisper.txt +0 -0
  71. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/kokoro.txt +0 -0
  72. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/llm.txt +0 -0
  73. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/memory.txt +0 -0
  74. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  75. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/piper.txt +0 -0
  76. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/rag.txt +0 -0
  77. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/server.txt +0 -0
  78. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/speed.txt +0 -0
  79. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/vad.txt +0 -0
  80. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/vectordb.txt +0 -0
  81. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  82. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/wyoming.txt +0 -0
  83. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_tools.py +0 -0
  84. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/__init__.py +0 -0
  85. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/_voice_agent_common.py +0 -0
  86. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/assistant.py +0 -0
  87. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/autocorrect.py +0 -0
  88. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/chat.py +0 -0
  89. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/diarize_live_session.py +0 -0
  90. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/memory/__init__.py +0 -0
  91. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/memory/add.py +0 -0
  92. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/memory/proxy.py +0 -0
  93. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/rag_proxy.py +0 -0
  94. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/speak.py +0 -0
  95. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/speakers.py +0 -0
  96. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/transcribe.py +0 -0
  97. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/transcribe_live.py +0 -0
  98. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/voice_edit.py +0 -0
  99. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/api.py +0 -0
  100. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/cli.py +0 -0
  101. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/config.py +0 -0
  102. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/config_cmd.py +0 -0
  103. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/constants.py +0 -0
  104. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/__init__.py +0 -0
  105. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/alignment.py +0 -0
  106. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/audio.py +0 -0
  107. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/audio_format.py +0 -0
  108. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/chroma.py +0 -0
  109. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/deps.py +0 -0
  110. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/diarization.py +0 -0
  111. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/openai_proxy.py +0 -0
  112. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/reranker.py +0 -0
  113. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/speaker_identity.py +0 -0
  114. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/sse.py +0 -0
  115. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/transcription_logger.py +0 -0
  116. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/utils.py +0 -0
  117. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/vad.py +0 -0
  118. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/watch.py +0 -0
  119. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/daemon/__init__.py +0 -0
  120. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/__init__.py +0 -0
  121. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/_branch_name.py +0 -0
  122. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/_config.py +0 -0
  123. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/_output.py +0 -0
  124. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/cleanup.py +0 -0
  125. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/cli.py +0 -0
  126. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/__init__.py +0 -0
  127. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/aider.py +0 -0
  128. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/base.py +0 -0
  129. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/claude.py +0 -0
  130. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/codex.py +0 -0
  131. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  132. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/copilot.py +0 -0
  133. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  134. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/gemini.py +0 -0
  135. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/opencode.py +0 -0
  136. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/registry.py +0 -0
  137. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/__init__.py +0 -0
  138. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/base.py +0 -0
  139. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/cursor.py +0 -0
  140. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/emacs.py +0 -0
  141. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/jetbrains.py +0 -0
  142. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/nano.py +0 -0
  143. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/neovim.py +0 -0
  144. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/registry.py +0 -0
  145. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/sublime.py +0 -0
  146. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/vim.py +0 -0
  147. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/vscode.py +0 -0
  148. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/zed.py +0 -0
  149. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/hooks.py +0 -0
  150. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/launch.py +0 -0
  151. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/project.py +0 -0
  152. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/registry.py +0 -0
  153. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/skill/SKILL.md +0 -0
  154. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/skill/examples.md +0 -0
  155. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/__init__.py +0 -0
  156. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  157. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/base.py +0 -0
  158. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/gnome.py +0 -0
  159. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/iterm2.py +0 -0
  160. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/kitty.py +0 -0
  161. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/registry.py +0 -0
  162. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/tmux.py +0 -0
  163. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/warp.py +0 -0
  164. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/zellij.py +0 -0
  165. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/worktree.py +0 -0
  166. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/docs_gen.py +0 -0
  167. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/example-config.toml +0 -0
  168. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/install/__init__.py +0 -0
  169. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/install/common.py +0 -0
  170. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/install/extras.py +0 -0
  171. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/install/hotkeys.py +0 -0
  172. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/install/services.py +0 -0
  173. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/install/systemd.py +0 -0
  174. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/__init__.py +0 -0
  175. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_files.py +0 -0
  176. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_filters.py +0 -0
  177. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_git.py +0 -0
  178. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_indexer.py +0 -0
  179. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_ingest.py +0 -0
  180. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_persistence.py +0 -0
  181. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_prompt.py +0 -0
  182. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_retrieval.py +0 -0
  183. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_store.py +0 -0
  184. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_streaming.py +0 -0
  185. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_tasks.py +0 -0
  186. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/api.py +0 -0
  187. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/client.py +0 -0
  188. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/engine.py +0 -0
  189. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/entities.py +0 -0
  190. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/models.py +0 -0
  191. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/opts.py +0 -0
  192. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/py.typed +0 -0
  193. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/__init__.py +0 -0
  194. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/_indexer.py +0 -0
  195. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/_indexing.py +0 -0
  196. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/_prompt.py +0 -0
  197. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/_retriever.py +0 -0
  198. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/_store.py +0 -0
  199. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/_utils.py +0 -0
  200. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/api.py +0 -0
  201. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/client.py +0 -0
  202. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/engine.py +0 -0
  203. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/models.py +0 -0
  204. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  205. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/__init__.py +0 -0
  206. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  207. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  208. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  209. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  210. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  211. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  212. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  213. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  214. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  215. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  216. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  217. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  218. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  219. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  220. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/run-openwakeword.sh +0 -0
  221. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  222. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/setup-linux.sh +0 -0
  223. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  224. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/setup-macos.sh +0 -0
  225. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/setup-windows.ps1 +0 -0
  226. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  227. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/start-all-services.sh +0 -0
  228. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/__init__.py +0 -0
  229. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/cli.py +0 -0
  230. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/common.py +0 -0
  231. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/model_manager.py +0 -0
  232. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/model_registry.py +0 -0
  233. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/proxy/__init__.py +0 -0
  234. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/proxy/api.py +0 -0
  235. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/streaming.py +0 -0
  236. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/tts/__init__.py +0 -0
  237. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/tts/api.py +0 -0
  238. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/tts/backends/__init__.py +0 -0
  239. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/tts/backends/base.py +0 -0
  240. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/tts/backends/kokoro.py +0 -0
  241. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/tts/backends/piper.py +0 -0
  242. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/tts/model_manager.py +0 -0
  243. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/tts/model_registry.py +0 -0
  244. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/tts/wyoming_handler.py +0 -0
  245. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/__init__.py +0 -0
  246. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/api.py +0 -0
  247. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/backends/__init__.py +0 -0
  248. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/backends/base.py +0 -0
  249. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  250. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/backends/mlx.py +0 -0
  251. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/backends/transformers.py +0 -0
  252. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/languages.py +0 -0
  253. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/model_manager.py +0 -0
  254. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/model_registry.py +0 -0
  255. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  256. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/services/__init__.py +0 -0
  257. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/services/_wyoming_utils.py +0 -0
  258. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/services/asr.py +0 -0
  259. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/services/llm.py +0 -0
  260. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/services/tts.py +0 -0
  261. {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/services/wake_word.py +0 -0
  262. {agent_cli-0.94.2 → agent_cli-0.95.0}/docker/docker-compose.yml +0 -0
  263. {agent_cli-0.94.2 → agent_cli-0.95.0}/docker/memory-proxy.Dockerfile +0 -0
  264. {agent_cli-0.94.2 → agent_cli-0.95.0}/docker/rag-proxy.Dockerfile +0 -0
  265. {agent_cli-0.94.2 → agent_cli-0.95.0}/docker/transcribe-proxy.Dockerfile +0 -0
  266. {agent_cli-0.94.2 → agent_cli-0.95.0}/docker/tts.Dockerfile +0 -0
  267. {agent_cli-0.94.2 → agent_cli-0.95.0}/docker/whisper.Dockerfile +0 -0
  268. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/CNAME +0 -0
  269. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/architecture/index.md +0 -0
  270. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/architecture/memory.md +0 -0
  271. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/architecture/rag.md +0 -0
  272. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/assistant.md +0 -0
  273. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/autocorrect.md +0 -0
  274. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/chat.md +0 -0
  275. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/config.md +0 -0
  276. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/daemon.md +0 -0
  277. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/dev.md +0 -0
  278. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/diarize-live-session.md +0 -0
  279. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/index.md +0 -0
  280. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/install-extras.md +0 -0
  281. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/install-hotkeys.md +0 -0
  282. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/install-services.md +0 -0
  283. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/memory.md +0 -0
  284. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/rag-proxy.md +0 -0
  285. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/server/index.md +0 -0
  286. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/server/transcribe-proxy.md +0 -0
  287. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/server/tts.md +0 -0
  288. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/server/whisper.md +0 -0
  289. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/speak.md +0 -0
  290. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/speakers.md +0 -0
  291. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/start-services.md +0 -0
  292. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/transcribe-live.md +0 -0
  293. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/transcribe.md +0 -0
  294. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/voice-edit.md +0 -0
  295. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/configuration.md +0 -0
  296. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/getting-started.md +0 -0
  297. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/iOS_Shortcut_Guide.md +0 -0
  298. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/index.md +0 -0
  299. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/installation/docker.md +0 -0
  300. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/installation/index.md +0 -0
  301. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/installation/linux.md +0 -0
  302. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/installation/macos.md +0 -0
  303. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/installation/nixos.md +0 -0
  304. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/installation/windows.md +0 -0
  305. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/logo-clean.svg +0 -0
  306. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  307. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/run_markdown_code_runner.py +0 -0
  308. {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/system-integration.md +0 -0
  309. {agent_cli-0.94.2 → agent_cli-0.95.0}/example.agent-cli-config.toml +0 -0
  310. {agent_cli-0.94.2 → agent_cli-0.95.0}/justfile +0 -0
  311. {agent_cli-0.94.2 → agent_cli-0.95.0}/pyproject.toml +0 -0
  312. {agent_cli-0.94.2 → agent_cli-0.95.0}/reddit.md +0 -0
  313. {agent_cli-0.94.2 → agent_cli-0.95.0}/shell.nix +0 -0
  314. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/__init__.py +0 -0
  315. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/__init__.py +0 -0
  316. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_fix_my_text.py +0 -0
  317. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_interactive.py +0 -0
  318. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_interactive_extra.py +0 -0
  319. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_memory_add.py +0 -0
  320. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_speak.py +0 -0
  321. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_speak_e2e.py +0 -0
  322. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_speakers.py +0 -0
  323. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_transcribe.py +0 -0
  324. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_transcribe_agent.py +0 -0
  325. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_transcribe_e2e.py +0 -0
  326. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_transcribe_live.py +0 -0
  327. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_transcribe_recovery.py +0 -0
  328. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_tts_common.py +0 -0
  329. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_tts_common_extra.py +0 -0
  330. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_voice_agent_common.py +0 -0
  331. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_voice_edit.py +0 -0
  332. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_voice_edit_e2e.py +0 -0
  333. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_wake_word_assistant.py +0 -0
  334. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/conftest.py +0 -0
  335. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/core/__init__.py +0 -0
  336. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/core/test_audio.py +0 -0
  337. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/core/test_audio_format.py +0 -0
  338. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/core/test_chroma.py +0 -0
  339. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/core/test_sse.py +0 -0
  340. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/core/test_vad.py +0 -0
  341. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/core/test_watch.py +0 -0
  342. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/__init__.py +0 -0
  343. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_cleanup.py +0 -0
  344. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_cli.py +0 -0
  345. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_coding_agents.py +0 -0
  346. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_editors.py +0 -0
  347. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_hooks.py +0 -0
  348. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_launch.py +0 -0
  349. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_project.py +0 -0
  350. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_terminals.py +0 -0
  351. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_verification.py +0 -0
  352. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_worktree.py +0 -0
  353. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/install/__init__.py +0 -0
  354. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/install/test_extras.py +0 -0
  355. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/__init__.py +0 -0
  356. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_api_health.py +0 -0
  357. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_api_integration_liveish.py +0 -0
  358. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_client.py +0 -0
  359. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_engine.py +0 -0
  360. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_files.py +0 -0
  361. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_filters.py +0 -0
  362. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_git_integration.py +0 -0
  363. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_indexer.py +0 -0
  364. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_memory_integration.py +0 -0
  365. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_proxy_passthrough.py +0 -0
  366. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_store.py +0 -0
  367. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_utils.py +0 -0
  368. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/mocks/__init__.py +0 -0
  369. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/mocks/audio.py +0 -0
  370. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/mocks/llm.py +0 -0
  371. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/mocks/wyoming.py +0 -0
  372. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/__init__.py +0 -0
  373. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_api.py +0 -0
  374. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_engine.py +0 -0
  375. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_history.py +0 -0
  376. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_indexer.py +0 -0
  377. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_indexing.py +0 -0
  378. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_rag_client.py +0 -0
  379. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_rag_integration_liveish.py +0 -0
  380. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  381. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_retriever.py +0 -0
  382. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_store.py +0 -0
  383. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_utils.py +0 -0
  384. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_alignment.py +0 -0
  385. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_api.py +0 -0
  386. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_api_integration.py +0 -0
  387. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_asr.py +0 -0
  388. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_asr_recovery.py +0 -0
  389. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_audio_e2e.py +0 -0
  390. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_cli.py +0 -0
  391. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_config.py +0 -0
  392. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_config_cmd.py +0 -0
  393. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_diarization.py +0 -0
  394. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_diarize_live_session.py +0 -0
  395. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_docs_gen.py +0 -0
  396. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_env_vars.py +0 -0
  397. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_faster_whisper_backend.py +0 -0
  398. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_json_output.py +0 -0
  399. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_llm.py +0 -0
  400. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_llm_gemini.py +0 -0
  401. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_memory_tools.py +0 -0
  402. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_mlx_backend.py +0 -0
  403. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_requires_extras.py +0 -0
  404. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_server_streaming.py +0 -0
  405. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_server_tts.py +0 -0
  406. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_server_whisper.py +0 -0
  407. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_services.py +0 -0
  408. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_speaker_identity.py +0 -0
  409. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_tools.py +0 -0
  410. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_transformers_backend.py +0 -0
  411. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_tts.py +0 -0
  412. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_utils.py +0 -0
  413. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_wake_word.py +0 -0
  414. {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_wyoming_utils.py +0 -0
  415. {agent_cli-0.94.2 → agent_cli-0.95.0}/uv.lock +0 -0
  416. {agent_cli-0.94.2 → agent_cli-0.95.0}/zensical.toml +0 -0
@@ -0,0 +1,61 @@
1
+ name: Upload Python Package
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ jobs:
8
+ deploy:
9
+ runs-on: ubuntu-latest
10
+ environment:
11
+ name: pypi
12
+ url: https://pypi.org/p/${{ github.repository }}
13
+ permissions:
14
+ id-token: write
15
+ steps:
16
+ - uses: actions/checkout@v6
17
+ - name: Install uv
18
+ uses: astral-sh/setup-uv@v8.1.0
19
+ - name: Build
20
+ run: uv build
21
+ - name: Publish package distributions to PyPI
22
+ uses: pypa/gh-action-pypi-publish@release/v1
23
+
24
+ build_macos_app:
25
+ runs-on: macos-latest
26
+ permissions:
27
+ contents: write
28
+ steps:
29
+ - uses: actions/checkout@v6
30
+ - name: Install uv
31
+ uses: astral-sh/setup-uv@v8.1.0
32
+ - name: Import Developer ID certificate
33
+ uses: apple-actions/import-codesign-certs@v7
34
+ with:
35
+ p12-file-base64: ${{ secrets.MACOS_CODESIGN_CERTIFICATE_BASE64 }}
36
+ p12-password: ${{ secrets.MACOS_CODESIGN_CERTIFICATE_PASSWORD }}
37
+ keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }}
38
+ - name: Resolve Developer ID identity
39
+ id: codesign
40
+ run: |
41
+ IDENTITY=$(
42
+ security find-identity -v -p codesigning |
43
+ awk -F '"' '/Developer ID Application/ { print $2; exit }'
44
+ )
45
+ if [[ -z "$IDENTITY" ]]; then
46
+ echo "Developer ID Application signing identity not found." >&2
47
+ exit 1
48
+ fi
49
+ echo "identity=$IDENTITY" >> "$GITHUB_OUTPUT"
50
+ - name: Build notarized macOS DMG
51
+ env:
52
+ CODESIGN_IDENTITY: ${{ steps.codesign.outputs.identity }}
53
+ APPLE_ID: ${{ secrets.APPLE_ID }}
54
+ APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
55
+ APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
56
+ run: NOTARIZE=1 macos/build-macos-app.sh --dmg
57
+ - name: Upload macOS app to GitHub Release
58
+ env:
59
+ GH_TOKEN: ${{ github.token }}
60
+ TAG_NAME: ${{ github.event.release.tag_name }}
61
+ run: gh release upload "$TAG_NAME" dist/macos/AgentCLI.dmg --clobber
@@ -7,6 +7,7 @@ __pycache__/
7
7
  *$py.class
8
8
  *.so
9
9
  .Python
10
+ .build/
10
11
  build/
11
12
  develop-eggs/
12
13
  dist/
@@ -11,7 +11,7 @@ repos:
11
11
  - id: end-of-file-fixer
12
12
  - id: mixed-line-ending
13
13
  - repo: https://github.com/astral-sh/ruff-pre-commit
14
- rev: "v0.15.13"
14
+ rev: "v0.15.14"
15
15
  hooks:
16
16
  - id: ruff
17
17
  args: ["--fix"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-cli
3
- Version: 0.94.2
3
+ Version: 0.95.0
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>
@@ -2,24 +2,49 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import json
5
6
  import os
6
7
  import signal
7
8
  import sys
9
+ import tempfile
8
10
  import time
9
11
  from contextlib import contextmanager
10
12
  from pathlib import Path
11
- from typing import TYPE_CHECKING
13
+ from typing import TYPE_CHECKING, NamedTuple
12
14
 
13
15
  if TYPE_CHECKING:
14
16
  from collections.abc import Generator
15
17
 
16
- # Default location for PID files
17
- PID_DIR = Path.home() / ".cache" / "agent-cli"
18
-
19
18
  # Store the original process title before any modifications
20
19
  _original_proctitle: str | None = None
21
20
 
22
21
 
22
+ class _PidInfo(NamedTuple):
23
+ pid: int
24
+ uses_lock: bool
25
+
26
+
27
+ def _default_pid_dir() -> Path:
28
+ """Return local runtime dir for process control files."""
29
+ if runtime_dir := os.environ.get("AGENTCLI_RUNTIME_DIR"):
30
+ return Path(runtime_dir)
31
+
32
+ if xdg_runtime_dir := os.environ.get("XDG_RUNTIME_DIR"):
33
+ return Path(xdg_runtime_dir) / "agent-cli"
34
+
35
+ if os.name == "posix":
36
+ return Path(tempfile.gettempdir()) / f"agent-cli-{os.getuid()}"
37
+
38
+ if local_app_data := os.environ.get("LOCALAPPDATA"):
39
+ return Path(local_app_data) / "agent-cli" / "runtime"
40
+
41
+ return Path(tempfile.gettempdir()) / "agent-cli-runtime"
42
+
43
+
44
+ # Default location for PID files and process locks.
45
+ PID_DIR = _default_pid_dir()
46
+
47
+
23
48
  def set_process_title(process_name: str) -> None:
24
49
  """Set the process title and thread name for identification in ps/htop/btop.
25
50
 
@@ -57,6 +82,12 @@ def _get_pid_file(process_name: str) -> Path:
57
82
  return PID_DIR / f"{process_name}.pid"
58
83
 
59
84
 
85
+ def _get_lock_file(process_name: str) -> Path:
86
+ """Get the path to the process lock file for a given process name."""
87
+ PID_DIR.mkdir(parents=True, exist_ok=True)
88
+ return PID_DIR / f"{process_name}.lock"
89
+
90
+
60
91
  def _get_stop_file(process_name: str) -> Path:
61
92
  """Get the path to the stop file for a given process name."""
62
93
  PID_DIR.mkdir(parents=True, exist_ok=True)
@@ -89,28 +120,137 @@ def _is_pid_running(pid: int) -> bool:
89
120
  return False
90
121
 
91
122
 
92
- def _get_running_pid(process_name: str) -> int | None:
93
- """Get PID if process is running, None otherwise. Cleans up stale files."""
94
- pid_file = _get_pid_file(process_name)
123
+ def _supports_process_locks() -> bool:
124
+ """Return whether this platform supports POSIX advisory locks."""
125
+ return sys.platform != "win32"
95
126
 
96
- if not pid_file.exists():
127
+
128
+ def _acquire_process_lock(process_name: str) -> int | None:
129
+ """Try to acquire the per-process lock. Return fd when held."""
130
+ if not _supports_process_locks():
131
+ return None
132
+
133
+ import fcntl # noqa: PLC0415
134
+
135
+ lock_file = _get_lock_file(process_name)
136
+ fd = os.open(lock_file, os.O_CREAT | os.O_RDWR, 0o600)
137
+ try:
138
+ fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
139
+ except BlockingIOError:
140
+ os.close(fd)
141
+ return None
142
+ except OSError:
143
+ os.close(fd)
144
+ raise
145
+ return fd
146
+
147
+
148
+ def _release_process_lock(lock_fd: int | None) -> None:
149
+ """Release a lock fd returned by _acquire_process_lock."""
150
+ if lock_fd is None:
151
+ return
152
+
153
+ import fcntl # noqa: PLC0415
154
+
155
+ fcntl.flock(lock_fd, fcntl.LOCK_UN)
156
+ os.close(lock_fd)
157
+
158
+
159
+ def _is_process_lock_held(process_name: str) -> bool:
160
+ """Return True when another process still owns the lock."""
161
+ if not _supports_process_locks():
162
+ return True
163
+
164
+ lock_fd = _acquire_process_lock(process_name)
165
+ if lock_fd is None:
166
+ return True
167
+
168
+ _release_process_lock(lock_fd)
169
+ return False
170
+
171
+
172
+ def _legacy_pid_info(raw: str) -> _PidInfo | None:
173
+ """Parse a legacy numeric PID file."""
174
+ try:
175
+ return _PidInfo(pid=int(raw), uses_lock=False)
176
+ except ValueError:
177
+ return None
178
+
179
+
180
+ def _pid_info_from_payload(process_name: str, payload: object) -> _PidInfo | None:
181
+ """Parse JSON PID metadata."""
182
+ if isinstance(payload, int):
183
+ return _PidInfo(pid=payload, uses_lock=False)
184
+
185
+ if (
186
+ not isinstance(payload, dict)
187
+ or payload.get("version") != 1
188
+ or payload.get("process_name") != process_name
189
+ ):
190
+ return None
191
+
192
+ try:
193
+ pid = int(payload["pid"])
194
+ except (KeyError, TypeError, ValueError):
195
+ return None
196
+
197
+ return _PidInfo(pid=pid, uses_lock=True)
198
+
199
+
200
+ def _read_pid_info(process_name: str) -> _PidInfo | None:
201
+ """Read either current JSON PID metadata or a legacy numeric PID file."""
202
+ pid_file = _get_pid_file(process_name)
203
+ try:
204
+ raw = pid_file.read_text().strip()
205
+ except FileNotFoundError:
97
206
  return None
98
207
 
99
208
  try:
100
- with pid_file.open() as f:
101
- pid = int(f.read().strip())
209
+ payload = json.loads(raw)
210
+ except json.JSONDecodeError:
211
+ return _legacy_pid_info(raw)
102
212
 
103
- # Check if process is actually running
104
- if _is_pid_running(pid):
105
- return pid
213
+ return _pid_info_from_payload(process_name, payload)
106
214
 
107
- except (FileNotFoundError, ValueError):
108
- pass
109
215
 
110
- # Clean up stale/invalid PID file
216
+ def _write_pid_info(process_name: str) -> None:
217
+ """Write PID metadata for the current process."""
218
+ pid_file = _get_pid_file(process_name)
219
+ payload = {
220
+ "version": 1,
221
+ "process_name": process_name,
222
+ "pid": os.getpid(),
223
+ "created_at": time.time(),
224
+ }
225
+ pid_file.write_text(json.dumps(payload, sort_keys=True))
226
+
227
+
228
+ def _cleanup_process_files(process_name: str) -> None:
229
+ """Remove stale process control files."""
230
+ pid_file = _get_pid_file(process_name)
111
231
  if pid_file.exists():
112
232
  pid_file.unlink()
113
233
  clear_stop_file(process_name)
234
+
235
+
236
+ def _get_running_pid(process_name: str) -> int | None:
237
+ """Get PID if process is running, None otherwise. Cleans up stale files."""
238
+ if not _get_pid_file(process_name).exists():
239
+ return None
240
+
241
+ pid_info = _read_pid_info(process_name)
242
+ if pid_info is None:
243
+ _cleanup_process_files(process_name)
244
+ return None
245
+
246
+ if pid_info.uses_lock and _supports_process_locks() and not _is_process_lock_held(process_name):
247
+ _cleanup_process_files(process_name)
248
+ return None
249
+
250
+ if _is_pid_running(pid_info.pid):
251
+ return pid_info.pid
252
+
253
+ _cleanup_process_files(process_name)
114
254
  return None
115
255
 
116
256
 
@@ -173,9 +313,7 @@ def kill_process(process_name: str) -> bool:
173
313
  # Keep PID file if process is still alive so subsequent --status/--toggle
174
314
  # calls continue targeting the same process.
175
315
  if process_stopped:
176
- clear_stop_file(process_name)
177
- if pid_file.exists():
178
- pid_file.unlink()
316
+ _cleanup_process_files(process_name)
179
317
  elif not should_force_kill:
180
318
  stop_file.touch()
181
319
 
@@ -189,21 +327,33 @@ def pid_file_context(process_name: str) -> Generator[Path, None, None]:
189
327
  Creates PID file on entry, cleans up on exit.
190
328
  Exits with error if process already running.
191
329
  """
192
- if is_process_running(process_name):
330
+ lock_fd = _acquire_process_lock(process_name)
331
+ if _supports_process_locks() and lock_fd is None:
193
332
  existing_pid = _get_running_pid(process_name)
194
333
  print(f"Process {process_name} is already running (PID: {existing_pid})")
195
334
  sys.exit(1)
196
335
 
336
+ if not _supports_process_locks() and is_process_running(process_name):
337
+ existing_pid = _get_running_pid(process_name)
338
+ print(f"Process {process_name} is already running (PID: {existing_pid})")
339
+ sys.exit(1)
340
+
341
+ if _supports_process_locks():
342
+ pid_info = _read_pid_info(process_name)
343
+ if pid_info and not pid_info.uses_lock and _is_pid_running(pid_info.pid):
344
+ _release_process_lock(lock_fd)
345
+ print(f"Process {process_name} is already running (PID: {pid_info.pid})")
346
+ sys.exit(1)
347
+ _cleanup_process_files(process_name)
348
+
197
349
  # Clear stale stop markers from previous runs.
198
350
  clear_stop_file(process_name)
199
351
 
200
352
  pid_file = _get_pid_file(process_name)
201
- with pid_file.open("w") as f:
202
- f.write(str(os.getpid()))
353
+ _write_pid_info(process_name)
203
354
 
204
355
  try:
205
356
  yield pid_file
206
357
  finally:
207
- if pid_file.exists():
208
- pid_file.unlink()
209
- clear_stop_file(process_name)
358
+ _cleanup_process_files(process_name)
359
+ _release_process_lock(lock_fd)
@@ -146,9 +146,11 @@ def status_cmd(
146
146
  console.print()
147
147
  system = platform.system()
148
148
  if system == "Darwin":
149
- console.print("[dim]Full logs: ~/Library/Logs/agent-cli-<service>/[/dim]")
149
+ log_service = service or "<service>"
150
+ console.print(f"[dim]Full logs: ~/Library/Logs/agent-cli-{log_service}/[/dim]")
150
151
  else:
151
- console.print("[dim]Full logs: journalctl --user -u agent-cli-<service> -f[/dim]")
152
+ log_service = service or "<service>"
153
+ console.print(f"[dim]Full logs: journalctl --user -u agent-cli-{log_service} -f[/dim]")
152
154
 
153
155
 
154
156
  def _confirm_action(message: str) -> bool:
@@ -41,6 +41,22 @@ _MACOS_DAEMON_PATH = (
41
41
  "/sbin"
42
42
  )
43
43
 
44
+ _PRESERVED_APP_ENV_KEYS = (
45
+ "AGENTCLI_APP_SUPPORT_DIR",
46
+ "AGENTCLI_BUNDLED_UV",
47
+ "AGENTCLI_PACKAGE_SOURCE",
48
+ "AGENTCLI_RUNTIME_DIR",
49
+ "AGENT_CLI_CONFIG_HOME",
50
+ "UV_CACHE_DIR",
51
+ "UV_PYTHON_INSTALL_DIR",
52
+ "UV_PYTHON_BIN_DIR",
53
+ "UV_TOOL_DIR",
54
+ "UV_TOOL_BIN_DIR",
55
+ "UV_NO_PROGRESS",
56
+ "NO_COLOR",
57
+ "TERM",
58
+ )
59
+
44
60
 
45
61
  def _get_label(service_name: str) -> str:
46
62
  """Get launchd label for a service."""
@@ -95,13 +111,19 @@ def _generate_plist(
95
111
  log_dir: Path,
96
112
  ) -> dict:
97
113
  """Generate plist dictionary for a launchd service."""
114
+ environment = {"PATH": _MACOS_DAEMON_PATH}
115
+ for key in _PRESERVED_APP_ENV_KEYS:
116
+ value = os.environ.get(key)
117
+ if value:
118
+ environment[key] = value
119
+
98
120
  return {
99
121
  "Label": _get_label(service.name),
100
122
  "ProgramArguments": build_service_command(service, uv_path, use_macos_extra=True),
101
123
  "RunAtLoad": True,
102
124
  "KeepAlive": True,
103
125
  "WorkingDirectory": str(home_dir),
104
- "EnvironmentVariables": {"PATH": _MACOS_DAEMON_PATH},
126
+ "EnvironmentVariables": environment,
105
127
  "StandardOutPath": str(log_dir / "stdout.log"),
106
128
  "StandardErrorPath": str(log_dir / "stderr.log"),
107
129
  }
@@ -126,6 +126,7 @@ def build_service_command(
126
126
  ) -> list[str]:
127
127
  """Build the command args for running a service via uv tool run."""
128
128
  extra = (service.macos_extra or service.extra) if use_macos_extra else service.extra
129
+ package_source = os.environ.get("AGENTCLI_PACKAGE_SOURCE", "agent-cli")
129
130
 
130
131
  args = [str(uv_path), "tool", "run"]
131
132
 
@@ -140,7 +141,7 @@ def build_service_command(
140
141
  args.extend(
141
142
  [
142
143
  "--from",
143
- f"agent-cli[{extra}]",
144
+ f"{package_source}[{extra}]",
144
145
  "agent-cli",
145
146
  *cmd_path,
146
147
  *service.command_args,
@@ -151,6 +152,12 @@ def build_service_command(
151
152
 
152
153
  def find_uv(extra_paths: list[Path] | None = None) -> Path | None:
153
154
  """Find uv executable, preferring system paths over virtualenv."""
155
+ bundled_uv = os.environ.get("AGENTCLI_BUNDLED_UV")
156
+ if bundled_uv:
157
+ bundled_uv_path = Path(bundled_uv).expanduser()
158
+ if bundled_uv_path.is_file() and os.access(bundled_uv_path, os.X_OK):
159
+ return bundled_uv_path
160
+
154
161
  paths = [
155
162
  Path.home() / ".local" / "bin" / "uv",
156
163
  Path.home() / ".cargo" / "bin" / "uv",
@@ -0,0 +1,51 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg
3
+ version="1.1"
4
+ width="790"
5
+ height="850"
6
+ viewBox="560 140 790 850"
7
+ xmlns="http://www.w3.org/2000/svg">
8
+ <title>AgentCLI avatar logo</title>
9
+ <path
10
+ fill="#000000"
11
+ opacity="1"
12
+ stroke="none"
13
+ d="m 1209.8213,729.78601 c -7.9569,6.79279 -15.6414,13.35761 -24.1472,20.62415 2.4815,0.82159 4.0852,1.40344 5.7182,1.88562 27.5103,8.12365 53.4462,19.46124 76.1413,37.37982 22.0362,17.39838 37.714,39.23993 45.8825,66.23254 2.2857,7.55261 1.4493,8.7218 -5.6893,11.61774 -30.7659,12.48059 -63.024,19.94079 -94.9846,28.41571 -46.2448,12.26251 -92.4716,24.59228 -138.709,36.88257 -47.6999,12.67908 -95.39959,25.35937 -143.11419,37.98364 -3.03717,0.80353 -6.18586,1.2497 -9.31031,1.64197 -3.49304,0.43854 -4.9248,-1.21564 -5.40039,-4.7956 -1.48095,-11.14703 3.90241,-19.78723 10.24933,-27.76794 20.61048,-25.91571 41.63898,-51.49847 62.33527,-77.3465 26.10899,-32.60809 52.35859,-65.11145 77.95039,-98.12286 16.1009,-20.76886 31.6269,-42.03064 46.4675,-63.71686 17.0558,-24.92303 30.0562,-52.13397 41.9342,-79.8595 3.9229,-9.15649 7.5886,-18.43768 11.8917,-27.41272 4.7139,-9.83203 11.151,-11.95098 20.148,-5.74469 13.6746,9.43311 26.9023,19.54426 39.9952,29.7826 16.5074,12.90838 32.8511,26.03937 48.9367,39.46814 7.3025,6.09649 7.2936,9.74573 0.068,16.27643 -13.8256,12.49688 -28.0118,24.59881 -42.1773,36.71392 -7.8365,6.70221 -15.9341,13.09925 -24.1865,19.86182 z"
14
+ id="path3" />
15
+ <path
16
+ fill="#000000"
17
+ opacity="1"
18
+ stroke="none"
19
+ d="m 919.20166,914.198 c -8.34613,9.74634 -16.54401,19.15252 -24.56738,28.7052 -3.1305,3.72729 -6.66651,4.19189 -11.1416,2.99115 -31.12769,-8.35242 -62.30451,-16.52124 -93.44202,-24.83698 -54.37109,-14.52063 -108.74457,-29.03308 -163.07025,-43.72229 -10.90027,-2.94732 -21.62348,-6.57 -32.36756,-10.06799 -6.63604,-2.16052 -7.72589,-4.2674 -5.47186,-11.24902 4.96222,-15.3703 12.83722,-29.18225 22.99591,-41.72339 21.67182,-26.75434 50.24958,-43.17896 82.03174,-54.73816 7.96643,-2.8974 16.13458,-5.23908 24.20068,-7.86469 1.20649,-0.39264 2.36176,-0.94238 3.89765,-1.56384 -8.9422,-7.60107 -17.4596,-14.91577 -26.05805,-22.13379 -16.05511,-13.47766 -32.18499,-26.86639 -48.22418,-40.36291 -5.21435,-4.38788 -10.51117,-8.7323 -15.28278,-13.57685 -5.00396,-5.08038 -5.14495,-9.46136 0.15265,-14.20929 9.76905,-8.75549 19.85767,-17.19793 30.24573,-25.2099 20.02075,-15.44146 40.26221,-30.60095 60.57636,-45.65582 9.14526,-6.77759 14.12945,-5.98553 19.99621,3.84906 3.79395,6.35986 6.33795,13.5354 8.91535,20.53931 16.68872,45.35052 39.8966,87.14245 69.03344,125.59143 35.77009,47.20227 71.89661,94.13476 107.96442,141.11065 6.99518,9.11078 7.1795,11.85956 -0.0228,20.87726 -3.42492,4.28821 -6.76507,8.64411 -10.36169,13.25086 z"
20
+ id="path4" />
21
+ <path
22
+ fill="#000000"
23
+ opacity="1"
24
+ stroke="none"
25
+ d="m 767.73248,321.60425 c 12.22571,-38.65079 25.76428,-76.81659 43.87549,-113.15615 4.40894,-8.84637 10.00739,-17.25793 16.07678,-25.07946 7.92694,-10.21523 20.30701,-13.11473 32.78595,-7.45446 22.24073,10.08811 44.2439,20.72582 66.07392,31.67688 6.16131,3.09084 11.12243,2.94316 17.26513,0.23487 25.19458,-11.10825 50.32831,-22.45487 76.05375,-32.21324 11.5618,-4.38572 24.3671,-6.31911 36.7803,-7.41323 13.678,-1.20563 24.5903,5.39716 32.5616,16.71669 10.3904,14.75437 16.1661,31.58501 21.9972,48.38257 10.1316,29.18511 20.127,58.41744 30.0826,88.44579 0.5645,5.70669 -1.6925,8.66787 -5.7422,11.3908 -11.8971,7.99949 -24.9334,13.10071 -38.6563,16.84739 -33.4929,9.14441 -67.85,12.13235 -102.29912,13.76477 -21.05755,0.99786 -42.22357,0.93478 -63.29321,0.11816 -23.01959,-0.89218 -46.00232,-2.99112 -68.96747,-4.95709 -22.06115,-1.88855 -43.73883,-6.12631 -64.45574,-14.02503 -12.19141,-4.64816 -25.73176,-8.25018 -30.13868,-23.27926 z"
26
+ id="path5" />
27
+ <path
28
+ fill="#000000"
29
+ opacity="1"
30
+ stroke="none"
31
+ d="m 780.65991,591.28064 c -8.93969,-15.16431 -16.72259,-30.4505 -17.67706,-48.07752 -0.70624,-13.04443 1.43805,-25.83831 5.35516,-38.28729 1.83551,-5.83356 6.9112,-7.84854 12.18225,-7.87164 21.81403,-0.0957 43.63489,0.0438 65.44336,0.53665 12.11969,0.2739 24.23218,1.25513 36.3252,2.20691 13.40527,1.05502 26.5636,2.92807 39.41986,7.64346 6.53088,2.39536 14.24194,1.77881 21.43842,2.10099 8.76715,0.39251 17.55474,0.45828 26.33245,0.42224 3.53882,-0.0145 7.53003,0.26034 10.53217,-1.20313 11.93207,-5.81671 24.67548,-8.24005 37.61398,-8.80978 32.7459,-1.44199 65.518,-2.39148 98.2891,-3.11643 19.5583,-0.43261 21.89,2.60971 25.7073,21.76041 5.997,30.0871 -2.0799,56.40057 -20.2144,79.97858 -12.831,16.68255 -30.8633,24.56946 -51.4877,27.30462 -15.1449,2.00855 -29.8342,0.52857 -44.1062,-4.67456 -19.6779,-7.17413 -33.22988,-21.24896 -42.25514,-39.64483 -4.74561,-9.67267 -8.42908,-19.90833 -12.01215,-30.09381 -2.16852,-6.16437 -5.79596,-10.39124 -12.19409,-10.88709 -6.02869,-0.46735 -12.21552,-0.13769 -18.21436,0.69476 -3.93243,0.54572 -5.50775,4.15528 -6.65497,7.92743 -4.79638,15.77075 -9.63128,31.5492 -19.29608,45.26361 -12.99487,18.43982 -30.43359,29.05353 -53.08533,31.4917 -20.75683,2.23407 -39.99859,-1.72113 -57.96875,-12.1109 -9.53326,-5.51202 -17.07849,-13.20111 -23.47302,-22.55438 z"
32
+ id="path6" />
33
+ <path
34
+ fill="#000000"
35
+ opacity="1"
36
+ stroke="none"
37
+ d="m 1159.632,371.56082 c 12.5134,3.14069 25.1529,5.85529 37.5131,9.51379 23.2758,6.88944 46.2019,14.83405 67.7437,26.22648 4.0902,2.16308 8.0398,4.76977 11.6025,7.71753 8.7958,7.2774 8.166,16.75509 -1.8728,22.27093 -7.3927,4.06195 -15.2646,7.42978 -23.2291,10.23914 -21.7618,7.67627 -44.3198,12.1369 -67.1284,15.30517 -17.561,2.43933 -35.1225,4.98065 -52.7559,6.76279 -15.7038,1.58716 -31.4925,2.6395 -47.2688,3.147 -39.765,1.27924 -79.5401,2.66821 -119.31906,2.96442 -33.63099,0.25049 -67.27674,-0.81052 -100.90845,-1.60629 -16.63135,-0.39356 -33.26984,-1.16748 -49.86127,-2.37241 -16.88403,-1.2262 -33.7948,-2.61972 -50.54907,-4.97131 -24.90418,-3.49546 -49.86377,-7.03119 -74.4491,-12.21338 -16.93774,-3.57022 -33.25689,-10.03961 -49.90124,-15.05127 -9.87769,-2.97418 -12.04297,-13.11038 -3.88971,-20.81195 5.95215,-5.62244 13.18188,-10.17703 20.45257,-14.0665 23.44312,-12.54092 49.02954,-19.36401 74.3703,-26.75723 6.52088,-1.9025 13.1167,-3.54807 20.19037,-4.91825 0.89575,11.49323 6.89569,18.84281 16.09723,24.26529 15.76062,9.28769 32.68183,15.9429 50.46521,19.48853 20.0882,4.00512 40.44812,6.97424 60.8241,9.11712 20.76452,2.18369 41.677,3.26627 62.55371,3.9726 14.59778,0.4939 29.25604,-0.18872 43.86584,-0.83258 15.90307,-0.70081 31.78017,-1.98303 47.67067,-2.9773 21.5552,-1.34872 42.7762,-4.8475 63.6947,-10.12576 17.1178,-4.31921 33.8824,-9.5249 48.8558,-19.40967 8.0796,-5.3338 14.2476,-11.44665 13.6571,-22.03387 -0.051,-0.91553 1.0241,-1.89386 1.576,-2.84302 z"
38
+ id="path8" />
39
+ <path
40
+ fill="#000000"
41
+ opacity="1"
42
+ stroke="none"
43
+ d="m 1159.4102,371.29181 c -0.3301,1.21817 -1.4052,2.1965 -1.3542,3.11203 0.5905,10.58722 -5.5775,16.70007 -13.6571,22.03387 -14.9734,9.88477 -31.738,15.09046 -48.8558,19.40967 -20.9185,5.27826 -42.1395,8.77704 -63.6947,10.12576 -15.8905,0.99427 -31.7676,2.27649 -47.67067,2.9773 -14.6098,0.64386 -29.26806,1.32648 -43.86584,0.83258 -20.87671,-0.70633 -41.78919,-1.78891 -62.55371,-3.9726 -20.37598,-2.14288 -40.7359,-5.112 -60.8241,-9.11712 -17.78338,-3.54563 -34.70459,-10.20084 -50.46521,-19.48853 -9.20154,-5.42248 -15.20148,-12.77206 -15.70459,-24.32397 5.31256,-16.82395 10.74469,-33.1958 16.58295,-49.95899 0.56903,-0.66574 0.53674,-0.91558 0.3092,-1.14087 0,0 0.007,-0.10058 0.0417,-0.13864 4.44128,14.99103 17.98163,18.59305 30.17304,23.24121 20.71691,7.89872 42.39459,12.13648 64.45574,14.02503 22.96515,1.96597 45.94788,4.06491 68.96747,4.95709 21.06964,0.81662 42.23566,0.8797 63.29321,-0.11816 34.44911,-1.63242 68.80621,-4.62036 102.29911,-13.76477 13.7229,-3.74668 26.7592,-8.8479 38.6563,-16.84739 4.0497,-2.72293 6.3067,-5.68411 5.7093,-11.01348 3.7533,9.88632 7.4177,20.22006 11.1411,30.53247 2.217,6.14016 4.5268,12.24679 7.0168,18.63751 z"
44
+ id="path13" />
45
+ <path
46
+ fill="#000000"
47
+ opacity="1"
48
+ stroke="none"
49
+ d="m 767.49426,321.87805 c 0.38971,0.12818 0.422,0.37802 0.0761,0.72339 -0.37011,-0.14789 -0.38855,-0.38028 -0.0761,-0.72339 z"
50
+ id="path17" />
51
+ </svg>
@@ -0,0 +1,14 @@
1
+ {
2
+ "pins" : [
3
+ {
4
+ "identity" : "keyboardshortcuts",
5
+ "kind" : "remoteSourceControl",
6
+ "location" : "https://github.com/sindresorhus/KeyboardShortcuts",
7
+ "state" : {
8
+ "revision" : "70caa8dea43e2d273cd5ab78885d7eff01df550c",
9
+ "version" : "1.10.0"
10
+ }
11
+ }
12
+ ],
13
+ "version" : 2
14
+ }
@@ -0,0 +1,25 @@
1
+ // swift-tools-version: 5.9
2
+
3
+ import PackageDescription
4
+
5
+ let package = Package(
6
+ name: "AgentCLI",
7
+ platforms: [
8
+ .macOS(.v13),
9
+ ],
10
+ products: [
11
+ .executable(name: "AgentCLI", targets: ["AgentCLI"]),
12
+ ],
13
+ dependencies: [
14
+ .package(url: "https://github.com/sindresorhus/KeyboardShortcuts", exact: "1.10.0"),
15
+ ],
16
+ targets: [
17
+ .executableTarget(
18
+ name: "AgentCLI",
19
+ dependencies: [
20
+ .product(name: "KeyboardShortcuts", package: "KeyboardShortcuts"),
21
+ ],
22
+ path: "Sources/AgentCLI"
23
+ ),
24
+ ]
25
+ )
@@ -0,0 +1,97 @@
1
+ # Agent CLI macOS app
2
+
3
+ This directory contains a native SwiftUI menu bar wrapper for `agent-cli`.
4
+ The app does not reimplement any agent behavior. It bundles `uv`, installs a
5
+ private `agent-cli[audio,llm]` tool into the user's Application Support
6
+ directory on first use, and shells out to that private executable.
7
+
8
+ Transcription is the default zero-config path. The first transcription action
9
+ installs and starts the local Whisper launchd daemon with
10
+ `agent-cli daemon install whisper -y`; the model is downloaded lazily by the
11
+ server on first transcription request. No existing `agent-cli` config file is
12
+ required.
13
+
14
+ The packaged app registers native macOS global hotkeys itself:
15
+
16
+ - `Fn+Space` toggles transcription
17
+ - `Fn` records while held and inserts the transcript
18
+ - `Cmd+Shift+A` autocorrects clipboard text
19
+ - `Cmd+Shift+V` starts voice edit
20
+
21
+ Choose **Keyboard Shortcuts...** from the menu bar app to change these
22
+ shortcuts. The settings UI uses the `KeyboardShortcuts` Swift package for
23
+ shortcut parsing, `UserDefaults` storage, and global key-up handlers.
24
+
25
+ ## Build
26
+
27
+ From the repository root:
28
+
29
+ ```bash
30
+ ./macos/build-macos-app.sh
31
+ ```
32
+
33
+ The app bundle is written to `dist/macos/AgentCLI.app`.
34
+
35
+ ## Install locally
36
+
37
+ ```bash
38
+ ./macos/build-macos-app.sh --install
39
+ ```
40
+
41
+ This builds the app, copies it to `/Applications/AgentCLI.app`, and opens it.
42
+
43
+ ## Build a DMG
44
+
45
+ ```bash
46
+ ./macos/build-macos-app.sh --dmg
47
+ ```
48
+
49
+ The DMG is written to `dist/macos/AgentCLI.dmg`.
50
+
51
+ ## End-to-end packaging check
52
+
53
+ ```bash
54
+ ./macos/test-macos-app-e2e.sh
55
+ ```
56
+
57
+ The E2E test builds the app and DMG, verifies code signing and the image, then
58
+ uses a fake bundled `uv` to prove the app bootstraps its private CLI, installs
59
+ the Whisper daemon, and runs the default transcription command without network
60
+ downloads.
61
+
62
+ ## Signing
63
+
64
+ By default the script ad-hoc signs the local app bundle. For public
65
+ distribution, pass a Developer ID identity and then notarize the resulting app
66
+ or DMG:
67
+
68
+ ```bash
69
+ CODESIGN_IDENTITY="Developer ID Application: Your Name (TEAMID)" ./macos/build-macos-app.sh --dmg
70
+ ```
71
+
72
+ To notarize during the build, set `NOTARIZE=1` and provide Apple notary
73
+ credentials:
74
+
75
+ ```bash
76
+ CODESIGN_IDENTITY="Developer ID Application: Your Name (TEAMID)" \
77
+ NOTARIZE=1 \
78
+ APPLE_ID="you@example.com" \
79
+ APPLE_APP_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx" \
80
+ APPLE_TEAM_ID="TEAMID" \
81
+ ./macos/build-macos-app.sh --dmg
82
+ ```
83
+
84
+ ## Release CI
85
+
86
+ Publishing a GitHub release runs `.github/workflows/release.yml`, which imports
87
+ the Developer ID certificate with `apple-actions/import-codesign-certs`, builds,
88
+ notarizes, staples, and uploads `dist/macos/AgentCLI.dmg` to the release. The
89
+ workflow expects these repository secrets:
90
+
91
+ - `MACOS_CODESIGN_CERTIFICATE_BASE64`: base64-encoded Developer ID Application
92
+ `.p12` certificate export
93
+ - `MACOS_CODESIGN_CERTIFICATE_PASSWORD`: password for that `.p12`
94
+ - `MACOS_KEYCHAIN_PASSWORD`: temporary CI keychain password
95
+ - `APPLE_ID`: Apple ID email for notarization
96
+ - `APPLE_APP_SPECIFIC_PASSWORD`: app-specific password for `notarytool`
97
+ - `APPLE_TEAM_ID`: Apple Developer Team ID
@@ -0,0 +1,32 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>CFBundleDevelopmentRegion</key>
6
+ <string>en</string>
7
+ <key>CFBundleDisplayName</key>
8
+ <string>Agent CLI</string>
9
+ <key>CFBundleExecutable</key>
10
+ <string>AgentCLI</string>
11
+ <key>CFBundleIdentifier</key>
12
+ <string>lt.nijho.agent-cli.menubar</string>
13
+ <key>CFBundleIconFile</key>
14
+ <string>AgentCLI</string>
15
+ <key>CFBundleInfoDictionaryVersion</key>
16
+ <string>6.0</string>
17
+ <key>CFBundleName</key>
18
+ <string>Agent CLI</string>
19
+ <key>CFBundlePackageType</key>
20
+ <string>APPL</string>
21
+ <key>CFBundleShortVersionString</key>
22
+ <string>0.1.0</string>
23
+ <key>CFBundleVersion</key>
24
+ <string>1</string>
25
+ <key>LSMinimumSystemVersion</key>
26
+ <string>13.0</string>
27
+ <key>LSUIElement</key>
28
+ <true/>
29
+ <key>NSMicrophoneUsageDescription</key>
30
+ <string>Agent CLI uses microphone access when you start transcription or voice editing from the menu bar.</string>
31
+ </dict>
32
+ </plist>