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