agent-cli 0.94.1__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.1 → agent_cli-0.95.0}/.gitignore +1 -0
  3. {agent_cli-0.94.1 → agent_cli-0.95.0}/.pre-commit-config.yaml +1 -1
  4. {agent_cli-0.94.1 → agent_cli-0.95.0}/PKG-INFO +1 -1
  5. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/core/process.py +175 -25
  6. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/daemon/cli.py +4 -2
  7. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/worktree.py +53 -6
  8. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/install/launchd.py +23 -1
  9. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/install/service_config.py +8 -1
  10. agent_cli-0.95.0/docs/logo-avatar.svg +51 -0
  11. agent_cli-0.95.0/macos/AgentCLI/Package.resolved +14 -0
  12. agent_cli-0.95.0/macos/AgentCLI/Package.swift +25 -0
  13. agent_cli-0.95.0/macos/AgentCLI/README.md +97 -0
  14. agent_cli-0.95.0/macos/AgentCLI/Resources/Info.plist +32 -0
  15. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +145 -0
  16. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +82 -0
  17. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +579 -0
  18. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +322 -0
  19. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +85 -0
  20. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +6 -0
  21. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +32 -0
  22. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +40 -0
  23. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +67 -0
  24. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +309 -0
  25. agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +180 -0
  26. agent_cli-0.95.0/macos/build-macos-app.sh +333 -0
  27. agent_cli-0.95.0/macos/test-macos-app-e2e.sh +168 -0
  28. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/dev/test_worktree.py +43 -0
  29. agent_cli-0.95.0/tests/install/test_launchd.py +85 -0
  30. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_daemon.py +69 -0
  31. agent_cli-0.95.0/tests/test_macos_app.py +803 -0
  32. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_process_manager.py +63 -4
  33. agent_cli-0.94.1/.github/workflows/release.yml +0 -22
  34. agent_cli-0.94.1/tests/install/test_launchd.py +0 -23
  35. {agent_cli-0.94.1 → agent_cli-0.95.0}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  36. {agent_cli-0.94.1 → agent_cli-0.95.0}/.claude/skills/agent-cli-dev/examples.md +0 -0
  37. {agent_cli-0.94.1 → agent_cli-0.95.0}/.claude-plugin/README.md +0 -0
  38. {agent_cli-0.94.1 → agent_cli-0.95.0}/.claude-plugin/marketplace.json +0 -0
  39. {agent_cli-0.94.1 → agent_cli-0.95.0}/.claude-plugin/plugin.json +0 -0
  40. {agent_cli-0.94.1 → agent_cli-0.95.0}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  41. {agent_cli-0.94.1 → agent_cli-0.95.0}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  42. {agent_cli-0.94.1 → agent_cli-0.95.0}/.cursorrules +0 -0
  43. {agent_cli-0.94.1 → agent_cli-0.95.0}/.dockerignore +0 -0
  44. {agent_cli-0.94.1 → agent_cli-0.95.0}/.env.example +0 -0
  45. {agent_cli-0.94.1 → agent_cli-0.95.0}/.github/logo.svg +0 -0
  46. {agent_cli-0.94.1 → agent_cli-0.95.0}/.github/release-drafter.yml +0 -0
  47. {agent_cli-0.94.1 → agent_cli-0.95.0}/.github/renovate.json +0 -0
  48. {agent_cli-0.94.1 → agent_cli-0.95.0}/.github/scripts/check_extras_sync.py +0 -0
  49. {agent_cli-0.94.1 → agent_cli-0.95.0}/.github/scripts/check_plugin_skill_sync.py +0 -0
  50. {agent_cli-0.94.1 → agent_cli-0.95.0}/.github/scripts/sync_extras.py +0 -0
  51. {agent_cli-0.94.1 → agent_cli-0.95.0}/.github/scripts/sync_requirements.py +0 -0
  52. {agent_cli-0.94.1 → agent_cli-0.95.0}/.github/workflows/automerge.yml +0 -0
  53. {agent_cli-0.94.1 → agent_cli-0.95.0}/.github/workflows/docker.yml +0 -0
  54. {agent_cli-0.94.1 → agent_cli-0.95.0}/.github/workflows/docs.yml +0 -0
  55. {agent_cli-0.94.1 → agent_cli-0.95.0}/.github/workflows/markdown-code-runner.yml +0 -0
  56. {agent_cli-0.94.1 → agent_cli-0.95.0}/.github/workflows/pytest.yml +0 -0
  57. {agent_cli-0.94.1 → agent_cli-0.95.0}/.github/workflows/release-drafter.yml +0 -0
  58. {agent_cli-0.94.1 → agent_cli-0.95.0}/.github/workflows/toc.yaml +0 -0
  59. {agent_cli-0.94.1 → agent_cli-0.95.0}/.jscpd.json +0 -0
  60. {agent_cli-0.94.1 → agent_cli-0.95.0}/.prompts/docs-review.md +0 -0
  61. {agent_cli-0.94.1 → agent_cli-0.95.0}/.prompts/pr-review.md +0 -0
  62. {agent_cli-0.94.1 → agent_cli-0.95.0}/CLAUDE.md +0 -0
  63. {agent_cli-0.94.1 → agent_cli-0.95.0}/LICENSE +0 -0
  64. {agent_cli-0.94.1 → agent_cli-0.95.0}/LLAMA_SERVER_USAGE.md +0 -0
  65. {agent_cli-0.94.1 → agent_cli-0.95.0}/README.md +0 -0
  66. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/__init__.py +0 -0
  67. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/__main__.py +0 -0
  68. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/_extras.json +0 -0
  69. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/_requirements/.gitkeep +0 -0
  70. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/_requirements/audio.txt +0 -0
  71. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/_requirements/diarization.txt +0 -0
  72. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/_requirements/faster-whisper.txt +0 -0
  73. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/_requirements/kokoro.txt +0 -0
  74. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/_requirements/llm.txt +0 -0
  75. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/_requirements/memory.txt +0 -0
  76. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  77. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/_requirements/piper.txt +0 -0
  78. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/_requirements/rag.txt +0 -0
  79. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/_requirements/server.txt +0 -0
  80. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/_requirements/speed.txt +0 -0
  81. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/_requirements/vad.txt +0 -0
  82. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/_requirements/vectordb.txt +0 -0
  83. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  84. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/_requirements/wyoming.txt +0 -0
  85. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/_tools.py +0 -0
  86. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/agents/__init__.py +0 -0
  87. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/agents/_voice_agent_common.py +0 -0
  88. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/agents/assistant.py +0 -0
  89. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/agents/autocorrect.py +0 -0
  90. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/agents/chat.py +0 -0
  91. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/agents/diarize_live_session.py +0 -0
  92. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/agents/memory/__init__.py +0 -0
  93. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/agents/memory/add.py +0 -0
  94. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/agents/memory/proxy.py +0 -0
  95. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/agents/rag_proxy.py +0 -0
  96. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/agents/speak.py +0 -0
  97. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/agents/speakers.py +0 -0
  98. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/agents/transcribe.py +0 -0
  99. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/agents/transcribe_live.py +0 -0
  100. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/agents/voice_edit.py +0 -0
  101. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/api.py +0 -0
  102. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/cli.py +0 -0
  103. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/config.py +0 -0
  104. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/config_cmd.py +0 -0
  105. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/constants.py +0 -0
  106. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/core/__init__.py +0 -0
  107. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/core/alignment.py +0 -0
  108. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/core/audio.py +0 -0
  109. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/core/audio_format.py +0 -0
  110. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/core/chroma.py +0 -0
  111. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/core/deps.py +0 -0
  112. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/core/diarization.py +0 -0
  113. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/core/openai_proxy.py +0 -0
  114. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/core/reranker.py +0 -0
  115. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/core/speaker_identity.py +0 -0
  116. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/core/sse.py +0 -0
  117. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/core/transcription_logger.py +0 -0
  118. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/core/utils.py +0 -0
  119. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/core/vad.py +0 -0
  120. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/core/watch.py +0 -0
  121. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/daemon/__init__.py +0 -0
  122. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/__init__.py +0 -0
  123. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/_branch_name.py +0 -0
  124. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/_config.py +0 -0
  125. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/_output.py +0 -0
  126. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/cleanup.py +0 -0
  127. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/cli.py +0 -0
  128. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/__init__.py +0 -0
  129. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/aider.py +0 -0
  130. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/base.py +0 -0
  131. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/claude.py +0 -0
  132. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/codex.py +0 -0
  133. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  134. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/copilot.py +0 -0
  135. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  136. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/gemini.py +0 -0
  137. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/opencode.py +0 -0
  138. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/registry.py +0 -0
  139. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/editors/__init__.py +0 -0
  140. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/editors/base.py +0 -0
  141. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/editors/cursor.py +0 -0
  142. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/editors/emacs.py +0 -0
  143. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/editors/jetbrains.py +0 -0
  144. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/editors/nano.py +0 -0
  145. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/editors/neovim.py +0 -0
  146. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/editors/registry.py +0 -0
  147. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/editors/sublime.py +0 -0
  148. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/editors/vim.py +0 -0
  149. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/editors/vscode.py +0 -0
  150. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/editors/zed.py +0 -0
  151. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/hooks.py +0 -0
  152. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/launch.py +0 -0
  153. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/project.py +0 -0
  154. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/registry.py +0 -0
  155. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/skill/SKILL.md +0 -0
  156. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/skill/examples.md +0 -0
  157. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/terminals/__init__.py +0 -0
  158. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  159. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/terminals/base.py +0 -0
  160. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/terminals/gnome.py +0 -0
  161. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/terminals/iterm2.py +0 -0
  162. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/terminals/kitty.py +0 -0
  163. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/terminals/registry.py +0 -0
  164. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/terminals/tmux.py +0 -0
  165. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/terminals/warp.py +0 -0
  166. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/dev/terminals/zellij.py +0 -0
  167. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/docs_gen.py +0 -0
  168. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/example-config.toml +0 -0
  169. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/install/__init__.py +0 -0
  170. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/install/common.py +0 -0
  171. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/install/extras.py +0 -0
  172. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/install/hotkeys.py +0 -0
  173. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/install/services.py +0 -0
  174. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/install/systemd.py +0 -0
  175. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/memory/__init__.py +0 -0
  176. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/memory/_files.py +0 -0
  177. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/memory/_filters.py +0 -0
  178. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/memory/_git.py +0 -0
  179. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/memory/_indexer.py +0 -0
  180. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/memory/_ingest.py +0 -0
  181. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/memory/_persistence.py +0 -0
  182. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/memory/_prompt.py +0 -0
  183. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/memory/_retrieval.py +0 -0
  184. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/memory/_store.py +0 -0
  185. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/memory/_streaming.py +0 -0
  186. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/memory/_tasks.py +0 -0
  187. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/memory/api.py +0 -0
  188. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/memory/client.py +0 -0
  189. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/memory/engine.py +0 -0
  190. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/memory/entities.py +0 -0
  191. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/memory/models.py +0 -0
  192. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/opts.py +0 -0
  193. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/py.typed +0 -0
  194. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/rag/__init__.py +0 -0
  195. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/rag/_indexer.py +0 -0
  196. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/rag/_indexing.py +0 -0
  197. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/rag/_prompt.py +0 -0
  198. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/rag/_retriever.py +0 -0
  199. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/rag/_store.py +0 -0
  200. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/rag/_utils.py +0 -0
  201. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/rag/api.py +0 -0
  202. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/rag/client.py +0 -0
  203. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/rag/engine.py +0 -0
  204. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/rag/models.py +0 -0
  205. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  206. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/__init__.py +0 -0
  207. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  208. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  209. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  210. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  211. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  212. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  213. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  214. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  215. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  216. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  217. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  218. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  219. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  220. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  221. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/run-openwakeword.sh +0 -0
  222. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  223. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/setup-linux.sh +0 -0
  224. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  225. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/setup-macos.sh +0 -0
  226. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/setup-windows.ps1 +0 -0
  227. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  228. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/scripts/start-all-services.sh +0 -0
  229. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/__init__.py +0 -0
  230. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/cli.py +0 -0
  231. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/common.py +0 -0
  232. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/model_manager.py +0 -0
  233. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/model_registry.py +0 -0
  234. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/proxy/__init__.py +0 -0
  235. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/proxy/api.py +0 -0
  236. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/streaming.py +0 -0
  237. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/tts/__init__.py +0 -0
  238. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/tts/api.py +0 -0
  239. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/tts/backends/__init__.py +0 -0
  240. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/tts/backends/base.py +0 -0
  241. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/tts/backends/kokoro.py +0 -0
  242. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/tts/backends/piper.py +0 -0
  243. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/tts/model_manager.py +0 -0
  244. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/tts/model_registry.py +0 -0
  245. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/tts/wyoming_handler.py +0 -0
  246. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/whisper/__init__.py +0 -0
  247. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/whisper/api.py +0 -0
  248. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/whisper/backends/__init__.py +0 -0
  249. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/whisper/backends/base.py +0 -0
  250. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  251. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/whisper/backends/mlx.py +0 -0
  252. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/whisper/backends/transformers.py +0 -0
  253. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/whisper/languages.py +0 -0
  254. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/whisper/model_manager.py +0 -0
  255. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/whisper/model_registry.py +0 -0
  256. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  257. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/services/__init__.py +0 -0
  258. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/services/_wyoming_utils.py +0 -0
  259. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/services/asr.py +0 -0
  260. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/services/llm.py +0 -0
  261. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/services/tts.py +0 -0
  262. {agent_cli-0.94.1 → agent_cli-0.95.0}/agent_cli/services/wake_word.py +0 -0
  263. {agent_cli-0.94.1 → agent_cli-0.95.0}/docker/docker-compose.yml +0 -0
  264. {agent_cli-0.94.1 → agent_cli-0.95.0}/docker/memory-proxy.Dockerfile +0 -0
  265. {agent_cli-0.94.1 → agent_cli-0.95.0}/docker/rag-proxy.Dockerfile +0 -0
  266. {agent_cli-0.94.1 → agent_cli-0.95.0}/docker/transcribe-proxy.Dockerfile +0 -0
  267. {agent_cli-0.94.1 → agent_cli-0.95.0}/docker/tts.Dockerfile +0 -0
  268. {agent_cli-0.94.1 → agent_cli-0.95.0}/docker/whisper.Dockerfile +0 -0
  269. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/CNAME +0 -0
  270. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/architecture/index.md +0 -0
  271. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/architecture/memory.md +0 -0
  272. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/architecture/rag.md +0 -0
  273. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/assistant.md +0 -0
  274. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/autocorrect.md +0 -0
  275. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/chat.md +0 -0
  276. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/config.md +0 -0
  277. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/daemon.md +0 -0
  278. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/dev.md +0 -0
  279. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/diarize-live-session.md +0 -0
  280. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/index.md +0 -0
  281. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/install-extras.md +0 -0
  282. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/install-hotkeys.md +0 -0
  283. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/install-services.md +0 -0
  284. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/memory.md +0 -0
  285. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/rag-proxy.md +0 -0
  286. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/server/index.md +0 -0
  287. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/server/transcribe-proxy.md +0 -0
  288. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/server/tts.md +0 -0
  289. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/server/whisper.md +0 -0
  290. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/speak.md +0 -0
  291. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/speakers.md +0 -0
  292. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/start-services.md +0 -0
  293. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/transcribe-live.md +0 -0
  294. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/transcribe.md +0 -0
  295. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/commands/voice-edit.md +0 -0
  296. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/configuration.md +0 -0
  297. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/getting-started.md +0 -0
  298. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/iOS_Shortcut_Guide.md +0 -0
  299. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/index.md +0 -0
  300. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/installation/docker.md +0 -0
  301. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/installation/index.md +0 -0
  302. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/installation/linux.md +0 -0
  303. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/installation/macos.md +0 -0
  304. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/installation/nixos.md +0 -0
  305. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/installation/windows.md +0 -0
  306. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/logo-clean.svg +0 -0
  307. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  308. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/run_markdown_code_runner.py +0 -0
  309. {agent_cli-0.94.1 → agent_cli-0.95.0}/docs/system-integration.md +0 -0
  310. {agent_cli-0.94.1 → agent_cli-0.95.0}/example.agent-cli-config.toml +0 -0
  311. {agent_cli-0.94.1 → agent_cli-0.95.0}/justfile +0 -0
  312. {agent_cli-0.94.1 → agent_cli-0.95.0}/pyproject.toml +0 -0
  313. {agent_cli-0.94.1 → agent_cli-0.95.0}/reddit.md +0 -0
  314. {agent_cli-0.94.1 → agent_cli-0.95.0}/shell.nix +0 -0
  315. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/__init__.py +0 -0
  316. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/agents/__init__.py +0 -0
  317. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/agents/test_fix_my_text.py +0 -0
  318. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/agents/test_interactive.py +0 -0
  319. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/agents/test_interactive_extra.py +0 -0
  320. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/agents/test_memory_add.py +0 -0
  321. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/agents/test_speak.py +0 -0
  322. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/agents/test_speak_e2e.py +0 -0
  323. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/agents/test_speakers.py +0 -0
  324. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/agents/test_transcribe.py +0 -0
  325. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/agents/test_transcribe_agent.py +0 -0
  326. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/agents/test_transcribe_e2e.py +0 -0
  327. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/agents/test_transcribe_live.py +0 -0
  328. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/agents/test_transcribe_recovery.py +0 -0
  329. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/agents/test_tts_common.py +0 -0
  330. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/agents/test_tts_common_extra.py +0 -0
  331. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/agents/test_voice_agent_common.py +0 -0
  332. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/agents/test_voice_edit.py +0 -0
  333. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/agents/test_voice_edit_e2e.py +0 -0
  334. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/agents/test_wake_word_assistant.py +0 -0
  335. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/conftest.py +0 -0
  336. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/core/__init__.py +0 -0
  337. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/core/test_audio.py +0 -0
  338. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/core/test_audio_format.py +0 -0
  339. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/core/test_chroma.py +0 -0
  340. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/core/test_sse.py +0 -0
  341. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/core/test_vad.py +0 -0
  342. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/core/test_watch.py +0 -0
  343. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/dev/__init__.py +0 -0
  344. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/dev/test_cleanup.py +0 -0
  345. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/dev/test_cli.py +0 -0
  346. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/dev/test_coding_agents.py +0 -0
  347. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/dev/test_editors.py +0 -0
  348. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/dev/test_hooks.py +0 -0
  349. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/dev/test_launch.py +0 -0
  350. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/dev/test_project.py +0 -0
  351. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/dev/test_terminals.py +0 -0
  352. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/dev/test_verification.py +0 -0
  353. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/install/__init__.py +0 -0
  354. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/install/test_extras.py +0 -0
  355. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/memory/__init__.py +0 -0
  356. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/memory/test_api_health.py +0 -0
  357. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/memory/test_api_integration_liveish.py +0 -0
  358. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/memory/test_client.py +0 -0
  359. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/memory/test_engine.py +0 -0
  360. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/memory/test_files.py +0 -0
  361. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/memory/test_filters.py +0 -0
  362. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/memory/test_git_integration.py +0 -0
  363. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/memory/test_indexer.py +0 -0
  364. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/memory/test_memory_integration.py +0 -0
  365. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/memory/test_proxy_passthrough.py +0 -0
  366. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/memory/test_store.py +0 -0
  367. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/memory/test_utils.py +0 -0
  368. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/mocks/__init__.py +0 -0
  369. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/mocks/audio.py +0 -0
  370. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/mocks/llm.py +0 -0
  371. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/mocks/wyoming.py +0 -0
  372. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/rag/__init__.py +0 -0
  373. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/rag/test_api.py +0 -0
  374. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/rag/test_engine.py +0 -0
  375. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/rag/test_history.py +0 -0
  376. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/rag/test_indexer.py +0 -0
  377. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/rag/test_indexing.py +0 -0
  378. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/rag/test_rag_client.py +0 -0
  379. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/rag/test_rag_integration_liveish.py +0 -0
  380. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  381. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/rag/test_retriever.py +0 -0
  382. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/rag/test_store.py +0 -0
  383. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/rag/test_utils.py +0 -0
  384. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_alignment.py +0 -0
  385. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_api.py +0 -0
  386. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_api_integration.py +0 -0
  387. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_asr.py +0 -0
  388. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_asr_recovery.py +0 -0
  389. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_audio_e2e.py +0 -0
  390. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_cli.py +0 -0
  391. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_config.py +0 -0
  392. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_config_cmd.py +0 -0
  393. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_diarization.py +0 -0
  394. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_diarize_live_session.py +0 -0
  395. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_docs_gen.py +0 -0
  396. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_env_vars.py +0 -0
  397. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_faster_whisper_backend.py +0 -0
  398. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_json_output.py +0 -0
  399. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_llm.py +0 -0
  400. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_llm_gemini.py +0 -0
  401. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_memory_tools.py +0 -0
  402. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_mlx_backend.py +0 -0
  403. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_requires_extras.py +0 -0
  404. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_server_streaming.py +0 -0
  405. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_server_tts.py +0 -0
  406. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_server_whisper.py +0 -0
  407. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_services.py +0 -0
  408. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_speaker_identity.py +0 -0
  409. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_tools.py +0 -0
  410. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_transformers_backend.py +0 -0
  411. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_tts.py +0 -0
  412. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_utils.py +0 -0
  413. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_wake_word.py +0 -0
  414. {agent_cli-0.94.1 → agent_cli-0.95.0}/tests/test_wyoming_utils.py +0 -0
  415. {agent_cli-0.94.1 → agent_cli-0.95.0}/uv.lock +0 -0
  416. {agent_cli-0.94.1 → 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.1
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:
@@ -73,6 +73,15 @@ def get_repo_root(path: Path | None = None) -> Path | None:
73
73
  return None
74
74
 
75
75
 
76
+ def _resolve_git_path(path: str, cwd: Path | None = None) -> Path:
77
+ """Resolve a path emitted by Git relative to the command cwd."""
78
+ resolved = Path(path).expanduser()
79
+ if resolved.is_absolute():
80
+ return resolved
81
+ base = cwd if cwd is not None else Path.cwd()
82
+ return (base / resolved).resolve()
83
+
84
+
76
85
  def get_common_dir(path: Path | None = None) -> Path | None:
77
86
  """Get the common git directory (shared across worktrees)."""
78
87
  try:
@@ -82,11 +91,43 @@ def get_common_dir(path: Path | None = None) -> Path | None:
82
91
  # In main repo, resolve relative to toplevel
83
92
  repo_root = get_repo_root(path)
84
93
  return repo_root / ".git" if repo_root else None
85
- return Path(common_dir)
94
+ return _resolve_git_path(common_dir, path)
86
95
  except subprocess.CalledProcessError:
87
96
  return None
88
97
 
89
98
 
99
+ def _is_git_modules_path(path: Path) -> bool:
100
+ """Return True when path points inside a .git/modules directory."""
101
+ parts = path.parts
102
+ return any(
103
+ part == ".git" and parts[i + 1 : i + 2] == ("modules",) for i, part in enumerate(parts)
104
+ )
105
+
106
+
107
+ def _get_configured_worktree(common_dir: Path) -> Path | None:
108
+ """Read core.worktree from a Git dir config, if present."""
109
+ config_file = common_dir / "config"
110
+ if not config_file.exists():
111
+ return None
112
+
113
+ result = _run_git(
114
+ "config",
115
+ "--file",
116
+ str(config_file),
117
+ "--path",
118
+ "core.worktree",
119
+ cwd=common_dir,
120
+ check=False,
121
+ )
122
+ if result.returncode != 0:
123
+ return None
124
+
125
+ worktree = result.stdout.strip()
126
+ if not worktree:
127
+ return None
128
+ return _resolve_git_path(worktree, common_dir)
129
+
130
+
90
131
  def get_main_repo_root(path: Path | None = None) -> Path | None:
91
132
  """Get the main repository root (even when in a worktree).
92
133
 
@@ -100,11 +141,17 @@ def get_main_repo_root(path: Path | None = None) -> Path | None:
100
141
  return common_dir.parent
101
142
  # Check if we're in a submodule (common_dir is inside .git/modules/)
102
143
  # e.g., /path/to/parent/.git/modules/submodule-name
103
- parts = common_dir.parts
104
- for i, part in enumerate(parts[:-1]):
105
- if part == ".git" and parts[i + 1] == "modules":
106
- # For submodules, use --show-toplevel to get the submodule's working directory
107
- return get_repo_root(path)
144
+ if _is_git_modules_path(common_dir):
145
+ # For submodules, use --show-toplevel to get the submodule's working
146
+ # directory. Linked worktrees of submodules can report the internal
147
+ # .git/modules directory instead, so fall back to core.worktree.
148
+ repo_root = get_repo_root(path)
149
+ if repo_root is not None and not _is_git_modules_path(repo_root):
150
+ return repo_root
151
+ configured_worktree = _get_configured_worktree(common_dir)
152
+ if configured_worktree is not None:
153
+ return configured_worktree
154
+ return repo_root
108
155
  # For bare repos or unusual setups, try to go up from common_dir
109
156
  return common_dir.parent
110
157
 
@@ -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
+ )