agent-cli 0.95.5__tar.gz → 0.95.6__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 (425) hide show
  1. {agent_cli-0.95.5 → agent_cli-0.95.6}/PKG-INFO +1 -1
  2. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/install/service_config.py +6 -1
  3. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +41 -5
  4. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +42 -3
  5. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +60 -0
  6. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +30 -0
  7. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_daemon.py +43 -0
  8. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_macos_app.py +38 -3
  9. {agent_cli-0.95.5 → agent_cli-0.95.6}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  10. {agent_cli-0.95.5 → agent_cli-0.95.6}/.claude/skills/agent-cli-dev/examples.md +0 -0
  11. {agent_cli-0.95.5 → agent_cli-0.95.6}/.claude-plugin/README.md +0 -0
  12. {agent_cli-0.95.5 → agent_cli-0.95.6}/.claude-plugin/marketplace.json +0 -0
  13. {agent_cli-0.95.5 → agent_cli-0.95.6}/.claude-plugin/plugin.json +0 -0
  14. {agent_cli-0.95.5 → agent_cli-0.95.6}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  15. {agent_cli-0.95.5 → agent_cli-0.95.6}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  16. {agent_cli-0.95.5 → agent_cli-0.95.6}/.cursorrules +0 -0
  17. {agent_cli-0.95.5 → agent_cli-0.95.6}/.dockerignore +0 -0
  18. {agent_cli-0.95.5 → agent_cli-0.95.6}/.env.example +0 -0
  19. {agent_cli-0.95.5 → agent_cli-0.95.6}/.github/logo.svg +0 -0
  20. {agent_cli-0.95.5 → agent_cli-0.95.6}/.github/release-drafter.yml +0 -0
  21. {agent_cli-0.95.5 → agent_cli-0.95.6}/.github/renovate.json +0 -0
  22. {agent_cli-0.95.5 → agent_cli-0.95.6}/.github/scripts/check_extras_sync.py +0 -0
  23. {agent_cli-0.95.5 → agent_cli-0.95.6}/.github/scripts/check_plugin_skill_sync.py +0 -0
  24. {agent_cli-0.95.5 → agent_cli-0.95.6}/.github/scripts/sync_extras.py +0 -0
  25. {agent_cli-0.95.5 → agent_cli-0.95.6}/.github/scripts/sync_requirements.py +0 -0
  26. {agent_cli-0.95.5 → agent_cli-0.95.6}/.github/workflows/automerge.yml +0 -0
  27. {agent_cli-0.95.5 → agent_cli-0.95.6}/.github/workflows/docker.yml +0 -0
  28. {agent_cli-0.95.5 → agent_cli-0.95.6}/.github/workflows/docs.yml +0 -0
  29. {agent_cli-0.95.5 → agent_cli-0.95.6}/.github/workflows/markdown-code-runner.yml +0 -0
  30. {agent_cli-0.95.5 → agent_cli-0.95.6}/.github/workflows/pytest.yml +0 -0
  31. {agent_cli-0.95.5 → agent_cli-0.95.6}/.github/workflows/release-drafter.yml +0 -0
  32. {agent_cli-0.95.5 → agent_cli-0.95.6}/.github/workflows/release.yml +0 -0
  33. {agent_cli-0.95.5 → agent_cli-0.95.6}/.github/workflows/toc.yaml +0 -0
  34. {agent_cli-0.95.5 → agent_cli-0.95.6}/.gitignore +0 -0
  35. {agent_cli-0.95.5 → agent_cli-0.95.6}/.jscpd.json +0 -0
  36. {agent_cli-0.95.5 → agent_cli-0.95.6}/.pre-commit-config.yaml +0 -0
  37. {agent_cli-0.95.5 → agent_cli-0.95.6}/.prompts/docs-review.md +0 -0
  38. {agent_cli-0.95.5 → agent_cli-0.95.6}/.prompts/pr-review.md +0 -0
  39. {agent_cli-0.95.5 → agent_cli-0.95.6}/CLAUDE.md +0 -0
  40. {agent_cli-0.95.5 → agent_cli-0.95.6}/LICENSE +0 -0
  41. {agent_cli-0.95.5 → agent_cli-0.95.6}/LLAMA_SERVER_USAGE.md +0 -0
  42. {agent_cli-0.95.5 → agent_cli-0.95.6}/README.md +0 -0
  43. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/__init__.py +0 -0
  44. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/__main__.py +0 -0
  45. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/_extras.json +0 -0
  46. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/_requirements/.gitkeep +0 -0
  47. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/_requirements/audio.txt +0 -0
  48. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/_requirements/diarization.txt +0 -0
  49. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/_requirements/faster-whisper.txt +0 -0
  50. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/_requirements/kokoro.txt +0 -0
  51. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/_requirements/llm.txt +0 -0
  52. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/_requirements/memory.txt +0 -0
  53. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  54. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/_requirements/piper.txt +0 -0
  55. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/_requirements/rag.txt +0 -0
  56. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/_requirements/server.txt +0 -0
  57. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/_requirements/speed.txt +0 -0
  58. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/_requirements/vad.txt +0 -0
  59. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/_requirements/vectordb.txt +0 -0
  60. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  61. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/_requirements/wyoming.txt +0 -0
  62. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/_tools.py +0 -0
  63. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/agents/__init__.py +0 -0
  64. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/agents/_voice_agent_common.py +0 -0
  65. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/agents/assistant.py +0 -0
  66. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/agents/autocorrect.py +0 -0
  67. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/agents/chat.py +0 -0
  68. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/agents/diarize_live_session.py +0 -0
  69. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/agents/memory/__init__.py +0 -0
  70. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/agents/memory/add.py +0 -0
  71. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/agents/memory/proxy.py +0 -0
  72. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/agents/rag_proxy.py +0 -0
  73. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/agents/speak.py +0 -0
  74. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/agents/speakers.py +0 -0
  75. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/agents/transcribe.py +0 -0
  76. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/agents/transcribe_live.py +0 -0
  77. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/agents/voice_edit.py +0 -0
  78. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/api.py +0 -0
  79. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/cli.py +0 -0
  80. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/config.py +0 -0
  81. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/config_cmd.py +0 -0
  82. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/constants.py +0 -0
  83. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/core/__init__.py +0 -0
  84. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/core/alignment.py +0 -0
  85. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/core/audio.py +0 -0
  86. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/core/audio_format.py +0 -0
  87. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/core/chroma.py +0 -0
  88. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/core/deps.py +0 -0
  89. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/core/diarization.py +0 -0
  90. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/core/openai_proxy.py +0 -0
  91. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/core/process.py +0 -0
  92. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/core/reranker.py +0 -0
  93. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/core/speaker_identity.py +0 -0
  94. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/core/sse.py +0 -0
  95. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/core/transcription_logger.py +0 -0
  96. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/core/utils.py +0 -0
  97. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/core/vad.py +0 -0
  98. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/core/watch.py +0 -0
  99. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/daemon/__init__.py +0 -0
  100. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/daemon/cli.py +0 -0
  101. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/__init__.py +0 -0
  102. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/_branch_name.py +0 -0
  103. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/_config.py +0 -0
  104. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/_output.py +0 -0
  105. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/cleanup.py +0 -0
  106. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/cli.py +0 -0
  107. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/coding_agents/__init__.py +0 -0
  108. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/coding_agents/aider.py +0 -0
  109. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/coding_agents/base.py +0 -0
  110. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/coding_agents/claude.py +0 -0
  111. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/coding_agents/codex.py +0 -0
  112. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  113. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/coding_agents/copilot.py +0 -0
  114. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  115. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/coding_agents/gemini.py +0 -0
  116. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/coding_agents/opencode.py +0 -0
  117. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/coding_agents/registry.py +0 -0
  118. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/editors/__init__.py +0 -0
  119. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/editors/base.py +0 -0
  120. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/editors/cursor.py +0 -0
  121. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/editors/emacs.py +0 -0
  122. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/editors/jetbrains.py +0 -0
  123. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/editors/nano.py +0 -0
  124. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/editors/neovim.py +0 -0
  125. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/editors/registry.py +0 -0
  126. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/editors/sublime.py +0 -0
  127. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/editors/vim.py +0 -0
  128. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/editors/vscode.py +0 -0
  129. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/editors/zed.py +0 -0
  130. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/hooks.py +0 -0
  131. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/launch.py +0 -0
  132. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/project.py +0 -0
  133. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/registry.py +0 -0
  134. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/skill/SKILL.md +0 -0
  135. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/skill/examples.md +0 -0
  136. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/terminals/__init__.py +0 -0
  137. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  138. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/terminals/base.py +0 -0
  139. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/terminals/gnome.py +0 -0
  140. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/terminals/iterm2.py +0 -0
  141. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/terminals/kitty.py +0 -0
  142. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/terminals/registry.py +0 -0
  143. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/terminals/tmux.py +0 -0
  144. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/terminals/warp.py +0 -0
  145. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/terminals/zellij.py +0 -0
  146. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/dev/worktree.py +0 -0
  147. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/docs_gen.py +0 -0
  148. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/example-config.toml +0 -0
  149. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/install/__init__.py +0 -0
  150. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/install/common.py +0 -0
  151. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/install/extras.py +0 -0
  152. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/install/hotkeys.py +0 -0
  153. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/install/launchd.py +0 -0
  154. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/install/services.py +0 -0
  155. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/install/systemd.py +0 -0
  156. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/memory/__init__.py +0 -0
  157. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/memory/_files.py +0 -0
  158. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/memory/_filters.py +0 -0
  159. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/memory/_git.py +0 -0
  160. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/memory/_indexer.py +0 -0
  161. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/memory/_ingest.py +0 -0
  162. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/memory/_persistence.py +0 -0
  163. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/memory/_prompt.py +0 -0
  164. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/memory/_retrieval.py +0 -0
  165. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/memory/_store.py +0 -0
  166. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/memory/_streaming.py +0 -0
  167. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/memory/_tasks.py +0 -0
  168. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/memory/api.py +0 -0
  169. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/memory/client.py +0 -0
  170. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/memory/engine.py +0 -0
  171. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/memory/entities.py +0 -0
  172. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/memory/models.py +0 -0
  173. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/opts.py +0 -0
  174. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/py.typed +0 -0
  175. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/rag/__init__.py +0 -0
  176. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/rag/_indexer.py +0 -0
  177. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/rag/_indexing.py +0 -0
  178. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/rag/_prompt.py +0 -0
  179. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/rag/_retriever.py +0 -0
  180. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/rag/_store.py +0 -0
  181. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/rag/_utils.py +0 -0
  182. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/rag/api.py +0 -0
  183. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/rag/client.py +0 -0
  184. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/rag/engine.py +0 -0
  185. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/rag/models.py +0 -0
  186. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  187. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/__init__.py +0 -0
  188. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  189. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  190. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  191. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  192. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  193. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  194. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  195. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  196. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  197. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  198. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  199. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  200. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  201. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  202. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/run-openwakeword.sh +0 -0
  203. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  204. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/setup-linux.sh +0 -0
  205. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  206. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/setup-macos.sh +0 -0
  207. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/setup-windows.ps1 +0 -0
  208. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  209. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/scripts/start-all-services.sh +0 -0
  210. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/__init__.py +0 -0
  211. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/cli.py +0 -0
  212. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/common.py +0 -0
  213. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/model_manager.py +0 -0
  214. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/model_registry.py +0 -0
  215. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/proxy/__init__.py +0 -0
  216. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/proxy/api.py +0 -0
  217. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/streaming.py +0 -0
  218. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/tts/__init__.py +0 -0
  219. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/tts/api.py +0 -0
  220. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/tts/backends/__init__.py +0 -0
  221. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/tts/backends/base.py +0 -0
  222. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/tts/backends/kokoro.py +0 -0
  223. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/tts/backends/piper.py +0 -0
  224. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/tts/model_manager.py +0 -0
  225. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/tts/model_registry.py +0 -0
  226. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/tts/wyoming_handler.py +0 -0
  227. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/whisper/__init__.py +0 -0
  228. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/whisper/api.py +0 -0
  229. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/whisper/backends/__init__.py +0 -0
  230. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/whisper/backends/base.py +0 -0
  231. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  232. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/whisper/backends/mlx.py +0 -0
  233. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/whisper/backends/transformers.py +0 -0
  234. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/whisper/languages.py +0 -0
  235. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/whisper/model_manager.py +0 -0
  236. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/whisper/model_registry.py +0 -0
  237. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  238. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/services/__init__.py +0 -0
  239. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/services/_wyoming_utils.py +0 -0
  240. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/services/asr.py +0 -0
  241. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/services/llm.py +0 -0
  242. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/services/tts.py +0 -0
  243. {agent_cli-0.95.5 → agent_cli-0.95.6}/agent_cli/services/wake_word.py +0 -0
  244. {agent_cli-0.95.5 → agent_cli-0.95.6}/docker/docker-compose.yml +0 -0
  245. {agent_cli-0.95.5 → agent_cli-0.95.6}/docker/memory-proxy.Dockerfile +0 -0
  246. {agent_cli-0.95.5 → agent_cli-0.95.6}/docker/rag-proxy.Dockerfile +0 -0
  247. {agent_cli-0.95.5 → agent_cli-0.95.6}/docker/transcribe-proxy.Dockerfile +0 -0
  248. {agent_cli-0.95.5 → agent_cli-0.95.6}/docker/tts.Dockerfile +0 -0
  249. {agent_cli-0.95.5 → agent_cli-0.95.6}/docker/whisper.Dockerfile +0 -0
  250. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/CNAME +0 -0
  251. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/architecture/index.md +0 -0
  252. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/architecture/memory.md +0 -0
  253. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/architecture/rag.md +0 -0
  254. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/assistant.md +0 -0
  255. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/autocorrect.md +0 -0
  256. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/chat.md +0 -0
  257. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/config.md +0 -0
  258. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/daemon.md +0 -0
  259. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/dev.md +0 -0
  260. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/diarize-live-session.md +0 -0
  261. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/index.md +0 -0
  262. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/install-extras.md +0 -0
  263. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/install-hotkeys.md +0 -0
  264. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/install-services.md +0 -0
  265. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/memory.md +0 -0
  266. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/rag-proxy.md +0 -0
  267. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/server/index.md +0 -0
  268. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/server/transcribe-proxy.md +0 -0
  269. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/server/tts.md +0 -0
  270. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/server/whisper.md +0 -0
  271. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/speak.md +0 -0
  272. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/speakers.md +0 -0
  273. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/start-services.md +0 -0
  274. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/transcribe-live.md +0 -0
  275. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/transcribe.md +0 -0
  276. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/commands/voice-edit.md +0 -0
  277. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/configuration.md +0 -0
  278. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/getting-started.md +0 -0
  279. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/iOS_Shortcut_Guide.md +0 -0
  280. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/index.md +0 -0
  281. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/installation/docker.md +0 -0
  282. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/installation/index.md +0 -0
  283. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/installation/linux.md +0 -0
  284. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/installation/macos.md +0 -0
  285. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/installation/nixos.md +0 -0
  286. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/installation/windows.md +0 -0
  287. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/logo-avatar.svg +0 -0
  288. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/logo-clean.svg +0 -0
  289. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  290. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/run_markdown_code_runner.py +0 -0
  291. {agent_cli-0.95.5 → agent_cli-0.95.6}/docs/system-integration.md +0 -0
  292. {agent_cli-0.95.5 → agent_cli-0.95.6}/example.agent-cli-config.toml +0 -0
  293. {agent_cli-0.95.5 → agent_cli-0.95.6}/justfile +0 -0
  294. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Package.resolved +0 -0
  295. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Package.swift +0 -0
  296. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/README.md +0 -0
  297. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
  298. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Resources/Info.plist +0 -0
  299. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
  300. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
  301. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
  302. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +0 -0
  303. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
  304. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
  305. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
  306. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
  307. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
  308. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
  309. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
  310. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
  311. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
  312. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
  313. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
  314. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
  315. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
  316. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/build-macos-app.sh +0 -0
  317. {agent_cli-0.95.5 → agent_cli-0.95.6}/macos/test-macos-app-e2e.sh +0 -0
  318. {agent_cli-0.95.5 → agent_cli-0.95.6}/pyproject.toml +0 -0
  319. {agent_cli-0.95.5 → agent_cli-0.95.6}/reddit.md +0 -0
  320. {agent_cli-0.95.5 → agent_cli-0.95.6}/shell.nix +0 -0
  321. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/__init__.py +0 -0
  322. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/agents/__init__.py +0 -0
  323. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/agents/test_fix_my_text.py +0 -0
  324. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/agents/test_interactive.py +0 -0
  325. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/agents/test_interactive_extra.py +0 -0
  326. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/agents/test_memory_add.py +0 -0
  327. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/agents/test_speak.py +0 -0
  328. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/agents/test_speak_e2e.py +0 -0
  329. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/agents/test_speakers.py +0 -0
  330. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/agents/test_transcribe.py +0 -0
  331. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/agents/test_transcribe_agent.py +0 -0
  332. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/agents/test_transcribe_e2e.py +0 -0
  333. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/agents/test_transcribe_live.py +0 -0
  334. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/agents/test_transcribe_recovery.py +0 -0
  335. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/agents/test_tts_common.py +0 -0
  336. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/agents/test_tts_common_extra.py +0 -0
  337. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/agents/test_voice_agent_common.py +0 -0
  338. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/agents/test_voice_edit.py +0 -0
  339. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/agents/test_voice_edit_e2e.py +0 -0
  340. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/agents/test_wake_word_assistant.py +0 -0
  341. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/conftest.py +0 -0
  342. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/core/__init__.py +0 -0
  343. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/core/test_audio.py +0 -0
  344. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/core/test_audio_format.py +0 -0
  345. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/core/test_chroma.py +0 -0
  346. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/core/test_sse.py +0 -0
  347. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/core/test_vad.py +0 -0
  348. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/core/test_watch.py +0 -0
  349. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/dev/__init__.py +0 -0
  350. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/dev/test_cleanup.py +0 -0
  351. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/dev/test_cli.py +0 -0
  352. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/dev/test_coding_agents.py +0 -0
  353. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/dev/test_editors.py +0 -0
  354. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/dev/test_hooks.py +0 -0
  355. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/dev/test_launch.py +0 -0
  356. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/dev/test_project.py +0 -0
  357. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/dev/test_terminals.py +0 -0
  358. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/dev/test_verification.py +0 -0
  359. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/dev/test_worktree.py +0 -0
  360. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/install/__init__.py +0 -0
  361. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/install/test_extras.py +0 -0
  362. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/install/test_launchd.py +0 -0
  363. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/memory/__init__.py +0 -0
  364. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/memory/test_api_health.py +0 -0
  365. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/memory/test_api_integration_liveish.py +0 -0
  366. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/memory/test_client.py +0 -0
  367. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/memory/test_engine.py +0 -0
  368. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/memory/test_files.py +0 -0
  369. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/memory/test_filters.py +0 -0
  370. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/memory/test_git_integration.py +0 -0
  371. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/memory/test_indexer.py +0 -0
  372. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/memory/test_memory_integration.py +0 -0
  373. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/memory/test_proxy_passthrough.py +0 -0
  374. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/memory/test_store.py +0 -0
  375. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/memory/test_utils.py +0 -0
  376. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/mocks/__init__.py +0 -0
  377. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/mocks/audio.py +0 -0
  378. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/mocks/llm.py +0 -0
  379. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/mocks/wyoming.py +0 -0
  380. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/rag/__init__.py +0 -0
  381. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/rag/test_api.py +0 -0
  382. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/rag/test_engine.py +0 -0
  383. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/rag/test_history.py +0 -0
  384. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/rag/test_indexer.py +0 -0
  385. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/rag/test_indexing.py +0 -0
  386. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/rag/test_rag_client.py +0 -0
  387. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/rag/test_rag_integration_liveish.py +0 -0
  388. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  389. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/rag/test_retriever.py +0 -0
  390. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/rag/test_store.py +0 -0
  391. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/rag/test_utils.py +0 -0
  392. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_alignment.py +0 -0
  393. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_api.py +0 -0
  394. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_api_integration.py +0 -0
  395. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_asr.py +0 -0
  396. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_asr_recovery.py +0 -0
  397. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_audio_e2e.py +0 -0
  398. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_cli.py +0 -0
  399. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_config.py +0 -0
  400. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_config_cmd.py +0 -0
  401. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_diarization.py +0 -0
  402. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_diarize_live_session.py +0 -0
  403. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_docs_gen.py +0 -0
  404. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_env_vars.py +0 -0
  405. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_faster_whisper_backend.py +0 -0
  406. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_json_output.py +0 -0
  407. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_llm.py +0 -0
  408. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_llm_gemini.py +0 -0
  409. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_memory_tools.py +0 -0
  410. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_mlx_backend.py +0 -0
  411. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_process_manager.py +0 -0
  412. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_requires_extras.py +0 -0
  413. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_server_streaming.py +0 -0
  414. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_server_tts.py +0 -0
  415. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_server_whisper.py +0 -0
  416. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_services.py +0 -0
  417. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_speaker_identity.py +0 -0
  418. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_tools.py +0 -0
  419. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_transformers_backend.py +0 -0
  420. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_tts.py +0 -0
  421. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_utils.py +0 -0
  422. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_wake_word.py +0 -0
  423. {agent_cli-0.95.5 → agent_cli-0.95.6}/tests/test_wyoming_utils.py +0 -0
  424. {agent_cli-0.95.5 → agent_cli-0.95.6}/uv.lock +0 -0
  425. {agent_cli-0.95.5 → agent_cli-0.95.6}/zensical.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-cli
3
- Version: 0.95.5
3
+ Version: 0.95.6
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>
@@ -152,6 +152,12 @@ def build_service_command(
152
152
 
153
153
  def find_uv(extra_paths: list[Path] | None = None) -> Path | None:
154
154
  """Find uv executable, preferring system paths over virtualenv."""
155
+ explicit_uv = os.environ.get("AGENTCLI_UV_PATH")
156
+ if explicit_uv:
157
+ explicit_uv_path = Path(explicit_uv).expanduser()
158
+ if explicit_uv_path.is_file() and os.access(explicit_uv_path, os.X_OK):
159
+ return explicit_uv_path
160
+
155
161
  bundled_uv = os.environ.get("AGENTCLI_BUNDLED_UV")
156
162
  if bundled_uv:
157
163
  bundled_uv_path = Path(bundled_uv).expanduser()
@@ -187,7 +193,6 @@ def install_uv() -> tuple[bool, str]:
187
193
  ["sh"], # noqa: S607
188
194
  input=result.stdout,
189
195
  capture_output=True,
190
- text=True,
191
196
  check=True,
192
197
  )
193
198
  return True, "uv installed successfully"
@@ -425,8 +425,12 @@ struct AgentRuntime {
425
425
  for key in Self.appPrivateEnvironmentKeys {
426
426
  environment.removeValue(forKey: key)
427
427
  }
428
+ // Preserve AGENTCLI_UV_PATH so GUI launches can point at a user-managed uv.
428
429
  let existingPATH = environment["PATH"] ?? "/usr/bin:/bin:/usr/sbin:/sbin"
429
- environment["PATH"] = userInstalledCLIPath(existingPATH: existingPATH)
430
+ environment["PATH"] = userInstalledCLIPath(
431
+ existingPATH: existingPATH,
432
+ loginShellPATH: Self.loginShellPATH(environment: baseEnvironment)
433
+ )
430
434
  return environment
431
435
  }
432
436
 
@@ -460,15 +464,47 @@ struct AgentRuntime {
460
464
  return environment
461
465
  }
462
466
 
463
- private func userInstalledCLIPath(existingPATH: String) -> String {
464
- [
465
- FileManager.default.homeDirectoryForCurrentUser
467
+ func userInstalledCLIPath(existingPATH: String, loginShellPATH: String? = nil) -> String {
468
+ let homeURL = FileManager.default.homeDirectoryForCurrentUser
469
+ var pathValues: [String] = []
470
+ if let loginShellPATH {
471
+ pathValues.append(loginShellPATH)
472
+ }
473
+ pathValues.append(contentsOf: [
474
+ homeURL
466
475
  .appendingPathComponent(".local/bin", isDirectory: true)
467
476
  .path,
477
+ homeURL
478
+ .appendingPathComponent(".cargo/bin", isDirectory: true)
479
+ .path,
468
480
  "/opt/homebrew/bin",
469
481
  "/usr/local/bin",
470
482
  existingPATH
471
- ].joined(separator: ":")
483
+ ])
484
+
485
+ var seen = Set<String>()
486
+ return pathValues
487
+ .flatMap { $0.split(separator: ":").map(String.init) }
488
+ .filter { !$0.isEmpty }
489
+ .filter { seen.insert($0).inserted }
490
+ .joined(separator: ":")
491
+ }
492
+
493
+ private static func loginShellPATH(environment: [String: String]) -> String? {
494
+ let shellPath = environment["SHELL"].flatMap { $0.isEmpty ? nil : $0 } ?? "/bin/zsh"
495
+ guard FileManager.default.isExecutableFile(atPath: shellPath) else { return nil }
496
+
497
+ let result = runProcess(
498
+ executableURL: URL(fileURLWithPath: shellPath),
499
+ arguments: ["-lic", "printf '%s\\n' \"$PATH\""],
500
+ environment: environment
501
+ )
502
+ guard result.exitCode == 0 else { return nil }
503
+
504
+ return result.output
505
+ .split(separator: "\n")
506
+ .last
507
+ .map(String.init)
472
508
  }
473
509
 
474
510
  private func prepareDirectories(for mode: AgentCLIRuntimeMode = .bundled) throws {
@@ -22,18 +22,50 @@ final class ConfigurableHotkeyController {
22
22
  guard !registered else { return }
23
23
 
24
24
  self.runner = runner
25
+ registerStandardTranscriptionHotkeys(runner: runner)
25
26
  registerFunctionAwareTranscriptionHotkeys(runner: runner)
26
27
 
27
28
  KeyboardShortcuts.onKeyUp(for: .autocorrect) {
29
+ guard !ShortcutRecordingState.shared.isRecording else { return }
28
30
  Task { @MainActor in runner.run(.autocorrect) }
29
31
  }
30
32
  KeyboardShortcuts.onKeyUp(for: .voiceEdit) {
33
+ guard !ShortcutRecordingState.shared.isRecording else { return }
31
34
  Task { @MainActor in runner.run(.voiceEdit) }
32
35
  }
33
36
 
34
37
  registered = true
35
38
  }
36
39
 
40
+ private func registerStandardTranscriptionHotkeys(runner: AgentCommandRunner) {
41
+ KeyboardShortcuts.onKeyUp(for: .toggleTranscription) {
42
+ guard !ShortcutRecordingState.shared.isRecording,
43
+ let shortcut = KeyboardShortcuts.getShortcut(for: .toggleTranscription),
44
+ !self.usesFunctionShortcut(shortcut) else {
45
+ return
46
+ }
47
+ Task { @MainActor in runner.run(.toggleTranscription) }
48
+ }
49
+ KeyboardShortcuts.onKeyDown(for: .holdToTranscribe) {
50
+ guard !ShortcutRecordingState.shared.isRecording,
51
+ let shortcut = KeyboardShortcuts.getShortcut(for: .holdToTranscribe),
52
+ !self.usesFunctionShortcut(shortcut) else {
53
+ return
54
+ }
55
+ Task { @MainActor in
56
+ _ = runner.beginHoldToTranscribe()
57
+ }
58
+ }
59
+ KeyboardShortcuts.onKeyUp(for: .holdToTranscribe) {
60
+ guard !ShortcutRecordingState.shared.isRecording,
61
+ let shortcut = KeyboardShortcuts.getShortcut(for: .holdToTranscribe),
62
+ !self.usesFunctionShortcut(shortcut) else {
63
+ return
64
+ }
65
+ Task { @MainActor in runner.endHoldToTranscribe() }
66
+ }
67
+ }
68
+
37
69
  private func registerFunctionAwareTranscriptionHotkeys(runner: AgentCommandRunner) {
38
70
  let eventMask =
39
71
  CGEventMask(1 << CGEventType.keyDown.rawValue) |
@@ -84,6 +116,11 @@ final class ConfigurableHotkeyController {
84
116
  break
85
117
  }
86
118
 
119
+ if ShortcutRecordingState.shared.isRecording {
120
+ cancelPendingHoldToTranscribe()
121
+ return Unmanaged.passUnretained(event)
122
+ }
123
+
87
124
  if handleToggleTranscriptionShortcut(type: type, event: event) {
88
125
  return nil
89
126
  }
@@ -99,13 +136,14 @@ final class ConfigurableHotkeyController {
99
136
 
100
137
  private func handleToggleTranscriptionShortcut(type: CGEventType, event: CGEvent) -> Bool {
101
138
  guard let shortcut = KeyboardShortcuts.getShortcut(for: .toggleTranscription),
139
+ usesFunctionShortcut(shortcut),
102
140
  shortcutMatches(type: type, event: event, shortcut: shortcut) else {
103
141
  return false
104
142
  }
105
143
 
106
144
  if type == .keyDown {
107
145
  cancelPendingHoldToTranscribe()
108
- suppressNextFunctionKeyRelease = usesFunctionModifier(shortcut)
146
+ suppressNextFunctionKeyRelease = usesFunctionShortcut(shortcut)
109
147
 
110
148
  if !isAutorepeat(event) && !holdToTranscribeIsRecording {
111
149
  Task { @MainActor in
@@ -122,6 +160,7 @@ final class ConfigurableHotkeyController {
122
160
  return false
123
161
  }
124
162
  guard !isBareFunctionShortcut(shortcut),
163
+ usesFunctionShortcut(shortcut),
125
164
  shortcutMatches(type: type, event: event, shortcut: shortcut) else {
126
165
  return false
127
166
  }
@@ -237,8 +276,8 @@ final class ConfigurableHotkeyController {
237
276
  return carbonModifiers(from: event.flags) == shortcut.carbonModifiers
238
277
  }
239
278
 
240
- private func usesFunctionModifier(_ shortcut: KeyboardShortcuts.Shortcut) -> Bool {
241
- shortcut.carbonModifiers & kEventKeyModifierFnMask != 0
279
+ private func usesFunctionShortcut(_ shortcut: KeyboardShortcuts.Shortcut) -> Bool {
280
+ isBareFunctionShortcut(shortcut) || shortcut.carbonModifiers & kEventKeyModifierFnMask != 0
242
281
  }
243
282
 
244
283
  private func isBareFunctionShortcut(_ shortcut: KeyboardShortcuts.Shortcut) -> Bool {
@@ -23,6 +23,33 @@ extension KeyboardShortcuts.Name {
23
23
  )
24
24
  }
25
25
 
26
+ final class ShortcutRecordingState {
27
+ static let shared = ShortcutRecordingState()
28
+
29
+ private let lock = NSLock()
30
+ private var activeRecorderCount = 0
31
+
32
+ var isRecording: Bool {
33
+ lock.lock()
34
+ defer { lock.unlock() }
35
+ return activeRecorderCount > 0
36
+ }
37
+
38
+ private init() {}
39
+
40
+ func beginRecording() {
41
+ lock.lock()
42
+ activeRecorderCount += 1
43
+ lock.unlock()
44
+ }
45
+
46
+ func endRecording() {
47
+ lock.lock()
48
+ activeRecorderCount = max(0, activeRecorderCount - 1)
49
+ lock.unlock()
50
+ }
51
+ }
52
+
26
53
  final class ShortcutSummaryState: ObservableObject {
27
54
  static let shared = ShortcutSummaryState()
28
55
 
@@ -271,6 +298,7 @@ final class ShortcutRecorderButton: NSButton {
271
298
 
272
299
  private var isRecording = false
273
300
  private var eventMonitor: Any?
301
+ private var pendingFunctionShortcut = false
274
302
 
275
303
  init(name: KeyboardShortcuts.Name) {
276
304
  self.shortcutName = name
@@ -310,6 +338,7 @@ final class ShortcutRecorderButton: NSButton {
310
338
  }
311
339
 
312
340
  isRecording = true
341
+ ShortcutRecordingState.shared.beginRecording()
313
342
  title = "Press shortcut"
314
343
  window?.makeFirstResponder(self)
315
344
 
@@ -325,11 +354,16 @@ final class ShortcutRecorderButton: NSButton {
325
354
  private func capture(_ event: NSEvent) {
326
355
  switch Int(event.keyCode) {
327
356
  case kVK_Escape:
357
+ pendingFunctionShortcut = false
328
358
  stopRecording()
329
359
  case kVK_Delete, kVK_ForwardDelete:
360
+ pendingFunctionShortcut = false
330
361
  KeyboardShortcuts.setShortcut(nil, for: shortcutName)
331
362
  stopRecording()
363
+ case kVK_Function:
364
+ handleFunctionKeyChange(event)
332
365
  default:
366
+ pendingFunctionShortcut = false
333
367
  guard let shortcut = ShortcutDisplay.shortcut(from: event) else {
334
368
  NSSound.beep()
335
369
  return
@@ -339,12 +373,38 @@ final class ShortcutRecorderButton: NSButton {
339
373
  }
340
374
  }
341
375
 
376
+ private func handleFunctionKeyChange(_ event: NSEvent) {
377
+ guard event.type == .flagsChanged else {
378
+ return
379
+ }
380
+
381
+ if event.modifierFlags.contains(.function) {
382
+ pendingFunctionShortcut = true
383
+ return
384
+ }
385
+
386
+ if pendingFunctionShortcut {
387
+ captureBareFunctionShortcut()
388
+ }
389
+ }
390
+
391
+ private func captureBareFunctionShortcut() {
392
+ pendingFunctionShortcut = false
393
+ KeyboardShortcuts.setShortcut(KeyboardShortcuts.Shortcut(.function), for: shortcutName)
394
+ stopRecording()
395
+ }
396
+
342
397
  private func stopRecording() {
343
398
  if let eventMonitor {
344
399
  NSEvent.removeMonitor(eventMonitor)
345
400
  self.eventMonitor = nil
346
401
  }
402
+ pendingFunctionShortcut = false
403
+ let wasRecording = isRecording
347
404
  isRecording = false
405
+ if wasRecording {
406
+ ShortcutRecordingState.shared.endRecording()
407
+ }
348
408
  updateTitle()
349
409
  ShortcutSummaryState.shared.refresh()
350
410
  }
@@ -80,8 +80,10 @@ final class AgentCommandTests: XCTestCase {
80
80
  "AGENTCLI_PACKAGE_SOURCE": "agent-cli",
81
81
  "AGENTCLI_AGENT_CLI": "/tmp/agentcli-test-support/bin/agent-cli",
82
82
  "AGENT_CLI_CONFIG_HOME": "/tmp/agentcli-test-support/config",
83
+ "AGENTCLI_UV_PATH": "/custom/uv",
83
84
  "UV_TOOL_BIN_DIR": "/tmp/agentcli-test-support/bin",
84
85
  "PATH": "/custom/bin",
86
+ "SHELL": "/no/such/shell",
85
87
  ],
86
88
  userDefaults: defaults
87
89
  )
@@ -95,9 +97,37 @@ final class AgentCommandTests: XCTestCase {
95
97
  XCTAssertNil(runtime.commandEnvironment()["AGENTCLI_PACKAGE_SOURCE"])
96
98
  XCTAssertNil(runtime.commandEnvironment()["AGENT_CLI_CONFIG_HOME"])
97
99
  XCTAssertNil(runtime.commandEnvironment()["UV_TOOL_BIN_DIR"])
100
+ XCTAssertEqual(runtime.commandEnvironment()["AGENTCLI_UV_PATH"], "/custom/uv")
98
101
  XCTAssertTrue(runtime.commandEnvironment()["PATH"]?.contains("/custom/bin") == true)
99
102
  }
100
103
 
104
+ func testUserInstalledCLIPathUsesLoginShellPathAndCommonUvBins() {
105
+ let defaults = UserDefaults(suiteName: "AgentCLITests.user-runtime-path")!
106
+ defaults.removePersistentDomain(forName: "AgentCLITests.user-runtime-path")
107
+ defaults.set(true, forKey: RuntimeSettings.useUserInstalledAgentCLIKey)
108
+ let runtime = AgentRuntime(
109
+ environment: [
110
+ "AGENTCLI_APP_SUPPORT_DIR": "/tmp/agentcli-test-support",
111
+ "PATH": "/usr/bin:/bin",
112
+ "SHELL": "/no/such/shell",
113
+ ],
114
+ userDefaults: defaults
115
+ )
116
+
117
+ let shellPath = "/Users/example/.dotbins/macos/arm64/bin:/usr/bin"
118
+ let path = runtime.userInstalledCLIPath(
119
+ existingPATH: "/usr/bin:/bin",
120
+ loginShellPATH: shellPath
121
+ )
122
+ let components = path.split(separator: ":").map(String.init)
123
+ let home = FileManager.default.homeDirectoryForCurrentUser.path
124
+
125
+ XCTAssertEqual(components.first, "/Users/example/.dotbins/macos/arm64/bin")
126
+ XCTAssertTrue(components.contains("\(home)/.local/bin"))
127
+ XCTAssertTrue(components.contains("\(home)/.cargo/bin"))
128
+ XCTAssertEqual(components.filter { $0 == "/usr/bin" }.count, 1)
129
+ }
130
+
101
131
  @MainActor
102
132
  func testStartupWarmUpBootstrapsTranscriptionOnce() {
103
133
  let recorder = BootstrapRecorder()
@@ -209,6 +209,27 @@ class TestServiceConfig:
209
209
 
210
210
  assert result == bundled_uv
211
211
 
212
+ def test_find_uv_prefers_explicit_uv_path(
213
+ self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
214
+ ) -> None:
215
+ """Users can override uv discovery with AGENTCLI_UV_PATH."""
216
+ explicit_uv = tmp_path / "explicit" / "uv"
217
+ explicit_uv.parent.mkdir()
218
+ explicit_uv.touch()
219
+ explicit_uv.chmod(0o755)
220
+
221
+ bundled_uv = tmp_path / "bundled" / "uv"
222
+ bundled_uv.parent.mkdir()
223
+ bundled_uv.touch()
224
+ bundled_uv.chmod(0o755)
225
+
226
+ monkeypatch.setenv("AGENTCLI_UV_PATH", str(explicit_uv))
227
+ monkeypatch.setenv("AGENTCLI_BUNDLED_UV", str(bundled_uv))
228
+
229
+ result = find_uv()
230
+
231
+ assert result == explicit_uv
232
+
212
233
  def test_find_uv_not_found(self) -> None:
213
234
  """Test find_uv returns None when uv is not found."""
214
235
  # Use paths that definitely don't exist
@@ -225,6 +246,28 @@ class TestServiceConfig:
225
246
  assert success is True
226
247
  assert "successfully" in msg
227
248
 
249
+ @patch("subprocess.run")
250
+ def test_install_uv_pipes_binary_curl_output_to_shell(self, mock_run: MagicMock) -> None:
251
+ """Test uv installer output can be piped to sh as bytes."""
252
+
253
+ def fake_run(args: list[str], **kwargs: object) -> subprocess.CompletedProcess[bytes]:
254
+ if args[0] == "curl":
255
+ return subprocess.CompletedProcess(args, 0, stdout=b"echo installing uv\n")
256
+ if args == ["sh"]:
257
+ if kwargs.get("text") is True and isinstance(kwargs.get("input"), bytes):
258
+ msg = "'bytes' object has no attribute 'encode'"
259
+ raise AttributeError(msg)
260
+ return subprocess.CompletedProcess(args, 0, stdout=b"", stderr=b"")
261
+ msg = f"unexpected command: {args}"
262
+ raise AssertionError(msg)
263
+
264
+ mock_run.side_effect = fake_run
265
+
266
+ success, msg = install_uv()
267
+
268
+ assert success is True
269
+ assert "successfully" in msg
270
+
228
271
  @patch("subprocess.run")
229
272
  def test_install_uv_failure(self, mock_run: MagicMock) -> None:
230
273
  """Test failed uv installation."""
@@ -184,6 +184,9 @@ def test_macos_app_can_use_user_installed_agent_cli() -> None:
184
184
  assert "private func userInstalledCLIEnvironment() -> [String: String]" in source
185
185
  assert "private static let appPrivateEnvironmentKeys" in source
186
186
  assert "environment.removeValue(forKey: key)" in source
187
+ assert "AGENTCLI_UV_PATH" in source
188
+ assert "loginShellPATH" in source
189
+ assert 'appendingPathComponent(".cargo/bin"' in source
187
190
  assert "private func bundledCLIEnvironment() -> [String: String]" in source
188
191
  assert "AGENT_CLI_CONFIG_HOME" in source
189
192
  assert "UV_TOOL_BIN_DIR" in source
@@ -542,9 +545,19 @@ def test_macos_app_uses_fn_aware_event_tap_for_transcription_shortcuts() -> None
542
545
  assert "CGEventType.flagsChanged" in source
543
546
  assert "CGEventFlags.maskSecondaryFn" in source
544
547
  assert "handleFunctionAwareHotkey" in source
545
- assert "KeyboardShortcuts.onKeyUp(for: .toggleTranscription)" not in source
546
- assert "KeyboardShortcuts.onKeyDown(for: .holdToTranscribe)" not in source
547
- assert "KeyboardShortcuts.onKeyUp(for: .holdToTranscribe)" not in source
548
+ assert "usesFunctionShortcut(shortcut)" in source
549
+
550
+
551
+ def test_macos_app_preserves_carbon_transcription_hotkeys_without_fn() -> None:
552
+ """Non-Fn transcription shortcuts should work without Accessibility event-tap permission."""
553
+ source = swift_source()
554
+
555
+ assert "registerStandardTranscriptionHotkeys(runner: runner)" in source
556
+ assert "KeyboardShortcuts.onKeyUp(for: .toggleTranscription)" in source
557
+ assert "KeyboardShortcuts.onKeyDown(for: .holdToTranscribe)" in source
558
+ assert "KeyboardShortcuts.onKeyUp(for: .holdToTranscribe)" in source
559
+ assert "guard let shortcut = KeyboardShortcuts.getShortcut(for: .toggleTranscription)" in source
560
+ assert "!self.usesFunctionShortcut(shortcut)" in source
548
561
 
549
562
 
550
563
  def test_macos_app_disambiguates_fn_hold_from_fn_space_toggle() -> None:
@@ -834,6 +847,28 @@ def test_macos_app_registers_configurable_native_global_hotkeys() -> None:
834
847
  assert ".voiceEdit" in source
835
848
 
836
849
 
850
+ def test_macos_app_pauses_global_hotkeys_while_recording_shortcuts() -> None:
851
+ """Recording a shortcut should not dispatch any already-configured shortcuts."""
852
+ source = swift_source()
853
+
854
+ assert "ShortcutRecordingState.shared.beginRecording()" in source
855
+ assert "ShortcutRecordingState.shared.endRecording()" in source
856
+ assert "guard !ShortcutRecordingState.shared.isRecording else" in source
857
+ assert "if ShortcutRecordingState.shared.isRecording" in source
858
+ assert "cancelPendingHoldToTranscribe()" in source
859
+
860
+
861
+ def test_macos_app_records_fn_chords_before_bare_fn() -> None:
862
+ """Fn should not be saved as a shortcut until the recorder knows no chord follows."""
863
+ source = swift_source()
864
+
865
+ assert "pendingFunctionShortcut = true" in source
866
+ assert "pendingFunctionShortcut = false" in source
867
+ assert "captureBareFunctionShortcut()" in source
868
+ assert "event.modifierFlags.contains(.function)" in source
869
+ assert "case kVK_Function:" in source
870
+
871
+
837
872
  def test_macos_app_shows_actual_persisted_shortcuts_and_can_reset_them() -> None:
838
873
  """The menu should reflect stored shortcuts instead of claiming static defaults."""
839
874
  source = swift_source()
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes