agent-cli 0.95.0__tar.gz → 0.95.2__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 (418) hide show
  1. {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/workflows/pytest.yml +3 -0
  2. {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/workflows/release.yml +4 -1
  3. {agent_cli-0.95.0 → agent_cli-0.95.2}/PKG-INFO +8 -4
  4. {agent_cli-0.95.0 → agent_cli-0.95.2}/README.md +7 -3
  5. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/transcribe.py +40 -13
  6. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/transcribe_live.py +4 -2
  7. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/deps.py +1 -1
  8. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/process.py +102 -48
  9. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/utils.py +107 -15
  10. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/opts.py +12 -0
  11. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/transcribe.md +2 -0
  12. {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Package.swift +5 -0
  13. {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +19 -14
  14. {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +34 -120
  15. {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +22 -9
  16. {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +3 -1
  17. {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +5 -5
  18. agent_cli-0.95.2/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +33 -0
  19. agent_cli-0.95.2/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +77 -0
  20. agent_cli-0.95.2/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +16 -0
  21. {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/build-macos-app.sh +97 -4
  22. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_speak.py +25 -15
  23. agent_cli-0.95.2/tests/agents/test_transcribe_agent.py +200 -0
  24. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_voice_edit.py +33 -18
  25. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/conftest.py +8 -1
  26. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_macos_app.py +100 -22
  27. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_process_manager.py +137 -54
  28. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_requires_extras.py +13 -3
  29. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_utils.py +31 -22
  30. agent_cli-0.95.0/tests/agents/test_transcribe_agent.py +0 -79
  31. {agent_cli-0.95.0 → agent_cli-0.95.2}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  32. {agent_cli-0.95.0 → agent_cli-0.95.2}/.claude/skills/agent-cli-dev/examples.md +0 -0
  33. {agent_cli-0.95.0 → agent_cli-0.95.2}/.claude-plugin/README.md +0 -0
  34. {agent_cli-0.95.0 → agent_cli-0.95.2}/.claude-plugin/marketplace.json +0 -0
  35. {agent_cli-0.95.0 → agent_cli-0.95.2}/.claude-plugin/plugin.json +0 -0
  36. {agent_cli-0.95.0 → agent_cli-0.95.2}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  37. {agent_cli-0.95.0 → agent_cli-0.95.2}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  38. {agent_cli-0.95.0 → agent_cli-0.95.2}/.cursorrules +0 -0
  39. {agent_cli-0.95.0 → agent_cli-0.95.2}/.dockerignore +0 -0
  40. {agent_cli-0.95.0 → agent_cli-0.95.2}/.env.example +0 -0
  41. {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/logo.svg +0 -0
  42. {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/release-drafter.yml +0 -0
  43. {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/renovate.json +0 -0
  44. {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/scripts/check_extras_sync.py +0 -0
  45. {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/scripts/check_plugin_skill_sync.py +0 -0
  46. {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/scripts/sync_extras.py +0 -0
  47. {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/scripts/sync_requirements.py +0 -0
  48. {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/workflows/automerge.yml +0 -0
  49. {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/workflows/docker.yml +0 -0
  50. {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/workflows/docs.yml +0 -0
  51. {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/workflows/markdown-code-runner.yml +0 -0
  52. {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/workflows/release-drafter.yml +0 -0
  53. {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/workflows/toc.yaml +0 -0
  54. {agent_cli-0.95.0 → agent_cli-0.95.2}/.gitignore +0 -0
  55. {agent_cli-0.95.0 → agent_cli-0.95.2}/.jscpd.json +0 -0
  56. {agent_cli-0.95.0 → agent_cli-0.95.2}/.pre-commit-config.yaml +0 -0
  57. {agent_cli-0.95.0 → agent_cli-0.95.2}/.prompts/docs-review.md +0 -0
  58. {agent_cli-0.95.0 → agent_cli-0.95.2}/.prompts/pr-review.md +0 -0
  59. {agent_cli-0.95.0 → agent_cli-0.95.2}/CLAUDE.md +0 -0
  60. {agent_cli-0.95.0 → agent_cli-0.95.2}/LICENSE +0 -0
  61. {agent_cli-0.95.0 → agent_cli-0.95.2}/LLAMA_SERVER_USAGE.md +0 -0
  62. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/__init__.py +0 -0
  63. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/__main__.py +0 -0
  64. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_extras.json +0 -0
  65. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/.gitkeep +0 -0
  66. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/audio.txt +0 -0
  67. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/diarization.txt +0 -0
  68. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/faster-whisper.txt +0 -0
  69. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/kokoro.txt +0 -0
  70. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/llm.txt +0 -0
  71. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/memory.txt +0 -0
  72. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  73. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/piper.txt +0 -0
  74. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/rag.txt +0 -0
  75. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/server.txt +0 -0
  76. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/speed.txt +0 -0
  77. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/vad.txt +0 -0
  78. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/vectordb.txt +0 -0
  79. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  80. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/wyoming.txt +0 -0
  81. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_tools.py +0 -0
  82. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/__init__.py +0 -0
  83. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/_voice_agent_common.py +0 -0
  84. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/assistant.py +0 -0
  85. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/autocorrect.py +0 -0
  86. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/chat.py +0 -0
  87. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/diarize_live_session.py +0 -0
  88. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/memory/__init__.py +0 -0
  89. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/memory/add.py +0 -0
  90. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/memory/proxy.py +0 -0
  91. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/rag_proxy.py +0 -0
  92. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/speak.py +0 -0
  93. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/speakers.py +0 -0
  94. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/voice_edit.py +0 -0
  95. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/api.py +0 -0
  96. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/cli.py +0 -0
  97. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/config.py +0 -0
  98. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/config_cmd.py +0 -0
  99. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/constants.py +0 -0
  100. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/__init__.py +0 -0
  101. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/alignment.py +0 -0
  102. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/audio.py +0 -0
  103. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/audio_format.py +0 -0
  104. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/chroma.py +0 -0
  105. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/diarization.py +0 -0
  106. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/openai_proxy.py +0 -0
  107. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/reranker.py +0 -0
  108. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/speaker_identity.py +0 -0
  109. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/sse.py +0 -0
  110. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/transcription_logger.py +0 -0
  111. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/vad.py +0 -0
  112. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/watch.py +0 -0
  113. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/daemon/__init__.py +0 -0
  114. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/daemon/cli.py +0 -0
  115. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/__init__.py +0 -0
  116. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/_branch_name.py +0 -0
  117. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/_config.py +0 -0
  118. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/_output.py +0 -0
  119. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/cleanup.py +0 -0
  120. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/cli.py +0 -0
  121. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/__init__.py +0 -0
  122. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/aider.py +0 -0
  123. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/base.py +0 -0
  124. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/claude.py +0 -0
  125. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/codex.py +0 -0
  126. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  127. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/copilot.py +0 -0
  128. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  129. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/gemini.py +0 -0
  130. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/opencode.py +0 -0
  131. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/registry.py +0 -0
  132. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/__init__.py +0 -0
  133. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/base.py +0 -0
  134. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/cursor.py +0 -0
  135. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/emacs.py +0 -0
  136. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/jetbrains.py +0 -0
  137. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/nano.py +0 -0
  138. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/neovim.py +0 -0
  139. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/registry.py +0 -0
  140. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/sublime.py +0 -0
  141. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/vim.py +0 -0
  142. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/vscode.py +0 -0
  143. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/zed.py +0 -0
  144. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/hooks.py +0 -0
  145. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/launch.py +0 -0
  146. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/project.py +0 -0
  147. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/registry.py +0 -0
  148. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/skill/SKILL.md +0 -0
  149. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/skill/examples.md +0 -0
  150. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/__init__.py +0 -0
  151. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  152. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/base.py +0 -0
  153. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/gnome.py +0 -0
  154. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/iterm2.py +0 -0
  155. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/kitty.py +0 -0
  156. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/registry.py +0 -0
  157. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/tmux.py +0 -0
  158. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/warp.py +0 -0
  159. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/zellij.py +0 -0
  160. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/worktree.py +0 -0
  161. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/docs_gen.py +0 -0
  162. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/example-config.toml +0 -0
  163. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/install/__init__.py +0 -0
  164. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/install/common.py +0 -0
  165. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/install/extras.py +0 -0
  166. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/install/hotkeys.py +0 -0
  167. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/install/launchd.py +0 -0
  168. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/install/service_config.py +0 -0
  169. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/install/services.py +0 -0
  170. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/install/systemd.py +0 -0
  171. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/__init__.py +0 -0
  172. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_files.py +0 -0
  173. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_filters.py +0 -0
  174. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_git.py +0 -0
  175. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_indexer.py +0 -0
  176. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_ingest.py +0 -0
  177. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_persistence.py +0 -0
  178. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_prompt.py +0 -0
  179. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_retrieval.py +0 -0
  180. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_store.py +0 -0
  181. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_streaming.py +0 -0
  182. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_tasks.py +0 -0
  183. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/api.py +0 -0
  184. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/client.py +0 -0
  185. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/engine.py +0 -0
  186. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/entities.py +0 -0
  187. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/models.py +0 -0
  188. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/py.typed +0 -0
  189. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/__init__.py +0 -0
  190. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/_indexer.py +0 -0
  191. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/_indexing.py +0 -0
  192. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/_prompt.py +0 -0
  193. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/_retriever.py +0 -0
  194. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/_store.py +0 -0
  195. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/_utils.py +0 -0
  196. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/api.py +0 -0
  197. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/client.py +0 -0
  198. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/engine.py +0 -0
  199. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/models.py +0 -0
  200. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  201. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/__init__.py +0 -0
  202. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  203. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  204. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  205. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  206. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  207. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  208. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  209. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  210. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  211. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  212. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  213. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  214. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  215. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  216. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/run-openwakeword.sh +0 -0
  217. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  218. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/setup-linux.sh +0 -0
  219. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  220. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/setup-macos.sh +0 -0
  221. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/setup-windows.ps1 +0 -0
  222. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  223. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/start-all-services.sh +0 -0
  224. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/__init__.py +0 -0
  225. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/cli.py +0 -0
  226. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/common.py +0 -0
  227. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/model_manager.py +0 -0
  228. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/model_registry.py +0 -0
  229. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/proxy/__init__.py +0 -0
  230. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/proxy/api.py +0 -0
  231. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/streaming.py +0 -0
  232. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/tts/__init__.py +0 -0
  233. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/tts/api.py +0 -0
  234. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/tts/backends/__init__.py +0 -0
  235. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/tts/backends/base.py +0 -0
  236. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/tts/backends/kokoro.py +0 -0
  237. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/tts/backends/piper.py +0 -0
  238. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/tts/model_manager.py +0 -0
  239. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/tts/model_registry.py +0 -0
  240. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/tts/wyoming_handler.py +0 -0
  241. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/__init__.py +0 -0
  242. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/api.py +0 -0
  243. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/backends/__init__.py +0 -0
  244. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/backends/base.py +0 -0
  245. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  246. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/backends/mlx.py +0 -0
  247. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/backends/transformers.py +0 -0
  248. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/languages.py +0 -0
  249. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/model_manager.py +0 -0
  250. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/model_registry.py +0 -0
  251. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  252. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/services/__init__.py +0 -0
  253. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/services/_wyoming_utils.py +0 -0
  254. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/services/asr.py +0 -0
  255. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/services/llm.py +0 -0
  256. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/services/tts.py +0 -0
  257. {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/services/wake_word.py +0 -0
  258. {agent_cli-0.95.0 → agent_cli-0.95.2}/docker/docker-compose.yml +0 -0
  259. {agent_cli-0.95.0 → agent_cli-0.95.2}/docker/memory-proxy.Dockerfile +0 -0
  260. {agent_cli-0.95.0 → agent_cli-0.95.2}/docker/rag-proxy.Dockerfile +0 -0
  261. {agent_cli-0.95.0 → agent_cli-0.95.2}/docker/transcribe-proxy.Dockerfile +0 -0
  262. {agent_cli-0.95.0 → agent_cli-0.95.2}/docker/tts.Dockerfile +0 -0
  263. {agent_cli-0.95.0 → agent_cli-0.95.2}/docker/whisper.Dockerfile +0 -0
  264. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/CNAME +0 -0
  265. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/architecture/index.md +0 -0
  266. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/architecture/memory.md +0 -0
  267. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/architecture/rag.md +0 -0
  268. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/assistant.md +0 -0
  269. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/autocorrect.md +0 -0
  270. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/chat.md +0 -0
  271. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/config.md +0 -0
  272. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/daemon.md +0 -0
  273. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/dev.md +0 -0
  274. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/diarize-live-session.md +0 -0
  275. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/index.md +0 -0
  276. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/install-extras.md +0 -0
  277. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/install-hotkeys.md +0 -0
  278. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/install-services.md +0 -0
  279. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/memory.md +0 -0
  280. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/rag-proxy.md +0 -0
  281. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/server/index.md +0 -0
  282. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/server/transcribe-proxy.md +0 -0
  283. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/server/tts.md +0 -0
  284. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/server/whisper.md +0 -0
  285. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/speak.md +0 -0
  286. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/speakers.md +0 -0
  287. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/start-services.md +0 -0
  288. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/transcribe-live.md +0 -0
  289. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/voice-edit.md +0 -0
  290. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/configuration.md +0 -0
  291. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/getting-started.md +0 -0
  292. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/iOS_Shortcut_Guide.md +0 -0
  293. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/index.md +0 -0
  294. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/installation/docker.md +0 -0
  295. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/installation/index.md +0 -0
  296. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/installation/linux.md +0 -0
  297. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/installation/macos.md +0 -0
  298. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/installation/nixos.md +0 -0
  299. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/installation/windows.md +0 -0
  300. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/logo-avatar.svg +0 -0
  301. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/logo-clean.svg +0 -0
  302. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  303. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/run_markdown_code_runner.py +0 -0
  304. {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/system-integration.md +0 -0
  305. {agent_cli-0.95.0 → agent_cli-0.95.2}/example.agent-cli-config.toml +0 -0
  306. {agent_cli-0.95.0 → agent_cli-0.95.2}/justfile +0 -0
  307. {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Package.resolved +0 -0
  308. {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/README.md +0 -0
  309. {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Resources/Info.plist +0 -0
  310. {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
  311. {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
  312. {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
  313. {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
  314. {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +0 -0
  315. {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
  316. {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/test-macos-app-e2e.sh +0 -0
  317. {agent_cli-0.95.0 → agent_cli-0.95.2}/pyproject.toml +0 -0
  318. {agent_cli-0.95.0 → agent_cli-0.95.2}/reddit.md +0 -0
  319. {agent_cli-0.95.0 → agent_cli-0.95.2}/shell.nix +0 -0
  320. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/__init__.py +0 -0
  321. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/__init__.py +0 -0
  322. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_fix_my_text.py +0 -0
  323. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_interactive.py +0 -0
  324. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_interactive_extra.py +0 -0
  325. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_memory_add.py +0 -0
  326. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_speak_e2e.py +0 -0
  327. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_speakers.py +0 -0
  328. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_transcribe.py +0 -0
  329. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_transcribe_e2e.py +0 -0
  330. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_transcribe_live.py +0 -0
  331. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_transcribe_recovery.py +0 -0
  332. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_tts_common.py +0 -0
  333. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_tts_common_extra.py +0 -0
  334. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_voice_agent_common.py +0 -0
  335. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_voice_edit_e2e.py +0 -0
  336. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_wake_word_assistant.py +0 -0
  337. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/core/__init__.py +0 -0
  338. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/core/test_audio.py +0 -0
  339. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/core/test_audio_format.py +0 -0
  340. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/core/test_chroma.py +0 -0
  341. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/core/test_sse.py +0 -0
  342. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/core/test_vad.py +0 -0
  343. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/core/test_watch.py +0 -0
  344. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/__init__.py +0 -0
  345. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_cleanup.py +0 -0
  346. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_cli.py +0 -0
  347. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_coding_agents.py +0 -0
  348. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_editors.py +0 -0
  349. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_hooks.py +0 -0
  350. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_launch.py +0 -0
  351. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_project.py +0 -0
  352. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_terminals.py +0 -0
  353. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_verification.py +0 -0
  354. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_worktree.py +0 -0
  355. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/install/__init__.py +0 -0
  356. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/install/test_extras.py +0 -0
  357. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/install/test_launchd.py +0 -0
  358. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/__init__.py +0 -0
  359. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_api_health.py +0 -0
  360. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_api_integration_liveish.py +0 -0
  361. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_client.py +0 -0
  362. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_engine.py +0 -0
  363. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_files.py +0 -0
  364. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_filters.py +0 -0
  365. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_git_integration.py +0 -0
  366. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_indexer.py +0 -0
  367. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_memory_integration.py +0 -0
  368. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_proxy_passthrough.py +0 -0
  369. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_store.py +0 -0
  370. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_utils.py +0 -0
  371. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/mocks/__init__.py +0 -0
  372. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/mocks/audio.py +0 -0
  373. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/mocks/llm.py +0 -0
  374. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/mocks/wyoming.py +0 -0
  375. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/__init__.py +0 -0
  376. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_api.py +0 -0
  377. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_engine.py +0 -0
  378. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_history.py +0 -0
  379. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_indexer.py +0 -0
  380. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_indexing.py +0 -0
  381. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_rag_client.py +0 -0
  382. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_rag_integration_liveish.py +0 -0
  383. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  384. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_retriever.py +0 -0
  385. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_store.py +0 -0
  386. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_utils.py +0 -0
  387. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_alignment.py +0 -0
  388. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_api.py +0 -0
  389. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_api_integration.py +0 -0
  390. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_asr.py +0 -0
  391. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_asr_recovery.py +0 -0
  392. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_audio_e2e.py +0 -0
  393. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_cli.py +0 -0
  394. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_config.py +0 -0
  395. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_config_cmd.py +0 -0
  396. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_daemon.py +0 -0
  397. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_diarization.py +0 -0
  398. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_diarize_live_session.py +0 -0
  399. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_docs_gen.py +0 -0
  400. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_env_vars.py +0 -0
  401. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_faster_whisper_backend.py +0 -0
  402. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_json_output.py +0 -0
  403. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_llm.py +0 -0
  404. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_llm_gemini.py +0 -0
  405. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_memory_tools.py +0 -0
  406. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_mlx_backend.py +0 -0
  407. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_server_streaming.py +0 -0
  408. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_server_tts.py +0 -0
  409. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_server_whisper.py +0 -0
  410. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_services.py +0 -0
  411. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_speaker_identity.py +0 -0
  412. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_tools.py +0 -0
  413. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_transformers_backend.py +0 -0
  414. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_tts.py +0 -0
  415. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_wake_word.py +0 -0
  416. {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_wyoming_utils.py +0 -0
  417. {agent_cli-0.95.0 → agent_cli-0.95.2}/uv.lock +0 -0
  418. {agent_cli-0.95.0 → agent_cli-0.95.2}/zensical.toml +0 -0
@@ -28,6 +28,9 @@ jobs:
28
28
  run: sudo apt-get update && sudo apt-get install -y portaudio19-dev
29
29
  - name: Install uv
30
30
  uses: astral-sh/setup-uv@v8.1.0
31
+ - name: Run macOS app Swift tests
32
+ if: matrix.os == 'macos-latest' && matrix.python-version == '3.13'
33
+ run: swift test --package-path macos/AgentCLI --enable-xctest
31
34
  - name: Run pytest (macOS - all extras)
32
35
  if: matrix.os == 'macos-latest'
33
36
  run: uv run --all-extras pytest -vvv
@@ -1,4 +1,4 @@
1
- name: Upload Python Package
1
+ name: Publish Release
2
2
 
3
3
  on:
4
4
  release:
@@ -6,6 +6,7 @@ on:
6
6
 
7
7
  jobs:
8
8
  deploy:
9
+ name: Publish Python package
9
10
  runs-on: ubuntu-latest
10
11
  environment:
11
12
  name: pypi
@@ -22,7 +23,9 @@ jobs:
22
23
  uses: pypa/gh-action-pypi-publish@release/v1
23
24
 
24
25
  build_macos_app:
26
+ name: Build and publish macOS app
25
27
  runs-on: macos-latest
28
+ timeout-minutes: 45
26
29
  permissions:
27
30
  contents: write
28
31
  steps:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-cli
3
- Version: 0.95.0
3
+ Version: 0.95.2
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>
@@ -961,9 +961,13 @@ the `[defaults]` section of your configuration file.
961
961
  │ [env var: GEMINI_API_KEY] │
962
962
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
963
963
  ╭─ Process Management ───────────────────────────────────────────────────────────────────╮
964
- │ --stop Stop any running instance of this command.
965
- │ --status Check if an instance is currently running.
966
- │ --toggle Start if not running, stop if running. Ideal for hotkey binding.
964
+ │ --start Start this command if it is not already running.
965
+ │ --stop Stop any running instance of this command.
966
+ │ --status Check if an instance is currently running.
967
+ │ --toggle Start if not running, stop if running. Ideal for hotkey │
968
+ │ binding. │
969
+ │ --wait-for-start When stopping, wait briefly for a just-launched process to │
970
+ │ write its PID. │
967
971
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
968
972
  ╭─ General Options ──────────────────────────────────────────────────────────────────────╮
969
973
  │ --clipboard --no-clipboard Copy result to │
@@ -856,9 +856,13 @@ the `[defaults]` section of your configuration file.
856
856
  │ [env var: GEMINI_API_KEY] │
857
857
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
858
858
  ╭─ Process Management ───────────────────────────────────────────────────────────────────╮
859
- │ --stop Stop any running instance of this command.
860
- │ --status Check if an instance is currently running.
861
- │ --toggle Start if not running, stop if running. Ideal for hotkey binding.
859
+ │ --start Start this command if it is not already running.
860
+ │ --stop Stop any running instance of this command.
861
+ │ --status Check if an instance is currently running.
862
+ │ --toggle Start if not running, stop if running. Ideal for hotkey │
863
+ │ binding. │
864
+ │ --wait-for-start When stopping, wait briefly for a just-launched process to │
865
+ │ write its PID. │
862
866
  ╰────────────────────────────────────────────────────────────────────────────────────────╯
863
867
  ╭─ General Options ──────────────────────────────────────────────────────────────────────╮
864
868
  │ --clipboard --no-clipboard Copy result to │
@@ -625,9 +625,11 @@ def transcribe( # noqa: PLR0912, PLR0911, PLR0915, C901
625
625
  gemini_api_key: str | None = opts.GEMINI_API_KEY,
626
626
  llm: bool = opts.LLM,
627
627
  # --- Process Management ---
628
+ start: bool = opts.START,
628
629
  stop: bool = opts.STOP,
629
630
  status: bool = opts.STATUS,
630
631
  toggle: bool = opts.TOGGLE,
632
+ wait_for_start: bool = opts.WAIT_FOR_START,
631
633
  # --- General Options ---
632
634
  clipboard: bool = opts.CLIPBOARD,
633
635
  log_level: opts.LogLevel = opts.LOG_LEVEL,
@@ -854,6 +856,29 @@ def transcribe( # noqa: PLR0912, PLR0911, PLR0915, C901
854
856
 
855
857
  # Normal recording mode
856
858
  process_name = "transcribe"
859
+ if start:
860
+ process_status = process.get_process_status(process_name)
861
+ if process_status.running:
862
+ if json_output:
863
+ print(
864
+ json.dumps(
865
+ {
866
+ "action": "start",
867
+ "process": process_name,
868
+ "running": True,
869
+ "status": "running",
870
+ "pid": process_status.pid,
871
+ "stale_cleaned": process_status.stale_cleaned,
872
+ },
873
+ ),
874
+ )
875
+ elif not general_cfg.quiet:
876
+ print_with_style(
877
+ f"✅ Transcribe is already running (PID: {process_status.pid}).",
878
+ style="green",
879
+ )
880
+ return
881
+
857
882
  if stop_or_status_or_toggle(
858
883
  process_name,
859
884
  "transcribe",
@@ -861,24 +886,26 @@ def transcribe( # noqa: PLR0912, PLR0911, PLR0915, C901
861
886
  status,
862
887
  toggle,
863
888
  quiet=general_cfg.quiet,
889
+ json_output=json_output,
890
+ wait_for_start_seconds=300.0 if wait_for_start else 0.0,
864
891
  ):
865
892
  return
866
893
 
867
- audio_in_cfg = config.AudioInput(
868
- input_device_index=input_device_index,
869
- input_device_name=input_device_name,
870
- )
871
-
872
- # We only use setup_devices for its input device handling
873
- device_info = setup_devices(general_cfg, audio_in_cfg, None)
874
- if device_info is None:
875
- return
876
- input_device_index, _, _ = device_info
877
- audio_in_cfg.input_device_index = input_device_index
878
-
879
- # Use context manager for PID file management
894
+ # Use context manager before audio setup so --stop can target startup reliably.
880
895
  try:
881
896
  with process.pid_file_context(process_name), suppress(KeyboardInterrupt):
897
+ audio_in_cfg = config.AudioInput(
898
+ input_device_index=input_device_index,
899
+ input_device_name=input_device_name,
900
+ )
901
+
902
+ # We only use setup_devices for its input device handling
903
+ device_info = setup_devices(general_cfg, audio_in_cfg, None)
904
+ if device_info is None:
905
+ return
906
+ input_device_index, _, _ = device_info
907
+ audio_in_cfg.input_device_index = input_device_index
908
+
882
909
  result = asyncio.run(
883
910
  _async_main(
884
911
  extra_instructions=extra_instructions,
@@ -408,7 +408,8 @@ def transcribe_live( # noqa: PLR0912
408
408
 
409
409
  # Handle stop/status commands
410
410
  if stop:
411
- if process.kill_process(process_name):
411
+ result = process.stop_process(process_name)
412
+ if result.was_running or result.stale_cleaned:
412
413
  if not quiet:
413
414
  print_with_style(f"✅ Stopped {process_name}", style="green")
414
415
  elif not quiet:
@@ -416,7 +417,8 @@ def transcribe_live( # noqa: PLR0912
416
417
  return
417
418
 
418
419
  if status:
419
- if process.is_process_running(process_name):
420
+ process_status = process.get_process_status(process_name)
421
+ if process_status.running:
420
422
  if not quiet:
421
423
  print_with_style(f"✅ {process_name} is running", style="green")
422
424
  elif not quiet:
@@ -382,7 +382,7 @@ def _should_skip_extra_check_for_process_control(
382
382
 
383
383
  from agent_cli.core import process # noqa: PLC0415
384
384
 
385
- return process.is_process_running(process_name)
385
+ return process.get_process_status(process_name).running
386
386
 
387
387
 
388
388
  def requires_extras(
@@ -24,6 +24,24 @@ class _PidInfo(NamedTuple):
24
24
  uses_lock: bool
25
25
 
26
26
 
27
+ class ProcessStatus(NamedTuple):
28
+ """Current state of a managed Agent CLI process."""
29
+
30
+ process_name: str
31
+ running: bool
32
+ pid: int | None
33
+ stale_cleaned: bool = False
34
+
35
+
36
+ class StopProcessResult(NamedTuple):
37
+ """Result of a stop request for a managed Agent CLI process."""
38
+
39
+ process_name: str
40
+ was_running: bool
41
+ status: ProcessStatus
42
+ stale_cleaned: bool = False
43
+
44
+
27
45
  def _default_pid_dir() -> Path:
28
46
  """Return local runtime dir for process control files."""
29
47
  if runtime_dir := os.environ.get("AGENTCLI_RUNTIME_DIR"):
@@ -116,8 +134,10 @@ def _is_pid_running(pid: int) -> bool:
116
134
  try:
117
135
  os.kill(pid, 0)
118
136
  return True
119
- except (ProcessLookupError, PermissionError):
137
+ except ProcessLookupError:
120
138
  return False
139
+ except PermissionError:
140
+ return True
121
141
 
122
142
 
123
143
  def _supports_process_locks() -> bool:
@@ -233,58 +253,59 @@ def _cleanup_process_files(process_name: str) -> None:
233
253
  clear_stop_file(process_name)
234
254
 
235
255
 
236
- def _get_running_pid(process_name: str) -> int | None:
237
- """Get PID if process is running, None otherwise. Cleans up stale files."""
256
+ def get_process_status(process_name: str) -> ProcessStatus:
257
+ """Return process state and deterministically clean stale control files."""
238
258
  if not _get_pid_file(process_name).exists():
239
- return None
259
+ return ProcessStatus(process_name=process_name, running=False, pid=None)
240
260
 
241
261
  pid_info = _read_pid_info(process_name)
242
262
  if pid_info is None:
243
263
  _cleanup_process_files(process_name)
244
- return None
264
+ return ProcessStatus(
265
+ process_name=process_name,
266
+ running=False,
267
+ pid=None,
268
+ stale_cleaned=True,
269
+ )
245
270
 
246
271
  if pid_info.uses_lock and _supports_process_locks() and not _is_process_lock_held(process_name):
247
272
  _cleanup_process_files(process_name)
248
- return None
273
+ return ProcessStatus(
274
+ process_name=process_name,
275
+ running=False,
276
+ pid=None,
277
+ stale_cleaned=True,
278
+ )
249
279
 
250
280
  if _is_pid_running(pid_info.pid):
251
- return pid_info.pid
281
+ return ProcessStatus(process_name=process_name, running=True, pid=pid_info.pid)
252
282
 
253
283
  _cleanup_process_files(process_name)
254
- return None
255
-
256
-
257
- def is_process_running(process_name: str) -> bool:
258
- """Check if a process is currently running."""
259
- return _get_running_pid(process_name) is not None
260
-
261
-
262
- def read_pid_file(process_name: str) -> int | None:
263
- """Read PID from file if process is running."""
264
- return _get_running_pid(process_name)
265
-
266
-
267
- def kill_process(process_name: str) -> bool:
268
- """Kill a process by name.
269
-
270
- Returns True if killed or cleaned up, False if not found.
271
- On Windows, creates a stop file first to allow graceful shutdown.
272
- """
273
- pid_file = _get_pid_file(process_name)
274
-
275
- # If no PID file exists at all, nothing to do
276
- if not pid_file.exists():
277
- clear_stop_file(process_name)
278
- return False
279
-
280
- # Check if we have a running process
281
- pid = _get_running_pid(process_name)
282
-
283
- # If _get_running_pid returned None but file existed, it cleaned up a stale file
284
- if pid is None:
285
- clear_stop_file(process_name)
286
- return True
287
-
284
+ return ProcessStatus(
285
+ process_name=process_name,
286
+ running=False,
287
+ pid=None,
288
+ stale_cleaned=True,
289
+ )
290
+
291
+
292
+ def _wait_for_process_start(
293
+ process_name: str,
294
+ *,
295
+ wait_for_start_seconds: float,
296
+ poll_interval: float,
297
+ ) -> ProcessStatus:
298
+ """Wait briefly for a just-launched process to write its PID file."""
299
+ deadline = time.monotonic() + wait_for_start_seconds
300
+ status = get_process_status(process_name)
301
+ while not status.running and time.monotonic() < deadline:
302
+ time.sleep(poll_interval)
303
+ status = get_process_status(process_name)
304
+ return status
305
+
306
+
307
+ def _signal_running_process(process_name: str, pid: int) -> None:
308
+ """Signal a known-running process and clean control files if it exits."""
288
309
  stop_file = _get_stop_file(process_name)
289
310
  should_force_kill = sys.platform != "win32" and stop_file.exists()
290
311
 
@@ -317,7 +338,39 @@ def kill_process(process_name: str) -> bool:
317
338
  elif not should_force_kill:
318
339
  stop_file.touch()
319
340
 
320
- return True
341
+
342
+ def stop_process(
343
+ process_name: str,
344
+ *,
345
+ wait_for_start_seconds: float = 0.0,
346
+ poll_interval: float = 0.1,
347
+ ) -> StopProcessResult:
348
+ """Stop a process by name and return the resulting process state."""
349
+ initial_status = get_process_status(process_name)
350
+ if not initial_status.running and wait_for_start_seconds > 0:
351
+ initial_status = _wait_for_process_start(
352
+ process_name,
353
+ wait_for_start_seconds=wait_for_start_seconds,
354
+ poll_interval=poll_interval,
355
+ )
356
+
357
+ if not initial_status.running or initial_status.pid is None:
358
+ clear_stop_file(process_name)
359
+ return StopProcessResult(
360
+ process_name=process_name,
361
+ was_running=False,
362
+ status=initial_status,
363
+ stale_cleaned=initial_status.stale_cleaned,
364
+ )
365
+
366
+ _signal_running_process(process_name, initial_status.pid)
367
+ status = get_process_status(process_name)
368
+ return StopProcessResult(
369
+ process_name=process_name,
370
+ was_running=True,
371
+ status=status,
372
+ stale_cleaned=initial_status.stale_cleaned or status.stale_cleaned,
373
+ )
321
374
 
322
375
 
323
376
  @contextmanager
@@ -329,14 +382,15 @@ def pid_file_context(process_name: str) -> Generator[Path, None, None]:
329
382
  """
330
383
  lock_fd = _acquire_process_lock(process_name)
331
384
  if _supports_process_locks() and lock_fd is None:
332
- existing_pid = _get_running_pid(process_name)
333
- print(f"Process {process_name} is already running (PID: {existing_pid})")
385
+ existing_status = get_process_status(process_name)
386
+ print(f"Process {process_name} is already running (PID: {existing_status.pid})")
334
387
  sys.exit(1)
335
388
 
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)
389
+ if not _supports_process_locks():
390
+ existing_status = get_process_status(process_name)
391
+ if existing_status.running:
392
+ print(f"Process {process_name} is already running (PID: {existing_status.pid})")
393
+ sys.exit(1)
340
394
 
341
395
  if _supports_process_locks():
342
396
  pid_info = _read_pid_info(process_name)
@@ -326,6 +326,94 @@ def signal_handling_context(
326
326
  signal.signal(signum, previous)
327
327
 
328
328
 
329
+ def _process_status_payload(
330
+ *,
331
+ action: str,
332
+ process_name: str,
333
+ process_status: process.ProcessStatus,
334
+ was_running: bool | None = None,
335
+ stale_cleaned: bool | None = None,
336
+ ) -> dict[str, object]:
337
+ """Build machine-readable process control output."""
338
+ payload: dict[str, object] = {
339
+ "action": action,
340
+ "process": process_name,
341
+ "running": process_status.running,
342
+ "status": "running" if process_status.running else "stopped",
343
+ "pid": process_status.pid,
344
+ "stale_cleaned": (process_status.stale_cleaned if stale_cleaned is None else stale_cleaned),
345
+ }
346
+ if was_running is not None:
347
+ payload["was_running"] = was_running
348
+ return payload
349
+
350
+
351
+ def _handle_process_stop(
352
+ process_name: str,
353
+ which: str,
354
+ *,
355
+ quiet: bool,
356
+ json_output: bool,
357
+ wait_for_start_seconds: float,
358
+ ) -> bool:
359
+ """Handle a process stop request."""
360
+ result = process.stop_process(
361
+ process_name,
362
+ wait_for_start_seconds=wait_for_start_seconds,
363
+ )
364
+ if json_output:
365
+ print(
366
+ json.dumps(
367
+ _process_status_payload(
368
+ action="stop",
369
+ process_name=process_name,
370
+ process_status=result.status,
371
+ was_running=result.was_running,
372
+ stale_cleaned=result.stale_cleaned,
373
+ ),
374
+ ),
375
+ )
376
+ return True
377
+
378
+ stopped = result.was_running or result.stale_cleaned
379
+
380
+ if stopped:
381
+ if not quiet:
382
+ print_with_style(f"✅ {which.capitalize()} stopped.")
383
+ elif not quiet:
384
+ print_with_style(f"⚠️ No {which} is running.", style="yellow")
385
+ return True
386
+
387
+
388
+ def _handle_process_status(
389
+ process_name: str,
390
+ which: str,
391
+ *,
392
+ quiet: bool,
393
+ json_output: bool,
394
+ ) -> bool:
395
+ """Handle a process status request."""
396
+ process_status = process.get_process_status(process_name)
397
+ if json_output:
398
+ print(
399
+ json.dumps(
400
+ _process_status_payload(
401
+ action="status",
402
+ process_name=process_name,
403
+ process_status=process_status,
404
+ ),
405
+ ),
406
+ )
407
+ return True
408
+
409
+ if process_status.running:
410
+ if not quiet:
411
+ print_with_style(f"✅ {which.capitalize()} is running (PID: {process_status.pid}).")
412
+ elif not quiet:
413
+ print_with_style(f"⚠️ {which.capitalize()} is not running.", style="yellow")
414
+ return True
415
+
416
+
329
417
  def stop_or_status_or_toggle(
330
418
  process_name: str,
331
419
  which: str,
@@ -334,28 +422,32 @@ def stop_or_status_or_toggle(
334
422
  toggle: bool,
335
423
  *,
336
424
  quiet: bool = False,
425
+ json_output: bool = False,
426
+ wait_for_start_seconds: float = 0.0,
337
427
  ) -> bool:
338
428
  """Handle process control for a given process name."""
339
429
  if stop:
340
- if process.kill_process(process_name):
341
- if not quiet:
342
- print_with_style(f"✅ {which.capitalize()} stopped.")
343
- elif not quiet:
344
- print_with_style(f"⚠️ No {which} is running.", style="yellow")
345
- return True
430
+ return _handle_process_stop(
431
+ process_name,
432
+ which,
433
+ quiet=quiet,
434
+ json_output=json_output,
435
+ wait_for_start_seconds=wait_for_start_seconds,
436
+ )
346
437
 
347
438
  if status:
348
- if process.is_process_running(process_name):
349
- pid = process.read_pid_file(process_name)
350
- if not quiet:
351
- print_with_style(f"✅ {which.capitalize()} is running (PID: {pid}).")
352
- elif not quiet:
353
- print_with_style(f"⚠️ {which.capitalize()} is not running.", style="yellow")
354
- return True
439
+ return _handle_process_status(
440
+ process_name,
441
+ which,
442
+ quiet=quiet,
443
+ json_output=json_output,
444
+ )
355
445
 
356
446
  if toggle:
357
- if process.is_process_running(process_name):
358
- if process.kill_process(process_name) and not quiet:
447
+ process_status = process.get_process_status(process_name)
448
+ if process_status.running:
449
+ result = process.stop_process(process_name)
450
+ if (result.was_running or result.stale_cleaned) and not quiet:
359
451
  print_with_style(f"✅ {which.capitalize()} stopped.")
360
452
  return True
361
453
  if not quiet:
@@ -326,6 +326,12 @@ TTS_GEMINI_VOICE: str = typer.Option(
326
326
 
327
327
 
328
328
  # --- Process Management Options ---
329
+ START: bool = typer.Option(
330
+ False, # noqa: FBT003
331
+ "--start",
332
+ help="Start this command if it is not already running.",
333
+ rich_help_panel="Process Management",
334
+ )
329
335
  STOP: bool = typer.Option(
330
336
  False, # noqa: FBT003
331
337
  "--stop",
@@ -344,6 +350,12 @@ TOGGLE: bool = typer.Option(
344
350
  help="Start if not running, stop if running. Ideal for hotkey binding.",
345
351
  rich_help_panel="Process Management",
346
352
  )
353
+ WAIT_FOR_START: bool = typer.Option(
354
+ False, # noqa: FBT003
355
+ "--wait-for-start",
356
+ help="When stopping, wait briefly for a just-launched process to write its PID.",
357
+ rich_help_panel="Process Management",
358
+ )
347
359
 
348
360
  # --- General Options ---
349
361
 
@@ -168,9 +168,11 @@ The `--from-file` option supports multiple audio formats:
168
168
 
169
169
  | Option | Default | Description |
170
170
  |--------|---------|-------------|
171
+ | `--start` | `false` | Start this command if it is not already running. |
171
172
  | `--stop` | `false` | Stop any running instance of this command. |
172
173
  | `--status` | `false` | Check if an instance is currently running. |
173
174
  | `--toggle` | `false` | Start if not running, stop if running. Ideal for hotkey binding. |
175
+ | `--wait-for-start` | `false` | When stopping, wait briefly for a just-launched process to write its PID. |
174
176
 
175
177
  ### General Options
176
178
 
@@ -21,5 +21,10 @@ let package = Package(
21
21
  ],
22
22
  path: "Sources/AgentCLI"
23
23
  ),
24
+ .testTarget(
25
+ name: "AgentCLITests",
26
+ dependencies: ["AgentCLI"],
27
+ path: "Tests/AgentCLITests"
28
+ ),
24
29
  ]
25
30
  )