agent-cli 0.95.3__tar.gz → 0.95.5__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 (427) hide show
  1. {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/workflows/release.yml +2 -0
  2. {agent_cli-0.95.3 → agent_cli-0.95.5}/PKG-INFO +1 -1
  3. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/transcribe.py +1 -0
  4. {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/README.md +14 -6
  5. agent_cli-0.95.5/macos/AgentCLI/Resources/dmg-background.svg +8 -0
  6. {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +41 -6
  7. {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +21 -1
  8. {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +164 -25
  9. {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +214 -10
  10. {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +2 -0
  11. agent_cli-0.95.5/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +283 -0
  12. agent_cli-0.95.5/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +173 -0
  13. agent_cli-0.95.5/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +115 -0
  14. agent_cli-0.95.5/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +5 -0
  15. {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +42 -0
  16. agent_cli-0.95.5/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +9 -0
  17. agent_cli-0.95.5/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +137 -0
  18. agent_cli-0.95.5/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +37 -0
  19. agent_cli-0.95.5/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +34 -0
  20. {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/build-macos-app.sh +159 -7
  21. {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/test-macos-app-e2e.sh +9 -0
  22. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_transcribe.py +13 -0
  23. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_diarize_live_session.py +5 -1
  24. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_macos_app.py +201 -20
  25. agent_cli-0.95.3/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -32
  26. agent_cli-0.95.3/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +0 -16
  27. {agent_cli-0.95.3 → agent_cli-0.95.5}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
  28. {agent_cli-0.95.3 → agent_cli-0.95.5}/.claude/skills/agent-cli-dev/examples.md +0 -0
  29. {agent_cli-0.95.3 → agent_cli-0.95.5}/.claude-plugin/README.md +0 -0
  30. {agent_cli-0.95.3 → agent_cli-0.95.5}/.claude-plugin/marketplace.json +0 -0
  31. {agent_cli-0.95.3 → agent_cli-0.95.5}/.claude-plugin/plugin.json +0 -0
  32. {agent_cli-0.95.3 → agent_cli-0.95.5}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
  33. {agent_cli-0.95.3 → agent_cli-0.95.5}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
  34. {agent_cli-0.95.3 → agent_cli-0.95.5}/.cursorrules +0 -0
  35. {agent_cli-0.95.3 → agent_cli-0.95.5}/.dockerignore +0 -0
  36. {agent_cli-0.95.3 → agent_cli-0.95.5}/.env.example +0 -0
  37. {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/logo.svg +0 -0
  38. {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/release-drafter.yml +0 -0
  39. {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/renovate.json +0 -0
  40. {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/scripts/check_extras_sync.py +0 -0
  41. {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/scripts/check_plugin_skill_sync.py +0 -0
  42. {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/scripts/sync_extras.py +0 -0
  43. {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/scripts/sync_requirements.py +0 -0
  44. {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/workflows/automerge.yml +0 -0
  45. {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/workflows/docker.yml +0 -0
  46. {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/workflows/docs.yml +0 -0
  47. {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/workflows/markdown-code-runner.yml +0 -0
  48. {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/workflows/pytest.yml +0 -0
  49. {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/workflows/release-drafter.yml +0 -0
  50. {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/workflows/toc.yaml +0 -0
  51. {agent_cli-0.95.3 → agent_cli-0.95.5}/.gitignore +0 -0
  52. {agent_cli-0.95.3 → agent_cli-0.95.5}/.jscpd.json +0 -0
  53. {agent_cli-0.95.3 → agent_cli-0.95.5}/.pre-commit-config.yaml +0 -0
  54. {agent_cli-0.95.3 → agent_cli-0.95.5}/.prompts/docs-review.md +0 -0
  55. {agent_cli-0.95.3 → agent_cli-0.95.5}/.prompts/pr-review.md +0 -0
  56. {agent_cli-0.95.3 → agent_cli-0.95.5}/CLAUDE.md +0 -0
  57. {agent_cli-0.95.3 → agent_cli-0.95.5}/LICENSE +0 -0
  58. {agent_cli-0.95.3 → agent_cli-0.95.5}/LLAMA_SERVER_USAGE.md +0 -0
  59. {agent_cli-0.95.3 → agent_cli-0.95.5}/README.md +0 -0
  60. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/__init__.py +0 -0
  61. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/__main__.py +0 -0
  62. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_extras.json +0 -0
  63. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/.gitkeep +0 -0
  64. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/audio.txt +0 -0
  65. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/diarization.txt +0 -0
  66. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/faster-whisper.txt +0 -0
  67. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/kokoro.txt +0 -0
  68. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/llm.txt +0 -0
  69. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/memory.txt +0 -0
  70. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/mlx-whisper.txt +0 -0
  71. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/piper.txt +0 -0
  72. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/rag.txt +0 -0
  73. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/server.txt +0 -0
  74. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/speed.txt +0 -0
  75. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/vad.txt +0 -0
  76. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/vectordb.txt +0 -0
  77. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/whisper-transformers.txt +0 -0
  78. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/wyoming.txt +0 -0
  79. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_tools.py +0 -0
  80. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/__init__.py +0 -0
  81. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/_voice_agent_common.py +0 -0
  82. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/assistant.py +0 -0
  83. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/autocorrect.py +0 -0
  84. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/chat.py +0 -0
  85. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/diarize_live_session.py +0 -0
  86. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/memory/__init__.py +0 -0
  87. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/memory/add.py +0 -0
  88. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/memory/proxy.py +0 -0
  89. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/rag_proxy.py +0 -0
  90. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/speak.py +0 -0
  91. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/speakers.py +0 -0
  92. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/transcribe_live.py +0 -0
  93. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/voice_edit.py +0 -0
  94. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/api.py +0 -0
  95. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/cli.py +0 -0
  96. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/config.py +0 -0
  97. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/config_cmd.py +0 -0
  98. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/constants.py +0 -0
  99. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/__init__.py +0 -0
  100. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/alignment.py +0 -0
  101. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/audio.py +0 -0
  102. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/audio_format.py +0 -0
  103. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/chroma.py +0 -0
  104. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/deps.py +0 -0
  105. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/diarization.py +0 -0
  106. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/openai_proxy.py +0 -0
  107. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/process.py +0 -0
  108. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/reranker.py +0 -0
  109. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/speaker_identity.py +0 -0
  110. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/sse.py +0 -0
  111. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/transcription_logger.py +0 -0
  112. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/utils.py +0 -0
  113. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/vad.py +0 -0
  114. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/watch.py +0 -0
  115. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/daemon/__init__.py +0 -0
  116. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/daemon/cli.py +0 -0
  117. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/__init__.py +0 -0
  118. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/_branch_name.py +0 -0
  119. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/_config.py +0 -0
  120. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/_output.py +0 -0
  121. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/cleanup.py +0 -0
  122. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/cli.py +0 -0
  123. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/__init__.py +0 -0
  124. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/aider.py +0 -0
  125. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/base.py +0 -0
  126. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/claude.py +0 -0
  127. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/codex.py +0 -0
  128. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
  129. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/copilot.py +0 -0
  130. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
  131. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/gemini.py +0 -0
  132. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/opencode.py +0 -0
  133. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/registry.py +0 -0
  134. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/__init__.py +0 -0
  135. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/base.py +0 -0
  136. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/cursor.py +0 -0
  137. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/emacs.py +0 -0
  138. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/jetbrains.py +0 -0
  139. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/nano.py +0 -0
  140. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/neovim.py +0 -0
  141. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/registry.py +0 -0
  142. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/sublime.py +0 -0
  143. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/vim.py +0 -0
  144. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/vscode.py +0 -0
  145. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/zed.py +0 -0
  146. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/hooks.py +0 -0
  147. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/launch.py +0 -0
  148. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/project.py +0 -0
  149. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/registry.py +0 -0
  150. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/skill/SKILL.md +0 -0
  151. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/skill/examples.md +0 -0
  152. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/__init__.py +0 -0
  153. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/apple_terminal.py +0 -0
  154. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/base.py +0 -0
  155. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/gnome.py +0 -0
  156. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/iterm2.py +0 -0
  157. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/kitty.py +0 -0
  158. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/registry.py +0 -0
  159. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/tmux.py +0 -0
  160. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/warp.py +0 -0
  161. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/zellij.py +0 -0
  162. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/worktree.py +0 -0
  163. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/docs_gen.py +0 -0
  164. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/example-config.toml +0 -0
  165. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/install/__init__.py +0 -0
  166. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/install/common.py +0 -0
  167. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/install/extras.py +0 -0
  168. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/install/hotkeys.py +0 -0
  169. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/install/launchd.py +0 -0
  170. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/install/service_config.py +0 -0
  171. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/install/services.py +0 -0
  172. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/install/systemd.py +0 -0
  173. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/__init__.py +0 -0
  174. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_files.py +0 -0
  175. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_filters.py +0 -0
  176. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_git.py +0 -0
  177. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_indexer.py +0 -0
  178. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_ingest.py +0 -0
  179. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_persistence.py +0 -0
  180. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_prompt.py +0 -0
  181. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_retrieval.py +0 -0
  182. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_store.py +0 -0
  183. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_streaming.py +0 -0
  184. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_tasks.py +0 -0
  185. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/api.py +0 -0
  186. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/client.py +0 -0
  187. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/engine.py +0 -0
  188. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/entities.py +0 -0
  189. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/models.py +0 -0
  190. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/opts.py +0 -0
  191. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/py.typed +0 -0
  192. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/__init__.py +0 -0
  193. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/_indexer.py +0 -0
  194. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/_indexing.py +0 -0
  195. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/_prompt.py +0 -0
  196. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/_retriever.py +0 -0
  197. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/_store.py +0 -0
  198. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/_utils.py +0 -0
  199. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/api.py +0 -0
  200. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/client.py +0 -0
  201. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/engine.py +0 -0
  202. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/models.py +0 -0
  203. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/.runtime/.gitkeep +0 -0
  204. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/__init__.py +0 -0
  205. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
  206. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
  207. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
  208. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
  209. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
  210. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
  211. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
  212. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
  213. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
  214. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
  215. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
  216. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
  217. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
  218. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
  219. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/run-openwakeword.sh +0 -0
  220. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
  221. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/setup-linux.sh +0 -0
  222. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
  223. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/setup-macos.sh +0 -0
  224. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/setup-windows.ps1 +0 -0
  225. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
  226. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/start-all-services.sh +0 -0
  227. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/__init__.py +0 -0
  228. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/cli.py +0 -0
  229. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/common.py +0 -0
  230. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/model_manager.py +0 -0
  231. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/model_registry.py +0 -0
  232. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/proxy/__init__.py +0 -0
  233. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/proxy/api.py +0 -0
  234. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/streaming.py +0 -0
  235. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/tts/__init__.py +0 -0
  236. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/tts/api.py +0 -0
  237. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/tts/backends/__init__.py +0 -0
  238. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/tts/backends/base.py +0 -0
  239. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/tts/backends/kokoro.py +0 -0
  240. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/tts/backends/piper.py +0 -0
  241. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/tts/model_manager.py +0 -0
  242. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/tts/model_registry.py +0 -0
  243. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/tts/wyoming_handler.py +0 -0
  244. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/__init__.py +0 -0
  245. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/api.py +0 -0
  246. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/backends/__init__.py +0 -0
  247. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/backends/base.py +0 -0
  248. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
  249. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/backends/mlx.py +0 -0
  250. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/backends/transformers.py +0 -0
  251. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/languages.py +0 -0
  252. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/model_manager.py +0 -0
  253. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/model_registry.py +0 -0
  254. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/wyoming_handler.py +0 -0
  255. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/services/__init__.py +0 -0
  256. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/services/_wyoming_utils.py +0 -0
  257. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/services/asr.py +0 -0
  258. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/services/llm.py +0 -0
  259. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/services/tts.py +0 -0
  260. {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/services/wake_word.py +0 -0
  261. {agent_cli-0.95.3 → agent_cli-0.95.5}/docker/docker-compose.yml +0 -0
  262. {agent_cli-0.95.3 → agent_cli-0.95.5}/docker/memory-proxy.Dockerfile +0 -0
  263. {agent_cli-0.95.3 → agent_cli-0.95.5}/docker/rag-proxy.Dockerfile +0 -0
  264. {agent_cli-0.95.3 → agent_cli-0.95.5}/docker/transcribe-proxy.Dockerfile +0 -0
  265. {agent_cli-0.95.3 → agent_cli-0.95.5}/docker/tts.Dockerfile +0 -0
  266. {agent_cli-0.95.3 → agent_cli-0.95.5}/docker/whisper.Dockerfile +0 -0
  267. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/CNAME +0 -0
  268. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/architecture/index.md +0 -0
  269. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/architecture/memory.md +0 -0
  270. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/architecture/rag.md +0 -0
  271. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/assistant.md +0 -0
  272. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/autocorrect.md +0 -0
  273. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/chat.md +0 -0
  274. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/config.md +0 -0
  275. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/daemon.md +0 -0
  276. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/dev.md +0 -0
  277. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/diarize-live-session.md +0 -0
  278. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/index.md +0 -0
  279. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/install-extras.md +0 -0
  280. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/install-hotkeys.md +0 -0
  281. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/install-services.md +0 -0
  282. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/memory.md +0 -0
  283. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/rag-proxy.md +0 -0
  284. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/server/index.md +0 -0
  285. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/server/transcribe-proxy.md +0 -0
  286. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/server/tts.md +0 -0
  287. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/server/whisper.md +0 -0
  288. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/speak.md +0 -0
  289. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/speakers.md +0 -0
  290. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/start-services.md +0 -0
  291. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/transcribe-live.md +0 -0
  292. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/transcribe.md +0 -0
  293. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/voice-edit.md +0 -0
  294. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/configuration.md +0 -0
  295. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/getting-started.md +0 -0
  296. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/iOS_Shortcut_Guide.md +0 -0
  297. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/index.md +0 -0
  298. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/installation/docker.md +0 -0
  299. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/installation/index.md +0 -0
  300. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/installation/linux.md +0 -0
  301. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/installation/macos.md +0 -0
  302. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/installation/nixos.md +0 -0
  303. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/installation/windows.md +0 -0
  304. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/logo-avatar.svg +0 -0
  305. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/logo-clean.svg +0 -0
  306. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
  307. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/run_markdown_code_runner.py +0 -0
  308. {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/system-integration.md +0 -0
  309. {agent_cli-0.95.3 → agent_cli-0.95.5}/example.agent-cli-config.toml +0 -0
  310. {agent_cli-0.95.3 → agent_cli-0.95.5}/justfile +0 -0
  311. {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Package.resolved +0 -0
  312. {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Package.swift +0 -0
  313. {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
  314. {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Resources/Info.plist +0 -0
  315. {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
  316. {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
  317. {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
  318. {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
  319. {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
  320. {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
  321. {agent_cli-0.95.3 → agent_cli-0.95.5}/pyproject.toml +0 -0
  322. {agent_cli-0.95.3 → agent_cli-0.95.5}/reddit.md +0 -0
  323. {agent_cli-0.95.3 → agent_cli-0.95.5}/shell.nix +0 -0
  324. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/__init__.py +0 -0
  325. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/__init__.py +0 -0
  326. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_fix_my_text.py +0 -0
  327. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_interactive.py +0 -0
  328. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_interactive_extra.py +0 -0
  329. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_memory_add.py +0 -0
  330. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_speak.py +0 -0
  331. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_speak_e2e.py +0 -0
  332. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_speakers.py +0 -0
  333. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_transcribe_agent.py +0 -0
  334. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_transcribe_e2e.py +0 -0
  335. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_transcribe_live.py +0 -0
  336. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_transcribe_recovery.py +0 -0
  337. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_tts_common.py +0 -0
  338. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_tts_common_extra.py +0 -0
  339. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_voice_agent_common.py +0 -0
  340. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_voice_edit.py +0 -0
  341. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_voice_edit_e2e.py +0 -0
  342. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_wake_word_assistant.py +0 -0
  343. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/conftest.py +0 -0
  344. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/core/__init__.py +0 -0
  345. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/core/test_audio.py +0 -0
  346. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/core/test_audio_format.py +0 -0
  347. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/core/test_chroma.py +0 -0
  348. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/core/test_sse.py +0 -0
  349. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/core/test_vad.py +0 -0
  350. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/core/test_watch.py +0 -0
  351. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/__init__.py +0 -0
  352. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_cleanup.py +0 -0
  353. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_cli.py +0 -0
  354. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_coding_agents.py +0 -0
  355. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_editors.py +0 -0
  356. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_hooks.py +0 -0
  357. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_launch.py +0 -0
  358. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_project.py +0 -0
  359. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_terminals.py +0 -0
  360. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_verification.py +0 -0
  361. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_worktree.py +0 -0
  362. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/install/__init__.py +0 -0
  363. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/install/test_extras.py +0 -0
  364. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/install/test_launchd.py +0 -0
  365. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/__init__.py +0 -0
  366. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_api_health.py +0 -0
  367. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_api_integration_liveish.py +0 -0
  368. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_client.py +0 -0
  369. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_engine.py +0 -0
  370. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_files.py +0 -0
  371. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_filters.py +0 -0
  372. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_git_integration.py +0 -0
  373. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_indexer.py +0 -0
  374. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_memory_integration.py +0 -0
  375. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_proxy_passthrough.py +0 -0
  376. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_store.py +0 -0
  377. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_utils.py +0 -0
  378. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/mocks/__init__.py +0 -0
  379. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/mocks/audio.py +0 -0
  380. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/mocks/llm.py +0 -0
  381. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/mocks/wyoming.py +0 -0
  382. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/__init__.py +0 -0
  383. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_api.py +0 -0
  384. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_engine.py +0 -0
  385. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_history.py +0 -0
  386. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_indexer.py +0 -0
  387. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_indexing.py +0 -0
  388. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_rag_client.py +0 -0
  389. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_rag_integration_liveish.py +0 -0
  390. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_rag_proxy_passthrough.py +0 -0
  391. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_retriever.py +0 -0
  392. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_store.py +0 -0
  393. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_utils.py +0 -0
  394. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_alignment.py +0 -0
  395. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_api.py +0 -0
  396. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_api_integration.py +0 -0
  397. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_asr.py +0 -0
  398. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_asr_recovery.py +0 -0
  399. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_audio_e2e.py +0 -0
  400. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_cli.py +0 -0
  401. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_config.py +0 -0
  402. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_config_cmd.py +0 -0
  403. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_daemon.py +0 -0
  404. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_diarization.py +0 -0
  405. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_docs_gen.py +0 -0
  406. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_env_vars.py +0 -0
  407. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_faster_whisper_backend.py +0 -0
  408. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_json_output.py +0 -0
  409. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_llm.py +0 -0
  410. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_llm_gemini.py +0 -0
  411. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_memory_tools.py +0 -0
  412. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_mlx_backend.py +0 -0
  413. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_process_manager.py +0 -0
  414. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_requires_extras.py +0 -0
  415. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_server_streaming.py +0 -0
  416. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_server_tts.py +0 -0
  417. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_server_whisper.py +0 -0
  418. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_services.py +0 -0
  419. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_speaker_identity.py +0 -0
  420. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_tools.py +0 -0
  421. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_transformers_backend.py +0 -0
  422. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_tts.py +0 -0
  423. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_utils.py +0 -0
  424. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_wake_word.py +0 -0
  425. {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_wyoming_utils.py +0 -0
  426. {agent_cli-0.95.3 → agent_cli-0.95.5}/uv.lock +0 -0
  427. {agent_cli-0.95.3 → agent_cli-0.95.5}/zensical.toml +0 -0
@@ -56,6 +56,8 @@ jobs:
56
56
  APPLE_ID: ${{ secrets.APPLE_ID }}
57
57
  APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
58
58
  APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
59
+ APP_VERSION: ${{ github.event.release.tag_name }}
60
+ BUILD_VERSION: ${{ github.run_number }}
59
61
  run: NOTARIZE=1 macos/build-macos-app.sh --dmg
60
62
  - name: Upload macOS app to GitHub Release
61
63
  env:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-cli
3
- Version: 0.95.3
3
+ Version: 0.95.5
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>
@@ -252,6 +252,7 @@ def log_transcription(
252
252
  }
253
253
 
254
254
  # Append to log file
255
+ log_file.parent.mkdir(parents=True, exist_ok=True)
255
256
  with log_file.open("a", encoding="utf-8") as f:
256
257
  f.write(json.dumps(log_entry) + "\n")
257
258
 
@@ -1,9 +1,12 @@
1
1
  # Agent CLI macOS app
2
2
 
3
3
  This directory contains a native SwiftUI menu bar wrapper for `agent-cli`.
4
- The app does not reimplement any agent behavior. It bundles `uv`, installs a
5
- private `agent-cli[audio,llm]` tool into the user's Application Support
6
- directory on first use, and shells out to that private executable.
4
+ The app does not reimplement any agent behavior. By default, it bundles `uv`,
5
+ installs a private `agent-cli[audio,llm]` tool into the user's Application
6
+ Support directory on first use, and shells out to that private executable.
7
+ Users who already manage their own `agent-cli` install can enable
8
+ **Use User-Installed agent-cli** in Settings to run the `agent-cli` found on
9
+ PATH with their normal config instead.
7
10
 
8
11
  Transcription is the default zero-config path. The first transcription action
9
12
  installs and starts the local Whisper launchd daemon with
@@ -18,9 +21,14 @@ The packaged app registers native macOS global hotkeys itself:
18
21
  - `Cmd+Shift+A` autocorrects clipboard text
19
22
  - `Cmd+Shift+V` starts voice edit
20
23
 
21
- Choose **Keyboard Shortcuts...** from the menu bar app to change these
22
- shortcuts. The settings UI uses the `KeyboardShortcuts` Swift package for
23
- shortcut parsing, `UserDefaults` storage, and global key-up handlers.
24
+ Choose **Settings...** from the menu bar app to change these shortcuts, enable
25
+ **Start at Login**, or switch between the bundled runtime and a user-installed
26
+ `agent-cli`. The settings UI uses the `KeyboardShortcuts` Swift package for
27
+ shortcut parsing and `UserDefaults` storage. Transcription shortcuts are handled
28
+ by a small CGEvent tap so `Fn`, `Fn+Space`, and plain Space remain distinct; the
29
+ clipboard utility shortcuts still use `KeyboardShortcuts` global handlers. The
30
+ login option uses Apple's login item API for the main app bundle, so macOS may
31
+ require approval in System Settings → General → Login Items.
24
32
 
25
33
  ## Build
26
34
 
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="600" height="360" viewBox="0 0 600 360">
2
+ <rect width="600" height="360" fill="#f6f7f9"/>
3
+ <rect x="28" y="28" width="544" height="304" rx="24" fill="#ffffff" stroke="#d7dbe2"/>
4
+ <path d="M255 180h110" fill="none" stroke="#7b8494" stroke-width="10" stroke-linecap="round"/>
5
+ <path d="M335 140l40 40-40 40" fill="none" stroke="#7b8494" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"/>
6
+ <text x="300" y="78" text-anchor="middle" font-family="-apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif" font-size="24" font-weight="600" fill="#242933">Install Agent CLI</text>
7
+ <text x="300" y="112" text-anchor="middle" font-family="-apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif" font-size="15" fill="#596171">Drag AgentCLI.app to Applications</text>
8
+ </svg>
@@ -6,7 +6,10 @@ struct AgentCLIApp: App {
6
6
  @NSApplicationDelegateAdaptor(AppDelegate.self) private var appDelegate
7
7
  @Environment(\.openWindow) private var openWindow
8
8
  @StateObject private var runner = AgentCommandRunner.shared
9
+ @StateObject private var loginItemController = LoginItemController.shared
9
10
  @StateObject private var shortcutSummary = ShortcutSummaryState.shared
11
+ @AppStorage(RuntimeSettings.useUserInstalledAgentCLIKey)
12
+ private var useUserInstalledAgentCLI = false
10
13
 
11
14
  var body: some Scene {
12
15
  MenuBarExtra {
@@ -38,11 +41,40 @@ struct AgentCLIApp: App {
38
41
 
39
42
  Divider()
40
43
 
44
+ Menu {
45
+ let recentTranscriptions = RecentTranscriptionReader.recentTranscriptions()
46
+ if recentTranscriptions.isEmpty {
47
+ Text("No recent transcriptions")
48
+ } else {
49
+ ForEach(recentTranscriptions) { transcription in
50
+ Button {
51
+ runner.copyRecentTranscription(transcription)
52
+ } label: {
53
+ Label(transcription.menuTitle, systemImage: "doc.on.clipboard")
54
+ }
55
+ }
56
+ }
57
+ } label: {
58
+ Label("Recent Recordings", systemImage: "clock.arrow.circlepath")
59
+ }
60
+
61
+ Divider()
62
+
63
+ Button {
64
+ loginItemController.toggle()
65
+ } label: {
66
+ Label(
67
+ loginItemController.presentation.menuTitle,
68
+ systemImage: loginItemController.presentation.isEnabled ? "checkmark.circle" : "circle"
69
+ )
70
+ }
71
+ .disabled(!loginItemController.presentation.canToggle)
72
+
41
73
  Button {
42
74
  openWindow(id: "settings")
43
75
  NSApp.activate(ignoringOtherApps: true)
44
76
  } label: {
45
- Label("Keyboard Shortcuts...", systemImage: "command")
77
+ Label("Settings...", systemImage: "gearshape")
46
78
  }
47
79
 
48
80
  Menu {
@@ -55,7 +87,10 @@ struct AgentCLIApp: App {
55
87
  Button {
56
88
  runner.run(.installOrUpdateCLI)
57
89
  } label: {
58
- Label("Update CLI Runtime", systemImage: "arrow.down.circle")
90
+ Label(
91
+ useUserInstalledAgentCLI ? "Check User CLI" : "Update CLI Runtime",
92
+ systemImage: useUserInstalledAgentCLI ? "checkmark.circle" : "arrow.down.circle"
93
+ )
59
94
  }
60
95
 
61
96
  Button {
@@ -103,15 +138,15 @@ struct AgentCLIApp: App {
103
138
  Divider()
104
139
 
105
140
  Button {
106
- runner.openNotificationSettings()
141
+ runner.repairNotificationPermission()
107
142
  } label: {
108
- Label("Open Notification Settings", systemImage: "bell.badge")
143
+ Label("Fix Notification Permission...", systemImage: "bell.badge")
109
144
  }
110
145
 
111
146
  Button {
112
- runner.openAccessibilitySettings()
147
+ runner.resetAccessibilityPermission()
113
148
  } label: {
114
- Label("Open Accessibility Settings", systemImage: "figure.wave")
149
+ Label("Reset Accessibility Permission...", systemImage: "figure.wave")
115
150
  }
116
151
 
117
152
  Button {
@@ -3,12 +3,14 @@ import Foundation
3
3
  enum AgentBootstrapRequirement: Equatable {
4
4
  case cliRuntime
5
5
  case transcription
6
+ case transcriptionModel
6
7
  }
7
8
 
8
9
  struct AgentCommand {
9
10
  let identifier: String
10
11
  let title: String
11
12
  let arguments: [String]
13
+ let appliesTranscriptionExtraInstructions: Bool
12
14
  let forceBootstrap: Bool
13
15
  let bootstrapRequirement: AgentBootstrapRequirement
14
16
  let showsRecordingIndicator: Bool
@@ -20,6 +22,7 @@ struct AgentCommand {
20
22
  identifier: String,
21
23
  title: String,
22
24
  arguments: [String],
25
+ appliesTranscriptionExtraInstructions: Bool = false,
23
26
  forceBootstrap: Bool = false,
24
27
  bootstrapRequirement: AgentBootstrapRequirement = .cliRuntime,
25
28
  showsRecordingIndicator: Bool = false,
@@ -30,6 +33,7 @@ struct AgentCommand {
30
33
  self.identifier = identifier
31
34
  self.title = title
32
35
  self.arguments = arguments
36
+ self.appliesTranscriptionExtraInstructions = appliesTranscriptionExtraInstructions
33
37
  self.forceBootstrap = forceBootstrap
34
38
  self.bootstrapRequirement = bootstrapRequirement
35
39
  self.showsRecordingIndicator = showsRecordingIndicator
@@ -38,10 +42,26 @@ struct AgentCommand {
38
42
  self.finishNotificationTitle = finishNotificationTitle
39
43
  }
40
44
 
45
+ func resolvedArguments(extraInstructions: String?) -> [String] {
46
+ guard appliesTranscriptionExtraInstructions else { return arguments }
47
+
48
+ let trimmedInstructions = extraInstructions?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
49
+ guard !trimmedInstructions.isEmpty else { return arguments }
50
+
51
+ return arguments + ["--extra-instructions", trimmedInstructions]
52
+ }
53
+
41
54
  static let toggleTranscription = AgentCommand(
42
55
  identifier: "transcribe",
43
56
  title: "Toggle Transcription",
44
- arguments: ["transcribe", "--toggle", "--quiet"],
57
+ arguments: [
58
+ "transcribe",
59
+ "--toggle",
60
+ "--quiet",
61
+ "--transcription-log",
62
+ RecentTranscriptionReader.defaultLogPath,
63
+ ],
64
+ appliesTranscriptionExtraInstructions: true,
45
65
  bootstrapRequirement: .transcription,
46
66
  showsRecordingIndicator: true,
47
67
  startNotificationTitle: "Transcription Started",
@@ -1,4 +1,5 @@
1
1
  import AppKit
2
+ import ApplicationServices
2
3
  import Foundation
3
4
  import SwiftUI
4
5
  import UserNotifications
@@ -18,6 +19,8 @@ private enum HoldTranscriptionState {
18
19
  }
19
20
  }
20
21
 
22
+ typealias AgentBootstrap = @Sendable (AgentBootstrapRequirement, Bool) -> CommandResult
23
+
21
24
  @MainActor
22
25
  final class AgentCommandRunner: ObservableObject {
23
26
  static let shared = AgentCommandRunner()
@@ -29,10 +32,12 @@ final class AgentCommandRunner: ObservableObject {
29
32
  @Published private var activeCommandCount = 0
30
33
  private var recordingIndicator = RecordingIndicatorController()
31
34
  private let pasteController: TranscriptPasteController
35
+ private let bootstrap: AgentBootstrap
32
36
  private var pendingStopRecordingCommands: Set<String> = []
33
37
  private var holdTranscriptionState: HoldTranscriptionState = .idle
34
38
  private var holdToTranscribePasteTarget: FocusedTextTarget?
35
39
  private var pasteAfterRecordingCommands: Set<String> = []
40
+ private var hasStartedTranscriptionWarmUp = false
36
41
 
37
42
  var isRunning: Bool {
38
43
  activeCommandCount > 0
@@ -51,10 +56,14 @@ final class AgentCommandRunner: ObservableObject {
51
56
  return Self.compactMenuStatus(statusMessage)
52
57
  }
53
58
 
54
- private init(
55
- pasteController: TranscriptPasteController = TranscriptPasteController()
59
+ init(
60
+ pasteController: TranscriptPasteController = TranscriptPasteController(),
61
+ bootstrap: @escaping AgentBootstrap = { requirement, force in
62
+ AgentRuntime.shared.ensureReady(for: requirement, force: force)
63
+ }
56
64
  ) {
57
65
  self.pasteController = pasteController
66
+ self.bootstrap = bootstrap
58
67
  hasLastError = FileManager.default.fileExists(atPath: AgentRuntime.shared.lastErrorURL.path)
59
68
  }
60
69
 
@@ -68,22 +77,58 @@ final class AgentCommandRunner: ObservableObject {
68
77
  URL(string: "x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility")!
69
78
  ]
70
79
 
71
- func beginHoldToTranscribe() {
80
+ func warmUpTranscription() {
81
+ guard !hasStartedTranscriptionWarmUp else { return }
82
+ hasStartedTranscriptionWarmUp = true
83
+
84
+ activeCommandCount += 1
85
+ if statusMessage == "Ready" {
86
+ statusMessage = "Preparing voice service..."
87
+ }
88
+
89
+ let bootstrap = self.bootstrap
90
+ DispatchQueue.global(qos: .utility).async {
91
+ let result = bootstrap(.transcriptionModel, false)
92
+
93
+ Task { @MainActor in
94
+ self.activeCommandCount = max(0, self.activeCommandCount - 1)
95
+ if !result.output.isEmpty {
96
+ self.lastOutput = result.output
97
+ }
98
+
99
+ if result.exitCode == 0 {
100
+ if self.statusMessage == "Preparing voice service..." {
101
+ self.statusMessage = "Ready"
102
+ }
103
+ return
104
+ }
105
+
106
+ self.recordFailure(title: "Startup Voice Service Warm-Up", result: result)
107
+ self.statusMessage = result.output.isEmpty
108
+ ? "Voice service warm-up failed with exit code \(result.exitCode)"
109
+ : "Voice service warm-up failed: \(Self.summarize(result.output))"
110
+ }
111
+ }
112
+ }
113
+
114
+ @discardableResult
115
+ func beginHoldToTranscribe() -> Bool {
72
116
  guard holdTranscriptionState == .idle else {
73
117
  if holdTranscriptionState.isFinishing {
74
118
  statusMessage = "Finishing previous hold-to-transcribe request"
75
119
  }
76
- return
120
+ return false
77
121
  }
78
122
  guard !recordingIndicator.isRecordingCommand(.toggleTranscription), !isStopPending(for: .toggleTranscription) else {
79
123
  statusMessage = "Transcription is already recording"
80
- return
124
+ return false
81
125
  }
82
126
 
83
127
  holdTranscriptionState = .recording
84
128
  holdToTranscribePasteTarget = FocusedTextTarget.capture()
85
129
  pasteAfterRecordingCommands.insert(AgentCommand.toggleTranscription.identifier)
86
130
  run(.toggleTranscription)
131
+ return true
87
132
  }
88
133
 
89
134
  func endHoldToTranscribe() {
@@ -100,6 +145,18 @@ final class AgentCommandRunner: ObservableObject {
100
145
  stopHeldTranscriptionWhenReady()
101
146
  }
102
147
 
148
+ @discardableResult
149
+ func stopTranscriptionFromFunctionKeyIfNeeded() -> Bool {
150
+ guard holdTranscriptionState == .idle,
151
+ recordingIndicator.isRecordingCommand(.toggleTranscription),
152
+ !isStopPending(for: .toggleTranscription) else {
153
+ return false
154
+ }
155
+
156
+ run(.toggleTranscription)
157
+ return true
158
+ }
159
+
103
160
  func run(_ command: AgentCommand) {
104
161
  let isStopRequest = command.showsRecordingIndicator && recordingIndicator.isRecordingCommand(command)
105
162
  let shouldStartRecording = command.showsRecordingIndicator && !isStopRequest
@@ -118,12 +175,14 @@ final class AgentCommandRunner: ObservableObject {
118
175
  ? "Stopping \(command.title)..."
119
176
  : "Running \(command.title)..."
120
177
 
178
+ let bootstrap = self.bootstrap
179
+ let commandArguments = command.resolvedArguments(extraInstructions: TranscriptionSettings.extraInstructions)
121
180
  DispatchQueue.global(qos: .userInitiated).async {
122
- let bootstrap = AgentRuntime.shared.ensureReady(for: command.bootstrapRequirement, force: command.forceBootstrap)
123
- guard bootstrap.exitCode == 0 else {
124
- let message = Self.statusMessage(for: command, result: bootstrap)
125
- let notificationTitle = Self.notificationTitle(for: command, result: bootstrap)
126
- let notificationBody = Self.notificationBody(for: command, result: bootstrap, statusMessage: message)
181
+ let bootstrapResult = bootstrap(command.bootstrapRequirement, command.forceBootstrap)
182
+ guard bootstrapResult.exitCode == 0 else {
183
+ let message = Self.statusMessage(for: command, result: bootstrapResult)
184
+ let notificationTitle = Self.notificationTitle(for: command, result: bootstrapResult)
185
+ let notificationBody = Self.notificationBody(for: command, result: bootstrapResult, statusMessage: message)
127
186
  Task { @MainActor in
128
187
  if isStopRequest {
129
188
  self.clearStopRequested(for: command)
@@ -133,8 +192,8 @@ final class AgentCommandRunner: ObservableObject {
133
192
  }
134
193
  self.clearHoldTranscriptionState(for: command)
135
194
  self.activeCommandCount = max(0, self.activeCommandCount - 1)
136
- self.lastOutput = bootstrap.output
137
- self.recordFailure(command: command, result: bootstrap)
195
+ self.lastOutput = bootstrapResult.output
196
+ self.recordFailure(command: command, result: bootstrapResult)
138
197
  self.statusMessage = message
139
198
  self.notify(title: notificationTitle, body: notificationBody)
140
199
  }
@@ -149,7 +208,7 @@ final class AgentCommandRunner: ObservableObject {
149
208
  }
150
209
  }
151
210
 
152
- let result = AgentRuntime.shared.runAgentCLI(arguments: command.arguments)
211
+ let result = AgentRuntime.shared.runAgentCLI(arguments: commandArguments)
153
212
  let message = Self.statusMessage(for: command, result: result)
154
213
  let notificationTitle = Self.notificationTitle(for: command, result: result)
155
214
  let notificationBody = Self.notificationBody(for: command, result: result, statusMessage: message)
@@ -201,17 +260,18 @@ final class AgentCommandRunner: ObservableObject {
201
260
 
202
261
  statusMessage = "Stopping Toggle Transcription..."
203
262
 
263
+ let bootstrap = self.bootstrap
204
264
  DispatchQueue.global(qos: .userInitiated).async {
205
- let bootstrap = AgentRuntime.shared.ensureReady(
206
- for: AgentCommand.stopTranscription.bootstrapRequirement,
207
- force: AgentCommand.stopTranscription.forceBootstrap
265
+ let bootstrapResult = bootstrap(
266
+ AgentCommand.stopTranscription.bootstrapRequirement,
267
+ AgentCommand.stopTranscription.forceBootstrap
208
268
  )
209
- guard bootstrap.exitCode == 0 else {
210
- let message = Self.statusMessage(for: AgentCommand.stopTranscription, result: bootstrap)
269
+ guard bootstrapResult.exitCode == 0 else {
270
+ let message = Self.statusMessage(for: AgentCommand.stopTranscription, result: bootstrapResult)
211
271
  Task { @MainActor in
212
272
  self.holdTranscriptionState = .idle
213
- self.lastOutput = bootstrap.output
214
- self.recordFailure(command: AgentCommand.stopTranscription, result: bootstrap)
273
+ self.lastOutput = bootstrapResult.output
274
+ self.recordFailure(command: AgentCommand.stopTranscription, result: bootstrapResult)
215
275
  self.statusMessage = message
216
276
  self.notify(
217
277
  title: "Toggle Transcription Failed",
@@ -293,6 +353,12 @@ final class AgentCommandRunner: ObservableObject {
293
353
  statusMessage = "Copied last output"
294
354
  }
295
355
 
356
+ func copyRecentTranscription(_ transcription: RecentTranscription) {
357
+ NSPasteboard.general.clearContents()
358
+ NSPasteboard.general.setString(transcription.text, forType: .string)
359
+ statusMessage = "Copied recent transcription"
360
+ }
361
+
296
362
  func openLastError() {
297
363
  guard FileManager.default.fileExists(atPath: AgentRuntime.shared.lastErrorURL.path) else {
298
364
  hasLastError = false
@@ -348,23 +414,96 @@ final class AgentCommandRunner: ObservableObject {
348
414
  }
349
415
 
350
416
  func notificationsDisabled() {
351
- statusMessage = "Notifications are disabled. Use Open Notification Settings to enable Agent CLI notifications."
417
+ statusMessage = "Notifications are disabled. Use Fix Notification Permission to enable Agent CLI notifications."
418
+ }
419
+
420
+ func repairNotificationPermission() {
421
+ let center = UNUserNotificationCenter.current()
422
+ center.getNotificationSettings { settings in
423
+ switch settings.authorizationStatus {
424
+ case .notDetermined:
425
+ UNUserNotificationCenter.current().requestAuthorization(options: [.alert]) { granted, _ in
426
+ Task { @MainActor in
427
+ self.statusMessage = granted
428
+ ? "Notification permission enabled"
429
+ : "Notifications are disabled. Enable Agent CLI in Notification Settings."
430
+ }
431
+ }
432
+ case .denied:
433
+ Task { @MainActor in
434
+ _ = self.openNotificationSettings()
435
+ self.statusMessage = "Notifications are disabled. Enable Agent CLI in Notification Settings."
436
+ }
437
+ default:
438
+ Task { @MainActor in
439
+ self.statusMessage = "Notification permission is already enabled"
440
+ }
441
+ }
442
+ }
352
443
  }
353
444
 
354
- func openNotificationSettings() {
445
+ @discardableResult
446
+ func openNotificationSettings() -> Bool {
355
447
  for url in Self.notificationSettingsURLs where NSWorkspace.shared.open(url) {
356
448
  statusMessage = "Opened Notification Settings"
357
- return
449
+ return true
358
450
  }
359
451
  statusMessage = "Could not open Notification Settings"
452
+ return false
360
453
  }
361
454
 
362
- func openAccessibilitySettings() {
455
+ func resetAccessibilityPermission() {
456
+ let result = runTCCReset(service: "Accessibility")
457
+ try? FileManager.default.removeItem(at: AgentRuntime.shared.accessibilityPromptMarkerURL)
458
+ requestAccessibilityPermissionPrompt()
459
+ _ = openAccessibilitySettings()
460
+
461
+ guard result.exitCode == 0 else {
462
+ let output = result.output.trimmingCharacters(in: .whitespacesAndNewlines)
463
+ statusMessage = output.isEmpty
464
+ ? "Could not reset Accessibility permission"
465
+ : "Could not reset Accessibility permission: \(output)"
466
+ return
467
+ }
468
+
469
+ statusMessage = "Accessibility permission reset. Enable Agent CLI in Accessibility, then reopen AgentCLI if auto-insert still fails."
470
+ }
471
+
472
+ @discardableResult
473
+ func openAccessibilitySettings() -> Bool {
363
474
  for url in Self.accessibilitySettingsURLs where NSWorkspace.shared.open(url) {
364
475
  statusMessage = "Opened Accessibility Settings. Accessibility permission controls auto-inserting transcripts."
365
- return
476
+ return true
366
477
  }
367
478
  statusMessage = "Could not open Accessibility Settings"
479
+ return false
480
+ }
481
+
482
+ private func requestAccessibilityPermissionPrompt() {
483
+ let promptOption = kAXTrustedCheckOptionPrompt.takeUnretainedValue() as String
484
+ let options = [promptOption: true] as CFDictionary
485
+ _ = AXIsProcessTrustedWithOptions(options)
486
+ }
487
+
488
+ private func runTCCReset(service: String) -> CommandResult {
489
+ let bundleIdentifier = Bundle.main.bundleIdentifier ?? "lt.nijho.agent-cli.menubar"
490
+ let process = Process()
491
+ let pipe = Pipe()
492
+
493
+ process.executableURL = URL(fileURLWithPath: "/usr/bin/tccutil")
494
+ process.arguments = ["reset", service, bundleIdentifier]
495
+ process.standardOutput = pipe
496
+ process.standardError = pipe
497
+
498
+ do {
499
+ try process.run()
500
+ process.waitUntilExit()
501
+ let data = pipe.fileHandleForReading.readDataToEndOfFile()
502
+ let output = String(data: data, encoding: .utf8) ?? ""
503
+ return CommandResult(exitCode: process.terminationStatus, output: output)
504
+ } catch {
505
+ return CommandResult(exitCode: 1, output: error.localizedDescription)
506
+ }
368
507
  }
369
508
 
370
509
  @discardableResult