agent-cli 0.101.0__tar.gz → 0.102.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.101.0 → agent_cli-0.102.1}/.github/workflows/docker.yml +10 -10
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/workflows/docs.yml +2 -2
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/workflows/markdown-code-runner.yml +3 -3
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/workflows/pytest.yml +3 -3
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/workflows/release-drafter.yml +1 -1
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/workflows/release.yml +4 -4
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.pre-commit-config.yaml +2 -2
- {agent_cli-0.101.0 → agent_cli-0.102.1}/PKG-INFO +1 -1
- agent_cli-0.102.1/agent_cli/__init__.py +16 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/cli.py +2 -1
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/project.py +49 -15
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/cli.py +10 -1
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/tts/backends/__init__.py +3 -1
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/tts/model_manager.py +12 -1
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/tts/wyoming_handler.py +59 -13
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Package.resolved +2 -2
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Package.swift +1 -1
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +36 -8
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +82 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/appcast.xml +48 -31
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_project.py +114 -5
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_api_integration.py +27 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_server_tts.py +22 -0
- agent_cli-0.102.1/tests/test_server_tts_wyoming.py +107 -0
- agent_cli-0.101.0/agent_cli/__init__.py +0 -5
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.claude-plugin/README.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.cursorrules +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.dockerignore +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.env.example +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/logo.svg +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/release-drafter.yml +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/renovate.json +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/scripts/normalize_appcast.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/scripts/sync_extras.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.gitignore +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.jscpd.json +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.prompts/docs-review.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/.prompts/pr-review.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/CLAUDE.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/LICENSE +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/LLAMA_SERVER_USAGE.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/README.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/__main__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_extras.json +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_overrides/nemo-whisper.txt +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/diarization.txt +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/mlx-whisper.txt +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/nemo-whisper.txt +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/vad.txt +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/vectordb.txt +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/whisper-transformers.txt +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_requirements/wyoming.txt +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/_tools.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/diarize_live_session.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/speakers.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/transcribe.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/transcribe_live.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/api.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/config.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/constants.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/alignment.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/deps.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/diarization.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/process.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/speaker_identity.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/utils.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/vad.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/daemon/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/daemon/cli.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/_branch_name.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/_config.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/_output.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/cleanup.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/cli.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/base.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/hooks.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/launch.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/skill/SKILL.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/cmux.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/registry.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/tmux.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/example-config.toml +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/install/common.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/install/extras.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/install/launchd.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/install/service_config.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/install/services.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/install/systemd.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/opts.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/py.typed +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/common.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/proxy/api.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/backends/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/backends/base.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/backends/mlx.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/backends/nemo.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/backends/transformers.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/model_manager.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/services/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/services/asr.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docker/docker-compose.yml +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docker/memory-proxy.Dockerfile +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docker/rag-proxy.Dockerfile +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docker/transcribe-proxy.Dockerfile +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docker/tts.Dockerfile +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docker/whisper.Dockerfile +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/CNAME +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/architecture/index.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/architecture/memory.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/architecture/rag.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/assistant.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/chat.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/config.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/daemon.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/dev.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/diarize-live-session.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/index.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/install-extras.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/install-services.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/memory.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/server/index.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/server/transcribe-proxy.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/server/whisper.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/speak.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/speakers.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/start-services.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/transcribe-live.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/transcribe.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/configuration.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/getting-started.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/index.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/installation/docker.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/installation/index.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/installation/linux.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/installation/macos-app.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/installation/macos.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/installation/nixos.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/installation/windows.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/logo-avatar.svg +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/logo-clean.svg +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/docs/system-integration.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/justfile +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/README.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Resources/Info.plist +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/LiveTranscriptionPreview.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatus.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatusRow.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/MenuActivityTracker.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Tests/AgentCLITests/ConfigurableHotkeyControllerTests.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Tests/AgentCLITests/LivePreviewSwiftTestingTests.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Tests/AgentCLITests/LiveTranscriptionPreviewTests.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/AgentCLI/Tests/AgentCLITests/VoiceLevelMeterTests.swift +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/build-macos-app.sh +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/macos/test-macos-app-e2e.sh +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/pyproject.toml +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/reddit.md +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/shell.nix +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_speak.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_speakers.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_transcribe.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_transcribe_agent.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_transcribe_live.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_transcribe_recovery.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_voice_edit.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/conftest.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/core/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/core/test_audio.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/core/test_audio_levels.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/core/test_sse.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/core/test_vad.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/core/test_watch.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_cleanup.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_cli.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_hooks.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_launch.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_terminals.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_verification.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/install/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/install/test_extras.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/install/test_launchd.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_client.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_files.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_git_integration.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_store.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/mocks/audio.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/mocks/llm.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/__init__.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_api.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_history.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_store.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_alignment.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_api.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_asr.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_cli.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_config.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_daemon.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_diarization.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_diarize_live_session.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_env_vars.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_faster_whisper_backend.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_json_output.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_llm.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_macos_app.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_mlx_backend.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_nemo_backend.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_normalize_appcast.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_process_manager.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_requires_extras.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_server_whisper.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_services.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_speaker_identity.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_tools.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_transformers_backend.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_tts.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_utils.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_wake_word.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/uv.lock +0 -0
- {agent_cli-0.101.0 → agent_cli-0.102.1}/zensical.toml +0 -0
|
@@ -46,15 +46,15 @@ jobs:
|
|
|
46
46
|
df -h
|
|
47
47
|
|
|
48
48
|
- name: Checkout repository
|
|
49
|
-
uses: actions/checkout@
|
|
49
|
+
uses: actions/checkout@v7.0.1
|
|
50
50
|
with:
|
|
51
51
|
fetch-depth: 0 # Full history for version detection
|
|
52
52
|
|
|
53
53
|
- name: Set up Docker Buildx
|
|
54
|
-
uses: docker/setup-buildx-action@v4.
|
|
54
|
+
uses: docker/setup-buildx-action@v4.2.0
|
|
55
55
|
|
|
56
56
|
- name: Log in to Container Registry
|
|
57
|
-
uses: docker/login-action@v4.
|
|
57
|
+
uses: docker/login-action@v4.5.1
|
|
58
58
|
with:
|
|
59
59
|
registry: ${{ env.REGISTRY }}
|
|
60
60
|
username: ${{ github.actor }}
|
|
@@ -71,7 +71,7 @@ jobs:
|
|
|
71
71
|
|
|
72
72
|
- name: Extract metadata
|
|
73
73
|
id: meta
|
|
74
|
-
uses: docker/metadata-action@v6.
|
|
74
|
+
uses: docker/metadata-action@v6.2.0
|
|
75
75
|
with:
|
|
76
76
|
images: ${{ env.REGISTRY }}/${{ github.repository }}-${{ matrix.image }}
|
|
77
77
|
tags: |
|
|
@@ -80,7 +80,7 @@ jobs:
|
|
|
80
80
|
type=sha,suffix=-${{ matrix.suffix }}
|
|
81
81
|
|
|
82
82
|
- name: Build and push
|
|
83
|
-
uses: docker/build-push-action@v7.
|
|
83
|
+
uses: docker/build-push-action@v7.3.0
|
|
84
84
|
with:
|
|
85
85
|
context: .
|
|
86
86
|
file: ${{ matrix.dockerfile }}
|
|
@@ -111,15 +111,15 @@ jobs:
|
|
|
111
111
|
|
|
112
112
|
steps:
|
|
113
113
|
- name: Checkout repository
|
|
114
|
-
uses: actions/checkout@
|
|
114
|
+
uses: actions/checkout@v7.0.1
|
|
115
115
|
with:
|
|
116
116
|
fetch-depth: 0 # Full history for version detection
|
|
117
117
|
|
|
118
118
|
- name: Set up Docker Buildx
|
|
119
|
-
uses: docker/setup-buildx-action@v4.
|
|
119
|
+
uses: docker/setup-buildx-action@v4.2.0
|
|
120
120
|
|
|
121
121
|
- name: Log in to Container Registry
|
|
122
|
-
uses: docker/login-action@v4.
|
|
122
|
+
uses: docker/login-action@v4.5.1
|
|
123
123
|
with:
|
|
124
124
|
registry: ${{ env.REGISTRY }}
|
|
125
125
|
username: ${{ github.actor }}
|
|
@@ -136,7 +136,7 @@ jobs:
|
|
|
136
136
|
|
|
137
137
|
- name: Extract metadata
|
|
138
138
|
id: meta
|
|
139
|
-
uses: docker/metadata-action@v6.
|
|
139
|
+
uses: docker/metadata-action@v6.2.0
|
|
140
140
|
with:
|
|
141
141
|
images: ${{ env.REGISTRY }}/${{ github.repository }}-${{ matrix.image }}
|
|
142
142
|
tags: |
|
|
@@ -145,7 +145,7 @@ jobs:
|
|
|
145
145
|
type=sha
|
|
146
146
|
|
|
147
147
|
- name: Build and push
|
|
148
|
-
uses: docker/build-push-action@v7.
|
|
148
|
+
uses: docker/build-push-action@v7.3.0
|
|
149
149
|
with:
|
|
150
150
|
context: .
|
|
151
151
|
file: ${{ matrix.dockerfile }}
|
|
@@ -27,12 +27,12 @@ jobs:
|
|
|
27
27
|
build:
|
|
28
28
|
runs-on: ubuntu-latest
|
|
29
29
|
steps:
|
|
30
|
-
- uses: actions/checkout@
|
|
30
|
+
- uses: actions/checkout@v7.0.1
|
|
31
31
|
with:
|
|
32
32
|
lfs: true
|
|
33
33
|
|
|
34
34
|
- name: Install uv
|
|
35
|
-
uses: astral-sh/setup-uv@v8.2
|
|
35
|
+
uses: astral-sh/setup-uv@v8.3.2
|
|
36
36
|
|
|
37
37
|
- name: Set up Python
|
|
38
38
|
run: uv python install 3.12
|
|
@@ -11,18 +11,18 @@ jobs:
|
|
|
11
11
|
runs-on: ubuntu-latest
|
|
12
12
|
steps:
|
|
13
13
|
- name: Check out repository
|
|
14
|
-
uses: actions/checkout@
|
|
14
|
+
uses: actions/checkout@v7.0.1
|
|
15
15
|
with:
|
|
16
16
|
persist-credentials: false
|
|
17
17
|
fetch-depth: 0
|
|
18
18
|
|
|
19
19
|
- name: Set up Python
|
|
20
|
-
uses: actions/setup-python@v6.
|
|
20
|
+
uses: actions/setup-python@v6.3.0
|
|
21
21
|
with:
|
|
22
22
|
python-version: "3.13.11"
|
|
23
23
|
|
|
24
24
|
- name: Install uv
|
|
25
|
-
uses: astral-sh/setup-uv@v8.2
|
|
25
|
+
uses: astral-sh/setup-uv@v8.3.2
|
|
26
26
|
|
|
27
27
|
- name: Run markdown-code-runner
|
|
28
28
|
env:
|
|
@@ -18,16 +18,16 @@ jobs:
|
|
|
18
18
|
python-version: ["3.11", "3.13"]
|
|
19
19
|
|
|
20
20
|
steps:
|
|
21
|
-
- uses: actions/checkout@
|
|
21
|
+
- uses: actions/checkout@v7.0.1
|
|
22
22
|
- name: Set up Python ${{ matrix.python-version }}
|
|
23
|
-
uses: actions/setup-python@v6.
|
|
23
|
+
uses: actions/setup-python@v6.3.0
|
|
24
24
|
with:
|
|
25
25
|
python-version: ${{ matrix.python-version }}
|
|
26
26
|
- name: Install portaudio (Linux only)
|
|
27
27
|
if: matrix.os == 'ubuntu-latest'
|
|
28
28
|
run: sudo apt-get update && sudo apt-get install -y portaudio19-dev
|
|
29
29
|
- name: Install uv
|
|
30
|
-
uses: astral-sh/setup-uv@v8.2
|
|
30
|
+
uses: astral-sh/setup-uv@v8.3.2
|
|
31
31
|
- name: Run macOS app Swift tests
|
|
32
32
|
if: matrix.os == 'macos-latest' && matrix.python-version == '3.13'
|
|
33
33
|
run: swift test --package-path macos/AgentCLI --enable-xctest
|
|
@@ -14,9 +14,9 @@ jobs:
|
|
|
14
14
|
permissions:
|
|
15
15
|
id-token: write
|
|
16
16
|
steps:
|
|
17
|
-
- uses: actions/checkout@
|
|
17
|
+
- uses: actions/checkout@v7.0.1
|
|
18
18
|
- name: Install uv
|
|
19
|
-
uses: astral-sh/setup-uv@v8.2
|
|
19
|
+
uses: astral-sh/setup-uv@v8.3.2
|
|
20
20
|
- name: Build
|
|
21
21
|
run: uv build
|
|
22
22
|
- name: Publish package distributions to PyPI
|
|
@@ -29,9 +29,9 @@ jobs:
|
|
|
29
29
|
permissions:
|
|
30
30
|
contents: write
|
|
31
31
|
steps:
|
|
32
|
-
- uses: actions/checkout@
|
|
32
|
+
- uses: actions/checkout@v7.0.1
|
|
33
33
|
- name: Install uv
|
|
34
|
-
uses: astral-sh/setup-uv@v8.2
|
|
34
|
+
uses: astral-sh/setup-uv@v8.3.2
|
|
35
35
|
- name: Import Developer ID certificate
|
|
36
36
|
uses: apple-actions/import-codesign-certs@v7.0.0
|
|
37
37
|
with:
|
|
@@ -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.22"
|
|
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: "v2.
|
|
20
|
+
rev: "v2.3.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.102.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>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""A suite of AI-powered command-line tools for text correction, audio transcription, and voice assistance."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
__version__: str
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def __getattr__(name: str) -> str:
|
|
10
|
+
"""Resolve `__version__` lazily; reading distribution metadata costs ~29ms."""
|
|
11
|
+
if name == "__version__":
|
|
12
|
+
from importlib.metadata import version # noqa: PLC0415
|
|
13
|
+
|
|
14
|
+
return version("agent-cli")
|
|
15
|
+
msg = f"module {__name__!r} has no attribute {name!r}"
|
|
16
|
+
raise AttributeError(msg)
|
|
@@ -9,7 +9,6 @@ from typing import Annotated, Any
|
|
|
9
9
|
import typer
|
|
10
10
|
from rich.table import Table
|
|
11
11
|
|
|
12
|
-
from . import __version__
|
|
13
12
|
from .config import load_config, normalize_provider_defaults
|
|
14
13
|
from .core.process import set_process_title
|
|
15
14
|
from .core.utils import console
|
|
@@ -49,6 +48,8 @@ app = typer.Typer(
|
|
|
49
48
|
|
|
50
49
|
def _version_callback(value: bool) -> None:
|
|
51
50
|
if value:
|
|
51
|
+
from . import __version__ # noqa: PLC0415
|
|
52
|
+
|
|
52
53
|
path = Path(__file__).parent
|
|
53
54
|
data = [
|
|
54
55
|
("agent-cli version", __version__),
|
|
@@ -89,6 +89,28 @@ def _unidep_cmd(subcommand: str) -> str | None:
|
|
|
89
89
|
return None
|
|
90
90
|
|
|
91
91
|
|
|
92
|
+
def _python_install_commands(install_args: str) -> list[str] | None:
|
|
93
|
+
"""Build install commands using the best available Python installer.
|
|
94
|
+
|
|
95
|
+
Prefers uv (``uv venv`` creates ./.venv, which ``uv pip install`` then
|
|
96
|
+
targets from the working directory), then pip, then pip3. Returns None
|
|
97
|
+
when no installer is available.
|
|
98
|
+
|
|
99
|
+
Evidence: https://docs.astral.sh/uv/pip/environments/ - ``uv venv``
|
|
100
|
+
creates a virtual environment at .venv and ``uv pip install`` installs
|
|
101
|
+
into the .venv in the working directory. Note ``uv pip`` prefers an
|
|
102
|
+
activated environment (VIRTUAL_ENV) over ./.venv, which run_setup()
|
|
103
|
+
handles by clearing VIRTUAL_ENV from the subprocess environment.
|
|
104
|
+
"""
|
|
105
|
+
if shutil.which("uv"):
|
|
106
|
+
return ["uv venv", f"uv pip install {install_args}"]
|
|
107
|
+
if shutil.which("pip"):
|
|
108
|
+
return [f"pip install {install_args}"]
|
|
109
|
+
if shutil.which("pip3"):
|
|
110
|
+
return [f"pip3 install {install_args}"]
|
|
111
|
+
return None
|
|
112
|
+
|
|
113
|
+
|
|
92
114
|
def _detect_unidep_project(path: Path) -> ProjectType | None:
|
|
93
115
|
"""Detect unidep project and determine the appropriate install command.
|
|
94
116
|
|
|
@@ -143,6 +165,29 @@ def _detect_unidep_project(path: Path) -> ProjectType | None:
|
|
|
143
165
|
return None
|
|
144
166
|
|
|
145
167
|
|
|
168
|
+
def _detect_pip_install_project(path: Path) -> ProjectType | None:
|
|
169
|
+
"""Detect pip-installable Python projects, skipped when no installer is available."""
|
|
170
|
+
if (path / "requirements.txt").exists():
|
|
171
|
+
commands = _python_install_commands("-r requirements.txt")
|
|
172
|
+
if commands is not None:
|
|
173
|
+
return ProjectType(
|
|
174
|
+
name="python-pip",
|
|
175
|
+
setup_commands=commands,
|
|
176
|
+
description="Python project with pip",
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
if (path / "pyproject.toml").exists():
|
|
180
|
+
commands = _python_install_commands("-e .")
|
|
181
|
+
if commands is not None:
|
|
182
|
+
return ProjectType(
|
|
183
|
+
name="python",
|
|
184
|
+
setup_commands=commands,
|
|
185
|
+
description="Python project",
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
return None
|
|
189
|
+
|
|
190
|
+
|
|
146
191
|
def detect_project_type(path: Path) -> ProjectType | None: # noqa: PLR0911
|
|
147
192
|
"""Detect the project type based on files present.
|
|
148
193
|
|
|
@@ -181,21 +226,10 @@ def detect_project_type(path: Path) -> ProjectType | None: # noqa: PLR0911
|
|
|
181
226
|
description="Python project with Poetry",
|
|
182
227
|
)
|
|
183
228
|
|
|
184
|
-
# Python with pip/requirements.txt
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
setup_commands=["pip install -r requirements.txt"],
|
|
189
|
-
description="Python project with pip",
|
|
190
|
-
)
|
|
191
|
-
|
|
192
|
-
# Python with pyproject.toml (generic)
|
|
193
|
-
if (path / "pyproject.toml").exists():
|
|
194
|
-
return ProjectType(
|
|
195
|
-
name="python",
|
|
196
|
-
setup_commands=["pip install -e ."],
|
|
197
|
-
description="Python project",
|
|
198
|
-
)
|
|
229
|
+
# Python with pip/requirements.txt or generic pyproject.toml
|
|
230
|
+
pip_project = _detect_pip_install_project(path)
|
|
231
|
+
if pip_project is not None:
|
|
232
|
+
return pip_project
|
|
199
233
|
|
|
200
234
|
# Node.js with pnpm
|
|
201
235
|
if (path / "pnpm-lock.yaml").exists():
|
|
@@ -178,6 +178,15 @@ def _download_tts_models(
|
|
|
178
178
|
console.print("[bold green]Download complete![/bold green]")
|
|
179
179
|
|
|
180
180
|
|
|
181
|
+
def _default_tts_model(backend: str) -> str:
|
|
182
|
+
"""Get the default model or voice for a resolved TTS backend."""
|
|
183
|
+
if backend == "kokoro":
|
|
184
|
+
from agent_cli.server.tts.backends.kokoro import DEFAULT_VOICE # noqa: PLC0415
|
|
185
|
+
|
|
186
|
+
return DEFAULT_VOICE
|
|
187
|
+
return "en_US-lessac-medium"
|
|
188
|
+
|
|
189
|
+
|
|
181
190
|
def _check_whisper_deps(backend: str, *, download_only: bool = False) -> None:
|
|
182
191
|
"""Check that Whisper dependencies are available."""
|
|
183
192
|
_check_server_deps()
|
|
@@ -911,7 +920,7 @@ def tts_cmd( # noqa: PLR0915
|
|
|
911
920
|
|
|
912
921
|
# Default model based on backend (Kokoro auto-downloads from HuggingFace)
|
|
913
922
|
if model is None:
|
|
914
|
-
model = [
|
|
923
|
+
model = [_default_tts_model(resolved_backend)]
|
|
915
924
|
|
|
916
925
|
# Validate default model against model list
|
|
917
926
|
if default_model is not None and default_model not in model:
|
|
@@ -17,9 +17,10 @@ from agent_cli.server.tts.backends.base import (
|
|
|
17
17
|
logger = logging.getLogger(__name__)
|
|
18
18
|
|
|
19
19
|
BackendType = Literal["piper", "kokoro", "auto"]
|
|
20
|
+
ResolvedBackendType = Literal["piper", "kokoro"]
|
|
20
21
|
|
|
21
22
|
|
|
22
|
-
def detect_backend() ->
|
|
23
|
+
def detect_backend() -> ResolvedBackendType:
|
|
23
24
|
"""Detect the best backend for the current platform.
|
|
24
25
|
|
|
25
26
|
Returns:
|
|
@@ -76,6 +77,7 @@ def create_backend(
|
|
|
76
77
|
__all__ = [
|
|
77
78
|
"BackendConfig",
|
|
78
79
|
"BackendType",
|
|
80
|
+
"ResolvedBackendType",
|
|
79
81
|
"SynthesisResult",
|
|
80
82
|
"create_backend",
|
|
81
83
|
"detect_backend",
|
|
@@ -12,8 +12,10 @@ from agent_cli.server.model_manager import ModelConfig, ModelManager, ModelStats
|
|
|
12
12
|
from agent_cli.server.tts.backends import (
|
|
13
13
|
BackendConfig,
|
|
14
14
|
BackendType,
|
|
15
|
+
ResolvedBackendType,
|
|
15
16
|
SynthesisResult,
|
|
16
17
|
create_backend,
|
|
18
|
+
detect_backend,
|
|
17
19
|
)
|
|
18
20
|
|
|
19
21
|
if TYPE_CHECKING:
|
|
@@ -40,16 +42,25 @@ class TTSModelManager:
|
|
|
40
42
|
def __init__(self, config: TTSModelConfig) -> None:
|
|
41
43
|
"""Initialize the TTS model manager."""
|
|
42
44
|
self.config = config
|
|
45
|
+
backend_type: ResolvedBackendType = (
|
|
46
|
+
detect_backend() if config.backend_type == "auto" else config.backend_type
|
|
47
|
+
)
|
|
48
|
+
self._backend_type = backend_type
|
|
43
49
|
backend = create_backend(
|
|
44
50
|
BackendConfig(
|
|
45
51
|
model_name=config.model_name,
|
|
46
52
|
device=config.device,
|
|
47
53
|
cache_dir=config.cache_dir,
|
|
48
54
|
),
|
|
49
|
-
backend_type=
|
|
55
|
+
backend_type=backend_type,
|
|
50
56
|
)
|
|
51
57
|
self._manager = ModelManager(backend, config)
|
|
52
58
|
|
|
59
|
+
@property
|
|
60
|
+
def backend_type(self) -> ResolvedBackendType:
|
|
61
|
+
"""Get the resolved backend type."""
|
|
62
|
+
return self._backend_type
|
|
63
|
+
|
|
53
64
|
@property
|
|
54
65
|
def stats(self) -> ModelStats:
|
|
55
66
|
"""Get the model statistics."""
|
|
@@ -21,6 +21,59 @@ if TYPE_CHECKING:
|
|
|
21
21
|
|
|
22
22
|
logger = logging.getLogger(__name__)
|
|
23
23
|
|
|
24
|
+
_KOKORO_LANGUAGE_TAGS = {
|
|
25
|
+
"a": "en-US",
|
|
26
|
+
"b": "en-GB",
|
|
27
|
+
"e": "es",
|
|
28
|
+
"f": "fr",
|
|
29
|
+
"h": "hi",
|
|
30
|
+
"i": "it",
|
|
31
|
+
"j": "ja",
|
|
32
|
+
"p": "pt-BR",
|
|
33
|
+
"z": "zh",
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _tts_voice(name: str, backend_type: str) -> TtsVoice:
|
|
38
|
+
"""Build Wyoming voice metadata for a registered TTS model."""
|
|
39
|
+
if backend_type == "kokoro":
|
|
40
|
+
prefix, separator, voice_name = name.partition("_")
|
|
41
|
+
is_voice = (
|
|
42
|
+
separator == "_"
|
|
43
|
+
and prefix[:1] in _KOKORO_LANGUAGE_TAGS
|
|
44
|
+
and prefix[1:] in {"f", "m"}
|
|
45
|
+
and bool(voice_name)
|
|
46
|
+
)
|
|
47
|
+
if not is_voice:
|
|
48
|
+
from agent_cli.server.tts.backends.kokoro import DEFAULT_VOICE # noqa: PLC0415
|
|
49
|
+
|
|
50
|
+
name = DEFAULT_VOICE
|
|
51
|
+
language = _KOKORO_LANGUAGE_TAGS[name[0]]
|
|
52
|
+
return TtsVoice(
|
|
53
|
+
name=name,
|
|
54
|
+
description=f"Kokoro TTS {name}",
|
|
55
|
+
attribution=Attribution(
|
|
56
|
+
name="Kokoro",
|
|
57
|
+
url="https://huggingface.co/hexgrad/Kokoro-82M",
|
|
58
|
+
),
|
|
59
|
+
installed=True,
|
|
60
|
+
languages=[language],
|
|
61
|
+
version="1.0",
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
return TtsVoice(
|
|
65
|
+
name=name,
|
|
66
|
+
description=f"Piper TTS {name}",
|
|
67
|
+
attribution=Attribution(
|
|
68
|
+
name="Piper",
|
|
69
|
+
url="https://github.com/rhasspy/piper",
|
|
70
|
+
),
|
|
71
|
+
installed=True,
|
|
72
|
+
# Extract language from model name (e.g., "en_US-lessac-medium" -> "en")
|
|
73
|
+
languages=[name.split("_", maxsplit=1)[0] if "_" in name else "en"],
|
|
74
|
+
version="1.0",
|
|
75
|
+
)
|
|
76
|
+
|
|
24
77
|
|
|
25
78
|
class WyomingTTSHandler(AsyncEventHandler):
|
|
26
79
|
"""Wyoming event handler for TTS.
|
|
@@ -88,11 +141,12 @@ class WyomingTTSHandler(AsyncEventHandler):
|
|
|
88
141
|
|
|
89
142
|
try:
|
|
90
143
|
manager = self._registry.get_manager()
|
|
144
|
+
voice = synthesize.voice.name if synthesize.voice else None
|
|
91
145
|
|
|
92
146
|
if manager.supports_streaming:
|
|
93
|
-
await self._synthesize_streaming(manager, text,
|
|
147
|
+
await self._synthesize_streaming(manager, text, voice)
|
|
94
148
|
else:
|
|
95
|
-
await self._synthesize_complete(manager, text,
|
|
149
|
+
await self._synthesize_complete(manager, text, voice)
|
|
96
150
|
|
|
97
151
|
except Exception:
|
|
98
152
|
logger.exception("Wyoming synthesis failed")
|
|
@@ -194,17 +248,9 @@ class WyomingTTSHandler(AsyncEventHandler):
|
|
|
194
248
|
|
|
195
249
|
# Get list of available models as voices
|
|
196
250
|
voices = [
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
attribution=Attribution(
|
|
201
|
-
name="Piper",
|
|
202
|
-
url="https://github.com/rhasspy/piper",
|
|
203
|
-
),
|
|
204
|
-
installed=True,
|
|
205
|
-
# Extract language from model name (e.g., "en_US-lessac-medium" -> "en")
|
|
206
|
-
languages=[status.name.split("_")[0] if "_" in status.name else "en"],
|
|
207
|
-
version="1.0",
|
|
251
|
+
_tts_voice(
|
|
252
|
+
status.name,
|
|
253
|
+
self._registry.get_manager(status.name).backend_type,
|
|
208
254
|
)
|
|
209
255
|
for status in self._registry.list_status()
|
|
210
256
|
]
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
"kind" : "remoteSourceControl",
|
|
15
15
|
"location" : "https://github.com/sparkle-project/Sparkle",
|
|
16
16
|
"state" : {
|
|
17
|
-
"revision" : "
|
|
18
|
-
"version" : "2.9.
|
|
17
|
+
"revision" : "b6496a74a087257ef5e6da1c5b29a447a60f5bd7",
|
|
18
|
+
"version" : "2.9.4"
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
],
|
|
@@ -12,7 +12,7 @@ let package = Package(
|
|
|
12
12
|
],
|
|
13
13
|
dependencies: [
|
|
14
14
|
.package(url: "https://github.com/sindresorhus/KeyboardShortcuts", exact: "1.10.0"),
|
|
15
|
-
.package(url: "https://github.com/sparkle-project/Sparkle", exact: "2.9.
|
|
15
|
+
.package(url: "https://github.com/sparkle-project/Sparkle", exact: "2.9.4"),
|
|
16
16
|
],
|
|
17
17
|
targets: [
|
|
18
18
|
.executableTarget(
|
|
@@ -27,6 +27,29 @@ private final class UserInstalledCLICheckCache {
|
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
/// Caches the login shell PATH lookup, which costs a full `zsh -lic` startup
|
|
31
|
+
/// (~1s with a typical dotfiles setup) and would otherwise run on every command.
|
|
32
|
+
/// Only successful lookups are cached, so a shell that fails once does not
|
|
33
|
+
/// degrade PATH for the rest of the session.
|
|
34
|
+
private final class LoginShellPATHCache {
|
|
35
|
+
private let lock = NSLock()
|
|
36
|
+
private var resolved: String?
|
|
37
|
+
|
|
38
|
+
func value(compute: () -> String?) -> String? {
|
|
39
|
+
lock.lock()
|
|
40
|
+
defer { lock.unlock() }
|
|
41
|
+
if let resolved {
|
|
42
|
+
return resolved
|
|
43
|
+
}
|
|
44
|
+
resolved = compute()
|
|
45
|
+
return resolved
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
func invalidate() {
|
|
49
|
+
lock.withLock { resolved = nil }
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
30
53
|
typealias AgentProcessRunner = (URL, [String], [String: String]) -> CommandResult
|
|
31
54
|
typealias LocalhostConnector = (UInt16) -> Bool
|
|
32
55
|
|
|
@@ -58,6 +81,7 @@ struct AgentRuntime {
|
|
|
58
81
|
private let processRunner: AgentProcessRunner
|
|
59
82
|
private let localhostConnector: LocalhostConnector
|
|
60
83
|
private let userInstalledCLICheckCache: UserInstalledCLICheckCache
|
|
84
|
+
private let loginShellPATHCache: LoginShellPATHCache
|
|
61
85
|
private let whisperReadyTimeout: TimeInterval
|
|
62
86
|
let appSupportURL: URL
|
|
63
87
|
let bundledUVURL: URL
|
|
@@ -90,6 +114,7 @@ struct AgentRuntime {
|
|
|
90
114
|
self.processRunner = processRunner
|
|
91
115
|
self.localhostConnector = localhostConnector
|
|
92
116
|
self.userInstalledCLICheckCache = UserInstalledCLICheckCache()
|
|
117
|
+
self.loginShellPATHCache = LoginShellPATHCache()
|
|
93
118
|
self.whisperReadyTimeout = whisperReadyTimeout
|
|
94
119
|
|
|
95
120
|
if let override = environment["AGENTCLI_APP_SUPPORT_DIR"], !override.isEmpty {
|
|
@@ -343,6 +368,9 @@ struct AgentRuntime {
|
|
|
343
368
|
progress: AgentBootstrapProgress = { _ in }
|
|
344
369
|
) -> CommandResult {
|
|
345
370
|
let mode = runtimeMode
|
|
371
|
+
if force {
|
|
372
|
+
loginShellPATHCache.invalidate()
|
|
373
|
+
}
|
|
346
374
|
do {
|
|
347
375
|
try prepareDirectories(for: mode)
|
|
348
376
|
} catch {
|
|
@@ -647,7 +675,7 @@ struct AgentRuntime {
|
|
|
647
675
|
let existingPATH = environment["PATH"] ?? "/usr/bin:/bin:/usr/sbin:/sbin"
|
|
648
676
|
environment["PATH"] = userInstalledCLIPath(
|
|
649
677
|
existingPATH: existingPATH,
|
|
650
|
-
loginShellPATH:
|
|
678
|
+
loginShellPATH: loginShellPATHCache.value { loginShellPATH() }
|
|
651
679
|
)
|
|
652
680
|
return environment
|
|
653
681
|
}
|
|
@@ -708,14 +736,14 @@ struct AgentRuntime {
|
|
|
708
736
|
.joined(separator: ":")
|
|
709
737
|
}
|
|
710
738
|
|
|
711
|
-
private
|
|
712
|
-
let shellPath =
|
|
713
|
-
guard
|
|
739
|
+
private func loginShellPATH() -> String? {
|
|
740
|
+
let shellPath = baseEnvironment["SHELL"].flatMap { $0.isEmpty ? nil : $0 } ?? "/bin/zsh"
|
|
741
|
+
guard fileManager.isExecutableFile(atPath: shellPath) else { return nil }
|
|
714
742
|
|
|
715
|
-
let result =
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
743
|
+
let result = processRunner(
|
|
744
|
+
URL(fileURLWithPath: shellPath),
|
|
745
|
+
["-lic", "printf '%s\\n' \"$PATH\""],
|
|
746
|
+
baseEnvironment
|
|
719
747
|
)
|
|
720
748
|
guard result.exitCode == 0 else { return nil }
|
|
721
749
|
|