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.
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/workflows/release.yml +2 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/PKG-INFO +1 -1
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/transcribe.py +1 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/README.md +14 -6
- agent_cli-0.95.5/macos/AgentCLI/Resources/dmg-background.svg +8 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +41 -6
- {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +21 -1
- {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +164 -25
- {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +214 -10
- {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +2 -0
- agent_cli-0.95.5/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +283 -0
- agent_cli-0.95.5/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +173 -0
- agent_cli-0.95.5/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +115 -0
- agent_cli-0.95.5/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +5 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +42 -0
- agent_cli-0.95.5/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +9 -0
- agent_cli-0.95.5/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +137 -0
- agent_cli-0.95.5/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +37 -0
- agent_cli-0.95.5/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +34 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/build-macos-app.sh +159 -7
- {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/test-macos-app-e2e.sh +9 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_transcribe.py +13 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_diarize_live_session.py +5 -1
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_macos_app.py +201 -20
- agent_cli-0.95.3/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -32
- agent_cli-0.95.3/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +0 -16
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.claude-plugin/README.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.cursorrules +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.dockerignore +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.env.example +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/logo.svg +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/release-drafter.yml +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/renovate.json +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/scripts/sync_extras.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/workflows/docker.yml +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/workflows/docs.yml +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/workflows/markdown-code-runner.yml +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/workflows/pytest.yml +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/workflows/release-drafter.yml +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.gitignore +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.jscpd.json +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.pre-commit-config.yaml +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.prompts/docs-review.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/.prompts/pr-review.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/CLAUDE.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/LICENSE +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/LLAMA_SERVER_USAGE.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/README.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/__main__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_extras.json +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/diarization.txt +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/mlx-whisper.txt +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/vad.txt +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/vectordb.txt +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/whisper-transformers.txt +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_requirements/wyoming.txt +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/_tools.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/diarize_live_session.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/speakers.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/transcribe_live.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/api.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/cli.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/config.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/constants.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/alignment.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/deps.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/diarization.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/process.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/speaker_identity.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/utils.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/vad.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/daemon/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/daemon/cli.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/_branch_name.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/_config.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/_output.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/cleanup.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/cli.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/base.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/hooks.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/launch.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/project.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/skill/SKILL.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/registry.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/tmux.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/example-config.toml +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/install/common.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/install/extras.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/install/launchd.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/install/service_config.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/install/services.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/install/systemd.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/opts.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/py.typed +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/cli.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/common.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/proxy/api.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/tts/backends/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/tts/model_manager.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/tts/wyoming_handler.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/backends/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/backends/base.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/backends/mlx.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/backends/transformers.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/model_manager.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/services/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/services/asr.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docker/docker-compose.yml +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docker/memory-proxy.Dockerfile +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docker/rag-proxy.Dockerfile +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docker/transcribe-proxy.Dockerfile +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docker/tts.Dockerfile +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docker/whisper.Dockerfile +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/CNAME +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/architecture/index.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/architecture/memory.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/architecture/rag.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/assistant.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/chat.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/config.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/daemon.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/dev.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/diarize-live-session.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/index.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/install-extras.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/install-services.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/memory.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/server/index.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/server/transcribe-proxy.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/server/whisper.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/speak.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/speakers.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/start-services.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/transcribe-live.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/transcribe.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/configuration.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/getting-started.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/index.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/installation/docker.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/installation/index.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/installation/linux.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/installation/macos.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/installation/nixos.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/installation/windows.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/logo-avatar.svg +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/logo-clean.svg +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/docs/system-integration.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/justfile +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Package.resolved +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Package.swift +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Resources/Info.plist +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/pyproject.toml +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/reddit.md +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/shell.nix +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_speak.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_speakers.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_transcribe_agent.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_transcribe_live.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_transcribe_recovery.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_voice_edit.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/conftest.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/core/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/core/test_audio.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/core/test_sse.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/core/test_vad.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/core/test_watch.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_cleanup.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_cli.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_hooks.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_launch.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_project.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_terminals.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_verification.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/install/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/install/test_extras.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/install/test_launchd.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_client.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_files.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_git_integration.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_store.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/mocks/audio.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/mocks/llm.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/__init__.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_api.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_history.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_store.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_alignment.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_api.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_api_integration.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_asr.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_cli.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_config.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_daemon.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_diarization.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_env_vars.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_faster_whisper_backend.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_json_output.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_llm.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_mlx_backend.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_process_manager.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_requires_extras.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_server_tts.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_server_whisper.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_services.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_speaker_identity.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_tools.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_transformers_backend.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_tts.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_utils.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_wake_word.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.95.3 → agent_cli-0.95.5}/uv.lock +0 -0
- {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
|
+
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>
|
|
@@ -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.
|
|
5
|
-
private `agent-cli[audio,llm]` tool into the user's Application
|
|
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 **
|
|
22
|
-
|
|
23
|
-
|
|
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("
|
|
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(
|
|
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.
|
|
141
|
+
runner.repairNotificationPermission()
|
|
107
142
|
} label: {
|
|
108
|
-
Label("
|
|
143
|
+
Label("Fix Notification Permission...", systemImage: "bell.badge")
|
|
109
144
|
}
|
|
110
145
|
|
|
111
146
|
Button {
|
|
112
|
-
runner.
|
|
147
|
+
runner.resetAccessibilityPermission()
|
|
113
148
|
} label: {
|
|
114
|
-
Label("
|
|
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: [
|
|
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",
|
{agent_cli-0.95.3 → agent_cli-0.95.5}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift
RENAMED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
123
|
-
guard
|
|
124
|
-
let message = Self.statusMessage(for: command, result:
|
|
125
|
-
let notificationTitle = Self.notificationTitle(for: command, result:
|
|
126
|
-
let notificationBody = Self.notificationBody(for: command, result:
|
|
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 =
|
|
137
|
-
self.recordFailure(command: command, result:
|
|
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:
|
|
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
|
|
206
|
-
|
|
207
|
-
|
|
265
|
+
let bootstrapResult = bootstrap(
|
|
266
|
+
AgentCommand.stopTranscription.bootstrapRequirement,
|
|
267
|
+
AgentCommand.stopTranscription.forceBootstrap
|
|
208
268
|
)
|
|
209
|
-
guard
|
|
210
|
-
let message = Self.statusMessage(for: AgentCommand.stopTranscription, result:
|
|
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 =
|
|
214
|
-
self.recordFailure(command: AgentCommand.stopTranscription, result:
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|