agent-cli 0.93.0__tar.gz → 0.94.1__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.93.0 → agent_cli-0.94.1}/.pre-commit-config.yaml +2 -2
- {agent_cli-0.93.0 → agent_cli-0.94.1}/PKG-INFO +1 -1
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/core/deps.py +7 -2
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/install/launchd.py +20 -1
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/cli.py +37 -9
- agent_cli-0.94.1/tests/install/test_launchd.py +23 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_requires_extras.py +66 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_server_tts.py +74 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_server_whisper.py +60 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.claude-plugin/README.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.cursorrules +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.dockerignore +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.env.example +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.github/logo.svg +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.github/release-drafter.yml +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.github/renovate.json +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.github/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.github/scripts/sync_extras.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.github/workflows/docker.yml +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.github/workflows/docs.yml +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.github/workflows/markdown-code-runner.yml +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.github/workflows/pytest.yml +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.github/workflows/release-drafter.yml +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.github/workflows/release.yml +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.gitignore +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.jscpd.json +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.prompts/docs-review.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/.prompts/pr-review.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/CLAUDE.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/LICENSE +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/LLAMA_SERVER_USAGE.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/README.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/__main__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/_extras.json +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/_requirements/diarization.txt +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/_requirements/mlx-whisper.txt +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/_requirements/vad.txt +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/_requirements/vectordb.txt +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/_requirements/whisper-transformers.txt +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/_requirements/wyoming.txt +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/_tools.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/agents/diarize_live_session.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/agents/speakers.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/agents/transcribe.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/agents/transcribe_live.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/api.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/cli.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/config.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/constants.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/core/alignment.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/core/diarization.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/core/process.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/core/speaker_identity.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/core/utils.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/core/vad.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/daemon/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/daemon/cli.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/_branch_name.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/_config.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/_output.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/cleanup.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/cli.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/coding_agents/base.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/hooks.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/launch.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/project.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/skill/SKILL.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/terminals/registry.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/terminals/tmux.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/example-config.toml +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/install/common.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/install/extras.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/install/service_config.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/install/services.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/install/systemd.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/opts.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/py.typed +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/common.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/proxy/api.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/tts/backends/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/tts/model_manager.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/tts/wyoming_handler.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/whisper/backends/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/whisper/backends/base.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/whisper/backends/mlx.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/whisper/backends/transformers.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/whisper/model_manager.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/services/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/services/asr.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docker/docker-compose.yml +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docker/memory-proxy.Dockerfile +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docker/rag-proxy.Dockerfile +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docker/transcribe-proxy.Dockerfile +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docker/tts.Dockerfile +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docker/whisper.Dockerfile +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/CNAME +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/architecture/index.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/architecture/memory.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/architecture/rag.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/assistant.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/chat.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/config.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/daemon.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/dev.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/diarize-live-session.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/index.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/install-extras.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/install-services.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/memory.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/server/index.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/server/transcribe-proxy.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/server/whisper.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/speak.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/speakers.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/start-services.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/transcribe-live.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/transcribe.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/configuration.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/getting-started.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/index.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/installation/docker.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/installation/index.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/installation/linux.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/installation/macos.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/installation/nixos.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/installation/windows.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/logo-clean.svg +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/docs/system-integration.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/justfile +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/pyproject.toml +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/reddit.md +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/shell.nix +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/agents/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/agents/test_speak.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/agents/test_speakers.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/agents/test_transcribe.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/agents/test_transcribe_agent.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/agents/test_transcribe_live.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/agents/test_transcribe_recovery.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/agents/test_voice_edit.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/conftest.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/core/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/core/test_audio.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/core/test_sse.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/core/test_vad.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/core/test_watch.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/dev/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/dev/test_cleanup.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/dev/test_cli.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/dev/test_hooks.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/dev/test_launch.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/dev/test_project.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/dev/test_terminals.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/dev/test_verification.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/install/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/install/test_extras.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/memory/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/memory/test_client.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/memory/test_files.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/memory/test_git_integration.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/memory/test_store.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/mocks/audio.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/mocks/llm.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/rag/__init__.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/rag/test_api.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/rag/test_history.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/rag/test_store.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_alignment.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_api.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_api_integration.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_asr.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_cli.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_config.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_daemon.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_diarization.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_diarize_live_session.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_env_vars.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_faster_whisper_backend.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_json_output.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_llm.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_mlx_backend.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_process_manager.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_services.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_speaker_identity.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_tools.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_transformers_backend.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_tts.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_utils.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_wake_word.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/uv.lock +0 -0
- {agent_cli-0.93.0 → agent_cli-0.94.1}/zensical.toml +0 -0
|
@@ -11,13 +11,13 @@ repos:
|
|
|
11
11
|
- id: end-of-file-fixer
|
|
12
12
|
- id: mixed-line-ending
|
|
13
13
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
14
|
-
rev: "v0.15.
|
|
14
|
+
rev: "v0.15.13"
|
|
15
15
|
hooks:
|
|
16
16
|
- id: ruff
|
|
17
17
|
args: ["--fix"]
|
|
18
18
|
- id: ruff-format
|
|
19
19
|
- repo: https://github.com/pre-commit/mirrors-mypy
|
|
20
|
-
rev: "
|
|
20
|
+
rev: "v2.1.0"
|
|
21
21
|
hooks:
|
|
22
22
|
- id: mypy
|
|
23
23
|
additional_dependencies: ["types-PyYAML"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.94.1
|
|
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>
|
|
@@ -385,7 +385,11 @@ def _should_skip_extra_check_for_process_control(
|
|
|
385
385
|
return process.is_process_running(process_name)
|
|
386
386
|
|
|
387
387
|
|
|
388
|
-
def requires_extras(
|
|
388
|
+
def requires_extras(
|
|
389
|
+
*extras: str,
|
|
390
|
+
process_name: str | None = None,
|
|
391
|
+
resolve_extras: Callable[[dict[str, object]], tuple[str, ...]] | None = None,
|
|
392
|
+
) -> Callable[[F], F]:
|
|
389
393
|
"""Decorator to declare required extras for a command.
|
|
390
394
|
|
|
391
395
|
Auto-installs missing extras by default. Disable via AGENT_CLI_NO_AUTO_INSTALL=1
|
|
@@ -399,7 +403,8 @@ def requires_extras(*extras: str, process_name: str | None = None) -> Callable[[
|
|
|
399
403
|
def wrapper(*args: object, **kwargs: object) -> object:
|
|
400
404
|
if _should_skip_extra_check_for_process_control(kwargs, process_name):
|
|
401
405
|
return func(*args, **kwargs)
|
|
402
|
-
if
|
|
406
|
+
required_extras = resolve_extras(kwargs) if resolve_extras is not None else extras
|
|
407
|
+
if _check_and_install_extras(required_extras):
|
|
403
408
|
raise typer.Exit(1)
|
|
404
409
|
return func(*args, **kwargs)
|
|
405
410
|
|
|
@@ -20,8 +20,26 @@ from agent_cli.install.service_config import (
|
|
|
20
20
|
install_uv,
|
|
21
21
|
)
|
|
22
22
|
|
|
23
|
+
_MACOS_HOMEBREW_BIN = "/opt/homebrew/bin"
|
|
24
|
+
|
|
23
25
|
# macOS-specific paths for uv (Homebrew)
|
|
24
|
-
_MACOS_UV_PATHS = [Path("
|
|
26
|
+
_MACOS_UV_PATHS = [Path(_MACOS_HOMEBREW_BIN) / "uv"]
|
|
27
|
+
|
|
28
|
+
# Default PATH for launchd-spawned daemons. The system default
|
|
29
|
+
# (`/usr/bin:/bin:/usr/sbin:/sbin`) does not include Homebrew, and
|
|
30
|
+
# `path_helper` does not run for launchd processes, so daemons that
|
|
31
|
+
# shell out to ffmpeg/uv/etc. fail with "command not found" unless
|
|
32
|
+
# we set PATH explicitly here.
|
|
33
|
+
_MACOS_DAEMON_PATH = (
|
|
34
|
+
f"{_MACOS_HOMEBREW_BIN}:"
|
|
35
|
+
"/opt/homebrew/sbin:"
|
|
36
|
+
"/usr/local/bin:"
|
|
37
|
+
"/usr/local/sbin:"
|
|
38
|
+
"/usr/bin:"
|
|
39
|
+
"/bin:"
|
|
40
|
+
"/usr/sbin:"
|
|
41
|
+
"/sbin"
|
|
42
|
+
)
|
|
25
43
|
|
|
26
44
|
|
|
27
45
|
def _get_label(service_name: str) -> str:
|
|
@@ -83,6 +101,7 @@ def _generate_plist(
|
|
|
83
101
|
"RunAtLoad": True,
|
|
84
102
|
"KeepAlive": True,
|
|
85
103
|
"WorkingDirectory": str(home_dir),
|
|
104
|
+
"EnvironmentVariables": {"PATH": _MACOS_DAEMON_PATH},
|
|
86
105
|
"StandardOutPath": str(log_dir / "stdout.log"),
|
|
87
106
|
"StandardErrorPath": str(log_dir / "stderr.log"),
|
|
88
107
|
}
|
|
@@ -87,6 +87,13 @@ def _check_server_deps() -> None:
|
|
|
87
87
|
raise typer.Exit(1)
|
|
88
88
|
|
|
89
89
|
|
|
90
|
+
def _resolve_tts_required_extras(kwargs: dict[str, object]) -> tuple[str, ...]:
|
|
91
|
+
"""Choose the TTS backend extra after Typer has parsed --backend."""
|
|
92
|
+
backend = kwargs.get("backend")
|
|
93
|
+
backend_extra = backend if backend in ("piper", "kokoro") else "piper|kokoro"
|
|
94
|
+
return ("server", str(backend_extra), "wyoming")
|
|
95
|
+
|
|
96
|
+
|
|
90
97
|
def _check_tts_deps(backend: str = "auto") -> None:
|
|
91
98
|
"""Check that TTS dependencies are available."""
|
|
92
99
|
_check_server_deps()
|
|
@@ -95,8 +102,8 @@ def _check_tts_deps(backend: str = "auto") -> None:
|
|
|
95
102
|
if not _has("kokoro"):
|
|
96
103
|
err_console.print(
|
|
97
104
|
"[bold red]Error:[/bold red] Kokoro backend requires kokoro. "
|
|
98
|
-
"Run: [cyan]pip install agent-cli\\[
|
|
99
|
-
"or [cyan]uv sync --extra
|
|
105
|
+
"Run: [cyan]pip install agent-cli\\[kokoro][/cyan] "
|
|
106
|
+
"or [cyan]uv sync --extra kokoro[/cyan]",
|
|
100
107
|
)
|
|
101
108
|
raise typer.Exit(1)
|
|
102
109
|
return
|
|
@@ -105,8 +112,8 @@ def _check_tts_deps(backend: str = "auto") -> None:
|
|
|
105
112
|
if not _has("piper"):
|
|
106
113
|
err_console.print(
|
|
107
114
|
"[bold red]Error:[/bold red] Piper backend requires piper-tts. "
|
|
108
|
-
"Run: [cyan]pip install agent-cli\\[
|
|
109
|
-
"or [cyan]uv sync --extra
|
|
115
|
+
"Run: [cyan]pip install agent-cli\\[piper][/cyan] "
|
|
116
|
+
"or [cyan]uv sync --extra piper[/cyan]",
|
|
110
117
|
)
|
|
111
118
|
raise typer.Exit(1)
|
|
112
119
|
return
|
|
@@ -115,8 +122,8 @@ def _check_tts_deps(backend: str = "auto") -> None:
|
|
|
115
122
|
if not _has("piper") and not _has("kokoro"):
|
|
116
123
|
err_console.print(
|
|
117
124
|
"[bold red]Error:[/bold red] No TTS backend available. "
|
|
118
|
-
"Run: [cyan]pip install agent-cli\\[
|
|
119
|
-
"or [cyan]pip install agent-cli\\[
|
|
125
|
+
"Run: [cyan]pip install agent-cli\\[piper][/cyan] for Piper "
|
|
126
|
+
"or [cyan]pip install agent-cli\\[kokoro][/cyan] for Kokoro",
|
|
120
127
|
)
|
|
121
128
|
raise typer.Exit(1)
|
|
122
129
|
|
|
@@ -169,7 +176,8 @@ def _check_whisper_deps(backend: str, *, download_only: bool = False) -> None:
|
|
|
169
176
|
if not _has("mlx_whisper"):
|
|
170
177
|
err_console.print(
|
|
171
178
|
"[bold red]Error:[/bold red] MLX Whisper backend requires mlx-whisper. "
|
|
172
|
-
"Run: [cyan]pip install mlx-whisper[/cyan]"
|
|
179
|
+
"Run: [cyan]pip install agent-cli\\[mlx-whisper][/cyan] "
|
|
180
|
+
"or [cyan]uv sync --extra mlx-whisper[/cyan]",
|
|
173
181
|
)
|
|
174
182
|
raise typer.Exit(1)
|
|
175
183
|
return
|
|
@@ -233,6 +241,21 @@ def _check_transformers_audio_model_deps(models: list[str]) -> None:
|
|
|
233
241
|
raise typer.Exit(1)
|
|
234
242
|
|
|
235
243
|
|
|
244
|
+
def _resolve_whisper_required_extras(kwargs: dict[str, object]) -> tuple[str, ...]:
|
|
245
|
+
"""Choose the Whisper backend extra after Typer has parsed --backend."""
|
|
246
|
+
backend_extras = {
|
|
247
|
+
"faster-whisper": "faster-whisper",
|
|
248
|
+
"mlx": "mlx-whisper",
|
|
249
|
+
"transformers": "whisper-transformers",
|
|
250
|
+
}
|
|
251
|
+
backend = kwargs.get("backend")
|
|
252
|
+
backend_extra = backend_extras.get(
|
|
253
|
+
str(backend),
|
|
254
|
+
"faster-whisper|mlx-whisper|whisper-transformers",
|
|
255
|
+
)
|
|
256
|
+
return ("server", backend_extra, "wyoming")
|
|
257
|
+
|
|
258
|
+
|
|
236
259
|
def _print_optional_whisper_config(
|
|
237
260
|
*,
|
|
238
261
|
default_language: str | None,
|
|
@@ -249,7 +272,12 @@ def _print_optional_whisper_config(
|
|
|
249
272
|
|
|
250
273
|
|
|
251
274
|
@app.command("whisper")
|
|
252
|
-
@requires_extras(
|
|
275
|
+
@requires_extras(
|
|
276
|
+
"server",
|
|
277
|
+
"faster-whisper|mlx-whisper|whisper-transformers",
|
|
278
|
+
"wyoming",
|
|
279
|
+
resolve_extras=_resolve_whisper_required_extras,
|
|
280
|
+
)
|
|
253
281
|
def whisper_cmd( # noqa: PLR0912, PLR0915
|
|
254
282
|
model: Annotated[
|
|
255
283
|
list[str] | None,
|
|
@@ -639,7 +667,7 @@ def transcribe_proxy_cmd(
|
|
|
639
667
|
|
|
640
668
|
|
|
641
669
|
@app.command("tts")
|
|
642
|
-
@requires_extras("server", "piper|kokoro", "wyoming")
|
|
670
|
+
@requires_extras("server", "piper|kokoro", "wyoming", resolve_extras=_resolve_tts_required_extras)
|
|
643
671
|
def tts_cmd( # noqa: PLR0915
|
|
644
672
|
model: Annotated[
|
|
645
673
|
list[str] | None,
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Tests for macOS launchd service management."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
from agent_cli.install.launchd import _generate_plist
|
|
8
|
+
from agent_cli.install.service_config import SERVICES
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def test_generate_plist_sets_path_for_homebrew_bins() -> None:
|
|
12
|
+
plist = _generate_plist(
|
|
13
|
+
SERVICES["whisper"],
|
|
14
|
+
Path("/opt/homebrew/bin/uv"),
|
|
15
|
+
Path("/Users/test"),
|
|
16
|
+
Path("/Users/test/Library/Logs/agent-cli-whisper"),
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
path = plist["EnvironmentVariables"]["PATH"]
|
|
20
|
+
|
|
21
|
+
assert "/opt/homebrew/bin" in path.split(":")
|
|
22
|
+
assert "/usr/local/bin" in path.split(":")
|
|
23
|
+
assert path.endswith("/usr/bin:/bin:/usr/sbin:/sbin")
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import ast
|
|
5
6
|
import os
|
|
7
|
+
from pathlib import Path
|
|
6
8
|
from unittest.mock import patch
|
|
7
9
|
|
|
8
10
|
import pytest
|
|
@@ -33,6 +35,32 @@ class TestRequiresExtrasDecorator:
|
|
|
33
35
|
assert hasattr(sample_command, "_required_extras")
|
|
34
36
|
assert sample_command._required_extras == ("audio", "llm")
|
|
35
37
|
|
|
38
|
+
def test_decorator_uses_runtime_extras_resolver(self) -> None:
|
|
39
|
+
"""Commands can choose concrete extras after Typer parses options."""
|
|
40
|
+
|
|
41
|
+
def resolve_extras(kwargs: dict[str, object]) -> tuple[str, ...]:
|
|
42
|
+
backend = kwargs["backend"]
|
|
43
|
+
return ("server", str(backend), "wyoming")
|
|
44
|
+
|
|
45
|
+
@requires_extras(
|
|
46
|
+
"server",
|
|
47
|
+
"piper|kokoro",
|
|
48
|
+
"wyoming",
|
|
49
|
+
resolve_extras=resolve_extras,
|
|
50
|
+
)
|
|
51
|
+
def sample_command(*, backend: str) -> str:
|
|
52
|
+
return f"success:{backend}"
|
|
53
|
+
|
|
54
|
+
with patch("agent_cli.core.deps._check_and_install_extras", return_value=[]) as mock_check:
|
|
55
|
+
assert sample_command(backend="kokoro") == "success:kokoro"
|
|
56
|
+
|
|
57
|
+
mock_check.assert_called_once_with(("server", "kokoro", "wyoming"))
|
|
58
|
+
assert getattr(sample_command, "_required_extras") == ( # noqa: B009
|
|
59
|
+
"server",
|
|
60
|
+
"piper|kokoro",
|
|
61
|
+
"wyoming",
|
|
62
|
+
)
|
|
63
|
+
|
|
36
64
|
def test__get_install_hint_with_pipe_syntax(self) -> None:
|
|
37
65
|
"""Pipe syntax shows all alternatives in the hint."""
|
|
38
66
|
hint = _get_install_hint("piper|kokoro")
|
|
@@ -43,6 +71,44 @@ class TestRequiresExtrasDecorator:
|
|
|
43
71
|
assert "agent-cli\\[piper]" in hint
|
|
44
72
|
assert "agent-cli\\[kokoro]" in hint
|
|
45
73
|
|
|
74
|
+
def test_commands_with_alternative_extras_have_runtime_resolver(self) -> None:
|
|
75
|
+
"""Alternative extras on commands need a resolver for explicit backend options."""
|
|
76
|
+
repo_root = Path(__file__).resolve().parents[1]
|
|
77
|
+
violations: list[str] = []
|
|
78
|
+
|
|
79
|
+
for path in (repo_root / "agent_cli").rglob("*.py"):
|
|
80
|
+
tree = ast.parse(path.read_text(encoding="utf-8"), filename=str(path))
|
|
81
|
+
for node in ast.walk(tree):
|
|
82
|
+
if not isinstance(node, ast.FunctionDef | ast.AsyncFunctionDef):
|
|
83
|
+
continue
|
|
84
|
+
|
|
85
|
+
for decorator in node.decorator_list:
|
|
86
|
+
if not isinstance(decorator, ast.Call):
|
|
87
|
+
continue
|
|
88
|
+
|
|
89
|
+
func = decorator.func
|
|
90
|
+
if not isinstance(func, ast.Name) or func.id != "requires_extras":
|
|
91
|
+
continue
|
|
92
|
+
|
|
93
|
+
extras = [
|
|
94
|
+
arg.value
|
|
95
|
+
for arg in decorator.args
|
|
96
|
+
if isinstance(arg, ast.Constant) and isinstance(arg.value, str)
|
|
97
|
+
]
|
|
98
|
+
if not any("|" in extra for extra in extras):
|
|
99
|
+
continue
|
|
100
|
+
|
|
101
|
+
has_resolver = any(
|
|
102
|
+
keyword.arg == "resolve_extras" for keyword in decorator.keywords
|
|
103
|
+
)
|
|
104
|
+
if not has_resolver:
|
|
105
|
+
violations.append(f"{path.relative_to(repo_root)}:{node.lineno}")
|
|
106
|
+
|
|
107
|
+
assert not violations, (
|
|
108
|
+
"requires_extras alternatives choose a default extra during auto-install. "
|
|
109
|
+
"Pass resolve_extras for commands with alternative extras: " + ", ".join(violations)
|
|
110
|
+
)
|
|
111
|
+
|
|
46
112
|
|
|
47
113
|
class TestExtrasMetadata:
|
|
48
114
|
"""Test the _extras.json metadata is properly structured."""
|
|
@@ -6,8 +6,10 @@ from pathlib import Path
|
|
|
6
6
|
from unittest.mock import AsyncMock, MagicMock, PropertyMock, patch
|
|
7
7
|
|
|
8
8
|
import pytest
|
|
9
|
+
import typer
|
|
9
10
|
from fastapi.testclient import TestClient
|
|
10
11
|
|
|
12
|
+
from agent_cli.server.cli import _check_tts_deps, _resolve_tts_required_extras
|
|
11
13
|
from agent_cli.server.model_manager import ModelStats
|
|
12
14
|
from agent_cli.server.tts.backends import SynthesisResult
|
|
13
15
|
from agent_cli.server.tts.model_manager import TTSModelConfig, TTSModelManager
|
|
@@ -55,6 +57,78 @@ class TestTTSModelConfig:
|
|
|
55
57
|
assert config.backend_type == "kokoro"
|
|
56
58
|
|
|
57
59
|
|
|
60
|
+
class TestTTSDependencyChecks:
|
|
61
|
+
"""Tests for server TTS optional dependency handling."""
|
|
62
|
+
|
|
63
|
+
def test_resolve_tts_required_extras_uses_explicit_backend(self) -> None:
|
|
64
|
+
"""Explicit TTS backends should install their matching extra."""
|
|
65
|
+
assert _resolve_tts_required_extras({"backend": "kokoro"}) == (
|
|
66
|
+
"server",
|
|
67
|
+
"kokoro",
|
|
68
|
+
"wyoming",
|
|
69
|
+
)
|
|
70
|
+
assert _resolve_tts_required_extras({"backend": "piper"}) == (
|
|
71
|
+
"server",
|
|
72
|
+
"piper",
|
|
73
|
+
"wyoming",
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
def test_resolve_tts_required_extras_keeps_auto_backend_alternatives(self) -> None:
|
|
77
|
+
"""Auto backend should keep the existing Piper-or-Kokoro fallback."""
|
|
78
|
+
assert _resolve_tts_required_extras({"backend": "auto"}) == (
|
|
79
|
+
"server",
|
|
80
|
+
"piper|kokoro",
|
|
81
|
+
"wyoming",
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
@pytest.mark.parametrize(
|
|
85
|
+
("backend", "expected_extra", "unexpected"),
|
|
86
|
+
[
|
|
87
|
+
("kokoro", "kokoro", "tts-kokoro"),
|
|
88
|
+
("piper", "piper", "agent-cli\\[tts]"),
|
|
89
|
+
],
|
|
90
|
+
)
|
|
91
|
+
def test_backend_dependency_hint_uses_existing_extra(
|
|
92
|
+
self,
|
|
93
|
+
backend: str,
|
|
94
|
+
expected_extra: str,
|
|
95
|
+
unexpected: str,
|
|
96
|
+
) -> None:
|
|
97
|
+
"""Missing backend deps should point at existing extras."""
|
|
98
|
+
with (
|
|
99
|
+
patch(
|
|
100
|
+
"agent_cli.server.cli._has",
|
|
101
|
+
side_effect=lambda package: package in {"uvicorn", "fastapi"},
|
|
102
|
+
),
|
|
103
|
+
patch("agent_cli.server.cli.err_console.print") as mock_print,
|
|
104
|
+
pytest.raises(typer.Exit),
|
|
105
|
+
):
|
|
106
|
+
_check_tts_deps(backend)
|
|
107
|
+
|
|
108
|
+
message = mock_print.call_args[0][0]
|
|
109
|
+
assert f"agent-cli\\[{expected_extra}]" in message
|
|
110
|
+
assert f"uv sync --extra {expected_extra}" in message
|
|
111
|
+
assert unexpected not in message
|
|
112
|
+
|
|
113
|
+
def test_auto_dependency_hint_uses_backend_extras(self) -> None:
|
|
114
|
+
"""Missing auto backend deps should list installable backend extras."""
|
|
115
|
+
with (
|
|
116
|
+
patch(
|
|
117
|
+
"agent_cli.server.cli._has",
|
|
118
|
+
side_effect=lambda package: package in {"uvicorn", "fastapi"},
|
|
119
|
+
),
|
|
120
|
+
patch("agent_cli.server.cli.err_console.print") as mock_print,
|
|
121
|
+
pytest.raises(typer.Exit),
|
|
122
|
+
):
|
|
123
|
+
_check_tts_deps("auto")
|
|
124
|
+
|
|
125
|
+
message = mock_print.call_args[0][0]
|
|
126
|
+
assert "agent-cli\\[piper]" in message
|
|
127
|
+
assert "agent-cli\\[kokoro]" in message
|
|
128
|
+
assert "agent-cli\\[tts]" not in message
|
|
129
|
+
assert "tts-kokoro" not in message
|
|
130
|
+
|
|
131
|
+
|
|
58
132
|
class TestModelStats:
|
|
59
133
|
"""Tests for ModelStats dataclass with TTS-specific fields."""
|
|
60
134
|
|
|
@@ -9,8 +9,10 @@ from pathlib import Path
|
|
|
9
9
|
from unittest.mock import AsyncMock, patch
|
|
10
10
|
|
|
11
11
|
import pytest
|
|
12
|
+
import typer
|
|
12
13
|
from fastapi.testclient import TestClient
|
|
13
14
|
|
|
15
|
+
from agent_cli.server.cli import _check_whisper_deps, _resolve_whisper_required_extras
|
|
14
16
|
from agent_cli.server.model_manager import ModelStats
|
|
15
17
|
from agent_cli.server.whisper.backends import TranscriptionResult
|
|
16
18
|
from agent_cli.server.whisper.backends.base import UnsupportedRequestError
|
|
@@ -68,6 +70,64 @@ class TestModelConfig:
|
|
|
68
70
|
assert config.trust_remote_code is True
|
|
69
71
|
|
|
70
72
|
|
|
73
|
+
class TestWhisperDependencyChecks:
|
|
74
|
+
"""Tests for server Whisper optional dependency handling."""
|
|
75
|
+
|
|
76
|
+
def test_resolve_whisper_required_extras_uses_explicit_backend(self) -> None:
|
|
77
|
+
"""Explicit Whisper backends should install their matching extra."""
|
|
78
|
+
assert _resolve_whisper_required_extras({"backend": "faster-whisper"}) == (
|
|
79
|
+
"server",
|
|
80
|
+
"faster-whisper",
|
|
81
|
+
"wyoming",
|
|
82
|
+
)
|
|
83
|
+
assert _resolve_whisper_required_extras({"backend": "mlx"}) == (
|
|
84
|
+
"server",
|
|
85
|
+
"mlx-whisper",
|
|
86
|
+
"wyoming",
|
|
87
|
+
)
|
|
88
|
+
assert _resolve_whisper_required_extras({"backend": "transformers"}) == (
|
|
89
|
+
"server",
|
|
90
|
+
"whisper-transformers",
|
|
91
|
+
"wyoming",
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
def test_resolve_whisper_required_extras_keeps_auto_backend_alternatives(self) -> None:
|
|
95
|
+
"""Auto backend should keep the existing Whisper backend fallback."""
|
|
96
|
+
assert _resolve_whisper_required_extras({"backend": "auto"}) == (
|
|
97
|
+
"server",
|
|
98
|
+
"faster-whisper|mlx-whisper|whisper-transformers",
|
|
99
|
+
"wyoming",
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
@pytest.mark.parametrize(
|
|
103
|
+
("backend", "expected_extra"),
|
|
104
|
+
[
|
|
105
|
+
("faster-whisper", "faster-whisper"),
|
|
106
|
+
("mlx", "mlx-whisper"),
|
|
107
|
+
("transformers", "whisper-transformers"),
|
|
108
|
+
],
|
|
109
|
+
)
|
|
110
|
+
def test_backend_dependency_hint_uses_existing_extra(
|
|
111
|
+
self,
|
|
112
|
+
backend: str,
|
|
113
|
+
expected_extra: str,
|
|
114
|
+
) -> None:
|
|
115
|
+
"""Missing backend deps should point at existing extras."""
|
|
116
|
+
with (
|
|
117
|
+
patch(
|
|
118
|
+
"agent_cli.server.cli._has",
|
|
119
|
+
side_effect=lambda package: package in {"uvicorn", "fastapi"},
|
|
120
|
+
),
|
|
121
|
+
patch("agent_cli.server.cli.err_console.print") as mock_print,
|
|
122
|
+
pytest.raises(typer.Exit),
|
|
123
|
+
):
|
|
124
|
+
_check_whisper_deps(backend)
|
|
125
|
+
|
|
126
|
+
message = mock_print.call_args[0][0]
|
|
127
|
+
assert f"agent-cli\\[{expected_extra}]" in message
|
|
128
|
+
assert f"uv sync --extra {expected_extra}" in message
|
|
129
|
+
|
|
130
|
+
|
|
71
131
|
class TestModelStats:
|
|
72
132
|
"""Tests for ModelStats dataclass."""
|
|
73
133
|
|
|
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
|
|
File without changes
|