agent-cli 0.102.1__tar.gz → 0.102.2__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.102.1 → agent_cli-0.102.2}/.github/workflows/release.yml +0 -14
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.pre-commit-config.yaml +5 -2
- {agent_cli-0.102.1 → agent_cli-0.102.2}/PKG-INFO +2 -1
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/diarization.txt +8 -8
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/mlx-whisper.txt +3 -1
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/nemo-whisper.txt +8 -8
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/backends/mlx.py +14 -1
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/README.md +5 -2
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/appcast.xml +27 -17
- {agent_cli-0.102.1 → agent_cli-0.102.2}/pyproject.toml +4 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/conftest.py +24 -4
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_macos_app.py +5 -6
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_mlx_backend.py +67 -1
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_utils.py +42 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/uv.lock +2 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.claude-plugin/README.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.cursorrules +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.dockerignore +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.env.example +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/logo.svg +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/release-drafter.yml +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/renovate.json +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/scripts/normalize_appcast.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/scripts/sync_extras.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/workflows/docker.yml +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/workflows/docs.yml +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/workflows/markdown-code-runner.yml +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/workflows/pytest.yml +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/workflows/release-drafter.yml +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.gitignore +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.jscpd.json +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.prompts/docs-review.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/.prompts/pr-review.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/CLAUDE.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/LICENSE +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/LLAMA_SERVER_USAGE.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/README.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/__main__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_extras.json +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_overrides/nemo-whisper.txt +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/vad.txt +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/vectordb.txt +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/whisper-transformers.txt +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_requirements/wyoming.txt +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/_tools.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/diarize_live_session.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/speakers.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/transcribe.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/transcribe_live.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/api.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/cli.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/config.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/constants.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/alignment.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/deps.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/diarization.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/process.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/speaker_identity.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/utils.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/vad.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/daemon/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/daemon/cli.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/_branch_name.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/_config.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/_output.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/cleanup.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/cli.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/base.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/hooks.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/launch.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/project.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/skill/SKILL.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/cmux.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/registry.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/tmux.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/example-config.toml +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/install/common.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/install/extras.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/install/launchd.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/install/service_config.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/install/services.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/install/systemd.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/opts.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/py.typed +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/cli.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/common.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/proxy/api.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/tts/backends/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/tts/model_manager.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/tts/wyoming_handler.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/backends/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/backends/base.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/backends/nemo.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/backends/transformers.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/model_manager.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/services/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/services/asr.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docker/docker-compose.yml +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docker/memory-proxy.Dockerfile +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docker/rag-proxy.Dockerfile +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docker/transcribe-proxy.Dockerfile +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docker/tts.Dockerfile +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docker/whisper.Dockerfile +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/CNAME +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/architecture/index.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/architecture/memory.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/architecture/rag.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/assistant.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/chat.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/config.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/daemon.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/dev.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/diarize-live-session.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/index.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/install-extras.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/install-services.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/memory.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/server/index.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/server/transcribe-proxy.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/server/whisper.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/speak.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/speakers.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/start-services.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/transcribe-live.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/transcribe.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/configuration.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/getting-started.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/index.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/installation/docker.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/installation/index.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/installation/linux.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/installation/macos-app.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/installation/macos.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/installation/nixos.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/installation/windows.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/logo-avatar.svg +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/logo-clean.svg +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/docs/system-integration.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/justfile +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Package.resolved +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Package.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Resources/Info.plist +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/LiveTranscriptionPreview.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatus.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatusRow.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/MenuActivityTracker.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/ConfigurableHotkeyControllerTests.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/LivePreviewSwiftTestingTests.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/LiveTranscriptionPreviewTests.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/AgentCLI/Tests/AgentCLITests/VoiceLevelMeterTests.swift +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/build-macos-app.sh +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/macos/test-macos-app-e2e.sh +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/reddit.md +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/shell.nix +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_speak.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_speakers.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_transcribe.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_transcribe_agent.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_transcribe_live.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_transcribe_recovery.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_voice_edit.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/core/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/core/test_audio.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/core/test_audio_levels.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/core/test_sse.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/core/test_vad.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/core/test_watch.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_cleanup.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_cli.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_hooks.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_launch.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_project.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_terminals.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_verification.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/install/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/install/test_extras.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/install/test_launchd.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_client.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_files.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_git_integration.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_store.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/mocks/audio.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/mocks/llm.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/__init__.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_api.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_history.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_store.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_alignment.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_api.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_api_integration.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_asr.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_cli.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_config.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_daemon.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_diarization.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_diarize_live_session.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_env_vars.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_faster_whisper_backend.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_json_output.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_llm.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_nemo_backend.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_normalize_appcast.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_process_manager.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_requires_extras.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_server_tts.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_server_tts_wyoming.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_server_whisper.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_services.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_speaker_identity.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_tools.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_transformers_backend.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_tts.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_wake_word.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.102.1 → agent_cli-0.102.2}/zensical.toml +0 -0
|
@@ -126,17 +126,3 @@ jobs:
|
|
|
126
126
|
git commit -m "Update AgentCLI release metadata to ${TAG_NAME}"
|
|
127
127
|
git pull --rebase origin main
|
|
128
128
|
git push origin HEAD:main
|
|
129
|
-
- name: Trigger Homebrew tap update
|
|
130
|
-
env:
|
|
131
|
-
GH_TOKEN: ${{ secrets.HOMEBREW_TAP_DISPATCH_TOKEN }}
|
|
132
|
-
TAG_NAME: ${{ github.event.release.tag_name }}
|
|
133
|
-
run: |
|
|
134
|
-
if [[ -z "$GH_TOKEN" ]]; then
|
|
135
|
-
echo "HOMEBREW_TAP_DISPATCH_TOKEN is required to update basnijholt/homebrew-tap." >&2
|
|
136
|
-
exit 1
|
|
137
|
-
fi
|
|
138
|
-
|
|
139
|
-
gh api repos/basnijholt/homebrew-tap/dispatches \
|
|
140
|
-
-f event_type=agent-cli-release \
|
|
141
|
-
-F "client_payload[tag_name]=$TAG_NAME" \
|
|
142
|
-
-F "client_payload[asset_url]=https://github.com/basnijholt/agent-cli/releases/download/${TAG_NAME}/AgentCLI.dmg"
|
|
@@ -48,14 +48,17 @@ repos:
|
|
|
48
48
|
name: uv lock
|
|
49
49
|
entry: uv lock
|
|
50
50
|
language: python
|
|
51
|
-
|
|
51
|
+
# Pinned: uv export's marker output differs between releases, so an
|
|
52
|
+
# unpinned uv makes agent_cli/_requirements/*.txt depend on whoever's
|
|
53
|
+
# hook cache is freshest.
|
|
54
|
+
additional_dependencies: ["uv==0.11.32"]
|
|
52
55
|
pass_filenames: false
|
|
53
56
|
files: pyproject\.toml
|
|
54
57
|
- id: sync-requirements
|
|
55
58
|
name: sync extra requirements
|
|
56
59
|
entry: python .github/scripts/sync_requirements.py
|
|
57
60
|
language: python
|
|
58
|
-
additional_dependencies: ["uv"]
|
|
61
|
+
additional_dependencies: ["uv==0.11.32"]
|
|
59
62
|
pass_filenames: false
|
|
60
63
|
files: (pyproject\.toml|uv\.lock)
|
|
61
64
|
- id: check-extras-sync
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-cli
|
|
3
|
-
Version: 0.102.
|
|
3
|
+
Version: 0.102.2
|
|
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>
|
|
@@ -61,6 +61,7 @@ Requires-Dist: watchfiles>=0.21.0; extra == 'memory'
|
|
|
61
61
|
Provides-Extra: mlx-whisper
|
|
62
62
|
Requires-Dist: fastapi[standard]; extra == 'mlx-whisper'
|
|
63
63
|
Requires-Dist: mlx-whisper>=0.4.0; (sys_platform == 'darwin' and platform_machine == 'arm64') and extra == 'mlx-whisper'
|
|
64
|
+
Requires-Dist: mlx>=0.24; (sys_platform == 'darwin' and platform_machine == 'arm64') and extra == 'mlx-whisper'
|
|
64
65
|
Provides-Extra: nemo-whisper
|
|
65
66
|
Requires-Dist: fastapi[standard]; extra == 'nemo-whisper'
|
|
66
67
|
Requires-Dist: nemo-toolkit[asr]>=2.2.0; (python_version < '3.14') and extra == 'nemo-whisper'
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# This file was autogenerated by uv via the following command:
|
|
2
2
|
# uv export --extra diarization --no-dev --no-emit-project --no-hashes
|
|
3
|
-
aiohappyeyeballs==2.6.2
|
|
3
|
+
aiohappyeyeballs==2.6.2 ; python_full_version < '3.13'
|
|
4
4
|
# via aiohttp
|
|
5
|
-
aiohttp==3.13.5
|
|
5
|
+
aiohttp==3.13.5 ; python_full_version < '3.13'
|
|
6
6
|
# via fsspec
|
|
7
|
-
aiosignal==1.4.0
|
|
7
|
+
aiosignal==1.4.0 ; python_full_version < '3.13'
|
|
8
8
|
# via aiohttp
|
|
9
9
|
alembic==1.18.4
|
|
10
10
|
# via optuna
|
|
@@ -18,7 +18,7 @@ anyio==4.13.0
|
|
|
18
18
|
# via httpx
|
|
19
19
|
asteroid-filterbanks==0.4.0
|
|
20
20
|
# via pyannote-audio
|
|
21
|
-
attrs==26.1.0
|
|
21
|
+
attrs==26.1.0 ; python_full_version < '3.13'
|
|
22
22
|
# via aiohttp
|
|
23
23
|
certifi==2026.5.20
|
|
24
24
|
# via
|
|
@@ -61,7 +61,7 @@ filelock==3.29.0
|
|
|
61
61
|
# torch
|
|
62
62
|
fonttools==4.63.0
|
|
63
63
|
# via matplotlib
|
|
64
|
-
frozenlist==1.8.0
|
|
64
|
+
frozenlist==1.8.0 ; python_full_version < '3.13'
|
|
65
65
|
# via
|
|
66
66
|
# aiohttp
|
|
67
67
|
# aiosignal
|
|
@@ -136,7 +136,7 @@ mdurl==0.1.2
|
|
|
136
136
|
# via markdown-it-py
|
|
137
137
|
mpmath==1.3.0
|
|
138
138
|
# via sympy
|
|
139
|
-
multidict==6.7.1
|
|
139
|
+
multidict==6.7.1 ; python_full_version < '3.13'
|
|
140
140
|
# via
|
|
141
141
|
# aiohttp
|
|
142
142
|
# yarl
|
|
@@ -267,7 +267,7 @@ pillow==12.2.0
|
|
|
267
267
|
# via matplotlib
|
|
268
268
|
primepy==1.3
|
|
269
269
|
# via torch-pitch-shift
|
|
270
|
-
propcache==0.5.2
|
|
270
|
+
propcache==0.5.2 ; python_full_version < '3.13'
|
|
271
271
|
# via
|
|
272
272
|
# aiohttp
|
|
273
273
|
# yarl
|
|
@@ -480,5 +480,5 @@ tzdata==2026.2 ; sys_platform == 'emscripten' or sys_platform == 'win32'
|
|
|
480
480
|
# via pandas
|
|
481
481
|
urllib3==2.7.0
|
|
482
482
|
# via requests
|
|
483
|
-
yarl==1.24.2
|
|
483
|
+
yarl==1.24.2 ; python_full_version < '3.13'
|
|
484
484
|
# via aiohttp
|
|
@@ -98,7 +98,9 @@ markupsafe==3.0.3
|
|
|
98
98
|
mdurl==0.1.2
|
|
99
99
|
# via markdown-it-py
|
|
100
100
|
mlx==0.31.2 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
101
|
-
# via
|
|
101
|
+
# via
|
|
102
|
+
# agent-cli
|
|
103
|
+
# mlx-whisper
|
|
102
104
|
mlx-metal==0.31.2 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
103
105
|
# via mlx
|
|
104
106
|
mlx-whisper==0.4.3 ; platform_machine == 'arm64' and sys_platform == 'darwin'
|
|
@@ -6,11 +6,11 @@ absl-py==2.4.0 ; python_full_version < '3.14'
|
|
|
6
6
|
# tensorboard
|
|
7
7
|
accelerate==1.13.0 ; python_full_version < '3.14'
|
|
8
8
|
# via peft
|
|
9
|
-
aiohappyeyeballs==2.6.2 ; python_full_version < '3.
|
|
9
|
+
aiohappyeyeballs==2.6.2 ; python_full_version < '3.13'
|
|
10
10
|
# via aiohttp
|
|
11
|
-
aiohttp==3.13.5 ; python_full_version < '3.
|
|
11
|
+
aiohttp==3.13.5 ; python_full_version < '3.13'
|
|
12
12
|
# via fsspec
|
|
13
|
-
aiosignal==1.4.0 ; python_full_version < '3.
|
|
13
|
+
aiosignal==1.4.0 ; python_full_version < '3.13'
|
|
14
14
|
# via aiohttp
|
|
15
15
|
alembic==1.18.4 ; python_full_version < '3.14'
|
|
16
16
|
# via optuna
|
|
@@ -31,7 +31,7 @@ anyio==4.13.0
|
|
|
31
31
|
# watchfiles
|
|
32
32
|
asttokens==3.0.1 ; python_full_version < '3.14'
|
|
33
33
|
# via stack-data
|
|
34
|
-
attrs==26.1.0 ; python_full_version < '3.
|
|
34
|
+
attrs==26.1.0 ; python_full_version < '3.13'
|
|
35
35
|
# via aiohttp
|
|
36
36
|
audioop-lts==0.2.2 ; python_full_version == '3.13.*'
|
|
37
37
|
# via
|
|
@@ -146,7 +146,7 @@ filelock==3.29.0 ; python_full_version < '3.14'
|
|
|
146
146
|
# transformers
|
|
147
147
|
fonttools==4.63.0 ; python_full_version < '3.14'
|
|
148
148
|
# via matplotlib
|
|
149
|
-
frozenlist==1.8.0 ; python_full_version < '3.
|
|
149
|
+
frozenlist==1.8.0 ; python_full_version < '3.13'
|
|
150
150
|
# via
|
|
151
151
|
# aiohttp
|
|
152
152
|
# aiosignal
|
|
@@ -308,7 +308,7 @@ mpmath==1.3.0 ; python_full_version < '3.14'
|
|
|
308
308
|
# via sympy
|
|
309
309
|
msgpack==1.1.2 ; python_full_version < '3.14'
|
|
310
310
|
# via librosa
|
|
311
|
-
multidict==6.7.1 ; python_full_version < '3.
|
|
311
|
+
multidict==6.7.1 ; python_full_version < '3.13'
|
|
312
312
|
# via
|
|
313
313
|
# aiohttp
|
|
314
314
|
# yarl
|
|
@@ -515,7 +515,7 @@ portalocker==3.2.0 ; python_full_version == '3.13.*'
|
|
|
515
515
|
# via sacrebleu
|
|
516
516
|
prompt-toolkit==3.0.52 ; python_full_version < '3.14'
|
|
517
517
|
# via ipython
|
|
518
|
-
propcache==0.5.2 ; python_full_version < '3.
|
|
518
|
+
propcache==0.5.2 ; python_full_version < '3.13'
|
|
519
519
|
# via
|
|
520
520
|
# aiohttp
|
|
521
521
|
# yarl
|
|
@@ -888,5 +888,5 @@ wrapt==2.2.1 ; python_full_version < '3.14'
|
|
|
888
888
|
# via nemo-toolkit
|
|
889
889
|
xxhash==3.7.0 ; python_full_version < '3.14'
|
|
890
890
|
# via datasets
|
|
891
|
-
yarl==1.24.2 ; python_full_version < '3.
|
|
891
|
+
yarl==1.24.2 ; python_full_version < '3.13'
|
|
892
892
|
# via aiohttp
|
|
@@ -135,11 +135,24 @@ def _transcribe_in_subprocess(
|
|
|
135
135
|
kwargs: dict[str, Any],
|
|
136
136
|
) -> dict[str, Any]:
|
|
137
137
|
"""Run transcription in subprocess. Model stays loaded between calls."""
|
|
138
|
+
import mlx.core as mx # noqa: PLC0415
|
|
138
139
|
import mlx_whisper # noqa: PLC0415
|
|
139
140
|
import numpy as np # noqa: PLC0415
|
|
140
141
|
|
|
141
142
|
audio_array = np.frombuffer(audio_bytes, dtype=audio_dtype).reshape(audio_shape)
|
|
142
|
-
|
|
143
|
+
try:
|
|
144
|
+
result = mlx_whisper.transcribe(audio_array, path_or_hf_repo=model_name, **kwargs)
|
|
145
|
+
finally:
|
|
146
|
+
# Release MLX's reusable Metal buffer cache after each request. With --ttl 0
|
|
147
|
+
# the subprocess is never recycled, so without this the cache grows to the
|
|
148
|
+
# largest working set ever seen and gets pushed to swap, degrading latency.
|
|
149
|
+
# clear_cache() frees only the cache, NOT live arrays, so the loaded model
|
|
150
|
+
# weights stay resident and inference stays hot (no cold reload).
|
|
151
|
+
# In finally so a failed transcription also releases the buffers it
|
|
152
|
+
# allocated; otherwise the long-lived worker would retain them.
|
|
153
|
+
# Top-level clear_cache() needs mlx>=0.24 (pinned in the mlx-whisper
|
|
154
|
+
# extra); older releases only expose mx.metal.clear_cache().
|
|
155
|
+
mx.clear_cache()
|
|
143
156
|
|
|
144
157
|
return {
|
|
145
158
|
"text": result.get("text", ""),
|
|
@@ -111,8 +111,11 @@ workflow expects these repository secrets:
|
|
|
111
111
|
- `APPLE_APP_SPECIFIC_PASSWORD`: app-specific password for `notarytool`
|
|
112
112
|
- `APPLE_TEAM_ID`: Apple Developer Team ID
|
|
113
113
|
- `SPARKLE_PRIVATE_ED_KEY`: private Sparkle EdDSA key for signing updates
|
|
114
|
-
|
|
115
|
-
|
|
114
|
+
|
|
115
|
+
The Homebrew cask is not published from here. `basnijholt/homebrew-tap` runs a
|
|
116
|
+
daily cron that reads the latest release and bumps `Casks/agent-cli.rb` itself;
|
|
117
|
+
run it on demand with
|
|
118
|
+
`gh workflow run update-agent-cli-cask.yml --repo basnijholt/homebrew-tap`.
|
|
116
119
|
|
|
117
120
|
The workflow also expects the repository variable `SPARKLE_PUBLIC_ED_KEY`.
|
|
118
121
|
Generate the key pair with Sparkle's `generate_keys` tool and store only the
|
|
@@ -4,6 +4,33 @@
|
|
|
4
4
|
<title>Agent CLI Updates</title>
|
|
5
5
|
<link>https://github.com/basnijholt/agent-cli</link>
|
|
6
6
|
<description>Signed Agent CLI macOS app updates.</description>
|
|
7
|
+
<item>
|
|
8
|
+
<title>0.102.1</title>
|
|
9
|
+
<pubDate>Sat, 25 Jul 2026 18:58:28 +0000</pubDate>
|
|
10
|
+
<link>https://github.com/basnijholt/agent-cli</link>
|
|
11
|
+
<sparkle:version>198</sparkle:version>
|
|
12
|
+
<sparkle:shortVersionString>0.102.1</sparkle:shortVersionString>
|
|
13
|
+
<sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
|
|
14
|
+
<sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
|
|
15
|
+
<description sparkle:format="markdown"><![CDATA[## Bug fixes
|
|
16
|
+
|
|
17
|
+
* **Transcription now starts ~1.3s sooner after pressing the hotkey.** The macOS app spawned a login + interactive shell (`zsh -lic`) to discover `PATH` on *every* command it ran, costing 1.1–1.4s with a typical dotfiles setup. The recording pill appeared immediately but the microphone did not open until that shell finished, so speaking right away lost the first words. The login shell `PATH` is now resolved once per app launch, during the existing startup warm-up. Measured hotkey to first audio chunk: ~1.8s → ~0.4–0.6s. (#622)
|
|
18
|
+
* Only successful lookups are cached, so a login shell that fails once does not leave the app on a degraded `PATH` for the rest of the session.
|
|
19
|
+
* *Install or Update CLI* still re-probes, so a relocated `agent-cli` binary is picked up without restarting the app.
|
|
20
|
+
|
|
21
|
+
## Performance
|
|
22
|
+
|
|
23
|
+
* `agent-cli` no longer reads its own distribution metadata on startup. `__version__` resolves lazily, saving ~29ms on every command. (#622)
|
|
24
|
+
|
|
25
|
+
## Maintenance
|
|
26
|
+
|
|
27
|
+
* ⬆️ Update docker/login-action to v4.5.1 (#621, #619)
|
|
28
|
+
* ⬆️ Update actions/checkout to v7.0.1 (#617)
|
|
29
|
+
* ⬆️ Update release-drafter/release-drafter to v7.6.0 (#614)
|
|
30
|
+
* [pre-commit.ci] pre-commit autoupdate (#616)
|
|
31
|
+
]]></description>
|
|
32
|
+
<enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.102.1/AgentCLI.zip" length="24329452" type="application/octet-stream" sparkle:edSignature="MQizz/9FfhxJGKQc6I/XXtIUBLVPh20yWi/kvfE7xBpoQGPF4yE4C0T1Ex1WpU3im/vRLrMIbZMv0+yHYTifBQ=="/>
|
|
33
|
+
</item>
|
|
7
34
|
<item>
|
|
8
35
|
<title>0.102.0</title>
|
|
9
36
|
<pubDate>Tue, 14 Jul 2026 05:57:01 +0000</pubDate>
|
|
@@ -163,22 +190,5 @@
|
|
|
163
190
|
]]></description>
|
|
164
191
|
<enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.98.1/AgentCLI.zip" length="22896191" type="application/octet-stream" sparkle:edSignature="4g9PD/is1i4Htq5eM2TfAUjxEaXSb7xJJDjnliSfX5TQfqeLLsItUcaCLbhpXaOKqzq0YByVg5SLSpqHK08vAw=="/>
|
|
165
192
|
</item>
|
|
166
|
-
<item>
|
|
167
|
-
<title>0.98.0</title>
|
|
168
|
-
<pubDate>Thu, 04 Jun 2026 16:25:34 +0000</pubDate>
|
|
169
|
-
<link>https://github.com/basnijholt/agent-cli</link>
|
|
170
|
-
<sparkle:version>188</sparkle:version>
|
|
171
|
-
<sparkle:shortVersionString>0.98.0</sparkle:shortVersionString>
|
|
172
|
-
<sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
|
|
173
|
-
<sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
|
|
174
|
-
<description sparkle:format="markdown"><![CDATA[## What’s Changed
|
|
175
|
-
|
|
176
|
-
* Document NeMo Parakeet setup (#573) @basnijholt
|
|
177
|
-
* Add macOS transcription backend picker (#574) @basnijholt
|
|
178
|
-
* Reference upstream NeMo validation_ds fix (#577) @basnijholt
|
|
179
|
-
|
|
180
|
-
]]></description>
|
|
181
|
-
<enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.98.0/AgentCLI.zip" length="22891739" type="application/octet-stream" sparkle:edSignature="tC7V5Z+r9fyFe5GvISxKB2ExZJoyx8G7Qt/Zqnb1ELJcU6lm+0KSN3tx7d/BBm1Dbl8eKRiCorOATkTKE2HSCw=="/>
|
|
182
|
-
</item>
|
|
183
193
|
</channel>
|
|
184
194
|
</rss>
|
|
@@ -60,6 +60,10 @@ faster-whisper = ["agent-cli[server]", "faster-whisper>=1.0.0", "ctranslate2>=4.
|
|
|
60
60
|
mlx-whisper = [
|
|
61
61
|
"agent-cli[server]; sys_platform == 'darwin' and platform_machine == 'arm64'",
|
|
62
62
|
"mlx-whisper>=0.4.0; sys_platform == 'darwin' and platform_machine == 'arm64'",
|
|
63
|
+
# mlx-whisper only requires mlx>=0.11, but the MLX backend calls the
|
|
64
|
+
# top-level mx.clear_cache(), which does not exist before mlx 0.24
|
|
65
|
+
# (0.23.2 and older only expose the deprecated mx.metal.clear_cache).
|
|
66
|
+
"mlx>=0.24; sys_platform == 'darwin' and platform_machine == 'arm64'",
|
|
63
67
|
]
|
|
64
68
|
whisper-transformers = ["agent-cli[server]", "transformers>=4.30.0", "torch>=2.0.0"]
|
|
65
69
|
nemo-whisper = [
|
|
@@ -55,11 +55,31 @@ def mock_console() -> Console:
|
|
|
55
55
|
return Console(file=io.StringIO(), width=80, force_terminal=True)
|
|
56
56
|
|
|
57
57
|
|
|
58
|
+
def force_plain_console(console: Console) -> None:
|
|
59
|
+
"""Make a console audible and strip every escape sequence from its output.
|
|
60
|
+
|
|
61
|
+
`no_color` alone still emits bold and dim, so the colour system is switched
|
|
62
|
+
off outright.
|
|
63
|
+
"""
|
|
64
|
+
console.quiet = False
|
|
65
|
+
console.no_color = True
|
|
66
|
+
console._color_system = None
|
|
67
|
+
|
|
68
|
+
|
|
58
69
|
@pytest.fixture(autouse=True)
|
|
59
|
-
def
|
|
60
|
-
"""
|
|
61
|
-
|
|
62
|
-
|
|
70
|
+
def reset_rich_console_state() -> None:
|
|
71
|
+
"""Keep the shared consoles audible and plain for every test.
|
|
72
|
+
|
|
73
|
+
`quiet` is reset so JSON-mode CLI tests cannot silence later command output.
|
|
74
|
+
|
|
75
|
+
Colour is disabled because Rich honours `FORCE_COLOR` even when stdout is
|
|
76
|
+
captured, so a developer shell exporting it makes 29 tests fail on ANSI
|
|
77
|
+
escapes interleaved into otherwise-matching output. The consoles are mutated
|
|
78
|
+
in place rather than rebound: 17 modules hold a direct
|
|
79
|
+
`from agent_cli.core.utils import console` reference.
|
|
80
|
+
"""
|
|
81
|
+
for console in (utils.console, utils.err_console):
|
|
82
|
+
force_plain_console(console)
|
|
63
83
|
|
|
64
84
|
|
|
65
85
|
@pytest.fixture
|
|
@@ -346,12 +346,11 @@ def test_release_workflow_publishes_macos_app_asset() -> None:
|
|
|
346
346
|
assert "NOTARIZE=1" in workflow
|
|
347
347
|
assert "gh release upload" in workflow
|
|
348
348
|
assert "dist/macos/AgentCLI.dmg" in workflow
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
assert "
|
|
353
|
-
assert "
|
|
354
|
-
assert "client_payload[asset_url]" in workflow
|
|
349
|
+
# The tap owns its own updates: basnijholt/homebrew-tap runs a daily cron that
|
|
350
|
+
# reads the latest release. Dispatching from here only duplicated that with an
|
|
351
|
+
# expiring cross-repo token, whose 401 turned every release run red.
|
|
352
|
+
assert "HOMEBREW_TAP_DISPATCH_TOKEN" not in workflow
|
|
353
|
+
assert "repos/basnijholt/homebrew-tap/dispatches" not in workflow
|
|
355
354
|
assert "python3 .github/scripts/normalize_appcast.py macos/appcast.xml" in workflow
|
|
356
355
|
assert workflow.index(
|
|
357
356
|
"python3 .github/scripts/normalize_appcast.py macos/appcast.xml"
|
|
@@ -7,10 +7,14 @@ import wave
|
|
|
7
7
|
from typing import Any
|
|
8
8
|
from unittest.mock import MagicMock, patch
|
|
9
9
|
|
|
10
|
+
import numpy as np
|
|
10
11
|
import pytest
|
|
11
12
|
|
|
12
13
|
from agent_cli.server.whisper.backends.base import BackendConfig
|
|
13
|
-
from agent_cli.server.whisper.backends.mlx import
|
|
14
|
+
from agent_cli.server.whisper.backends.mlx import (
|
|
15
|
+
MLXWhisperBackend,
|
|
16
|
+
_transcribe_in_subprocess,
|
|
17
|
+
)
|
|
14
18
|
|
|
15
19
|
|
|
16
20
|
def _make_wav_bytes(
|
|
@@ -78,3 +82,65 @@ async def test_mlx_transcribe_accepts_matching_wav() -> None:
|
|
|
78
82
|
|
|
79
83
|
mock_convert.assert_not_called()
|
|
80
84
|
assert result.text == "hello"
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def test_transcribe_in_subprocess_clears_metal_cache() -> None:
|
|
88
|
+
"""_transcribe_in_subprocess must release MLX's Metal buffer cache.
|
|
89
|
+
|
|
90
|
+
Regression test for the --ttl 0 memory leak: without mx.clear_cache() the
|
|
91
|
+
long-lived subprocess never releases the Metal buffer cache, so it grows to
|
|
92
|
+
the largest working set ever seen and gets pushed to swap.
|
|
93
|
+
"""
|
|
94
|
+
audio = np.zeros(160, dtype=np.float32)
|
|
95
|
+
fake_result = {"text": "hi", "language": "en", "segments": []}
|
|
96
|
+
|
|
97
|
+
fake_mx = MagicMock()
|
|
98
|
+
fake_mlx_whisper = MagicMock()
|
|
99
|
+
fake_mlx_whisper.transcribe.return_value = fake_result
|
|
100
|
+
|
|
101
|
+
with patch.dict(
|
|
102
|
+
"sys.modules",
|
|
103
|
+
{"mlx": MagicMock(core=fake_mx), "mlx.core": fake_mx, "mlx_whisper": fake_mlx_whisper},
|
|
104
|
+
):
|
|
105
|
+
result = _transcribe_in_subprocess(
|
|
106
|
+
"mlx-community/whisper-large-v3-mlx",
|
|
107
|
+
audio.tobytes(),
|
|
108
|
+
audio.shape,
|
|
109
|
+
str(audio.dtype),
|
|
110
|
+
{"temperature": 0.0},
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
fake_mlx_whisper.transcribe.assert_called_once()
|
|
114
|
+
fake_mx.clear_cache.assert_called_once_with()
|
|
115
|
+
assert result["text"] == "hi"
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def test_transcribe_in_subprocess_clears_cache_on_failure() -> None:
|
|
119
|
+
"""A failed transcription must still release the Metal buffer cache.
|
|
120
|
+
|
|
121
|
+
The worker subprocess is long-lived under --ttl 0, so buffers allocated by a
|
|
122
|
+
transcription that raises would otherwise leak. clear_cache() runs in a
|
|
123
|
+
finally block, so it must fire even when mlx_whisper.transcribe raises.
|
|
124
|
+
"""
|
|
125
|
+
audio = np.zeros(160, dtype=np.float32)
|
|
126
|
+
|
|
127
|
+
fake_mx = MagicMock()
|
|
128
|
+
fake_mlx_whisper = MagicMock()
|
|
129
|
+
fake_mlx_whisper.transcribe.side_effect = RuntimeError("boom")
|
|
130
|
+
|
|
131
|
+
with (
|
|
132
|
+
patch.dict(
|
|
133
|
+
"sys.modules",
|
|
134
|
+
{"mlx": MagicMock(core=fake_mx), "mlx.core": fake_mx, "mlx_whisper": fake_mlx_whisper},
|
|
135
|
+
),
|
|
136
|
+
pytest.raises(RuntimeError, match="boom"),
|
|
137
|
+
):
|
|
138
|
+
_transcribe_in_subprocess(
|
|
139
|
+
"mlx-community/whisper-large-v3-mlx",
|
|
140
|
+
audio.tobytes(),
|
|
141
|
+
audio.shape,
|
|
142
|
+
str(audio.dtype),
|
|
143
|
+
{"temperature": 0.0},
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
fake_mx.clear_cache.assert_called_once_with()
|
|
@@ -7,8 +7,10 @@ from datetime import timedelta
|
|
|
7
7
|
from unittest.mock import Mock, patch
|
|
8
8
|
|
|
9
9
|
import pytest
|
|
10
|
+
from rich.console import ColorSystem
|
|
10
11
|
|
|
11
12
|
from agent_cli.core import process, utils
|
|
13
|
+
from tests.conftest import force_plain_console
|
|
12
14
|
|
|
13
15
|
|
|
14
16
|
@pytest.mark.parametrize(
|
|
@@ -208,3 +210,43 @@ async def test_signal_handling_context_uses_sync_handlers_on_windows(
|
|
|
208
210
|
assert signal.getsignal(signal.SIGINT) is prev_sigint
|
|
209
211
|
assert signal.getsignal(signal.SIGTERM) is prev_sigterm
|
|
210
212
|
logger.debug.assert_called()
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def test_shared_consoles_render_without_ansi(capsys: pytest.CaptureFixture[str]) -> None:
|
|
216
|
+
"""Rich honours FORCE_COLOR even into captured output, breaking substring asserts.
|
|
217
|
+
|
|
218
|
+
The autouse `reset_rich_console_state` fixture must keep both shared consoles
|
|
219
|
+
colourless so the suite passes regardless of the developer's shell.
|
|
220
|
+
"""
|
|
221
|
+
assert utils.console.color_system is None
|
|
222
|
+
assert utils.err_console.color_system is None
|
|
223
|
+
|
|
224
|
+
utils.console.print("[bold red]stdout text[/bold red]")
|
|
225
|
+
utils.err_console.print("[dim]stderr text[/dim]")
|
|
226
|
+
|
|
227
|
+
captured = capsys.readouterr()
|
|
228
|
+
assert captured.out == "stdout text\n"
|
|
229
|
+
assert captured.err == "stderr text\n"
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
@pytest.mark.parametrize("stream", ["console", "err_console"])
|
|
233
|
+
def test_force_plain_console_strips_forced_colour(
|
|
234
|
+
stream: str,
|
|
235
|
+
capsys: pytest.CaptureFixture[str],
|
|
236
|
+
) -> None:
|
|
237
|
+
"""Reproduce a FORCE_COLOR shell rather than trusting the ambient environment.
|
|
238
|
+
|
|
239
|
+
Without this the coverage above is vacuous wherever Rich already detects a
|
|
240
|
+
colourless stream, which is every CI runner. Mutating the shared console is
|
|
241
|
+
safe: the autouse fixture restores it before the next test.
|
|
242
|
+
"""
|
|
243
|
+
console = getattr(utils, stream)
|
|
244
|
+
console.no_color = False
|
|
245
|
+
console._color_system = ColorSystem.TRUECOLOR
|
|
246
|
+
assert console.color_system == "truecolor"
|
|
247
|
+
|
|
248
|
+
force_plain_console(console)
|
|
249
|
+
|
|
250
|
+
console.print("[bold red]coloured[/bold red]")
|
|
251
|
+
captured = capsys.readouterr()
|
|
252
|
+
assert (captured.err if stream == "err_console" else captured.out) == "coloured\n"
|
|
@@ -138,6 +138,7 @@ memory = [
|
|
|
138
138
|
]
|
|
139
139
|
mlx-whisper = [
|
|
140
140
|
{ name = "fastapi", extra = ["standard"] },
|
|
141
|
+
{ name = "mlx", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" },
|
|
141
142
|
{ name = "mlx-whisper", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" },
|
|
142
143
|
]
|
|
143
144
|
nemo-whisper = [
|
|
@@ -246,6 +247,7 @@ requires-dist = [
|
|
|
246
247
|
{ name = "markdown-code-runner", marker = "extra == 'dev'", specifier = ">=2.7.0" },
|
|
247
248
|
{ name = "markdown-gfm-admonition", marker = "extra == 'dev'" },
|
|
248
249
|
{ name = "markitdown", extras = ["docx", "pdf", "pptx"], marker = "extra == 'rag'", specifier = ">=0.1.3" },
|
|
250
|
+
{ name = "mlx", marker = "platform_machine == 'arm64' and sys_platform == 'darwin' and extra == 'mlx-whisper'", specifier = ">=0.24" },
|
|
249
251
|
{ name = "mlx-whisper", marker = "platform_machine == 'arm64' and sys_platform == 'darwin' and extra == 'mlx-whisper'", specifier = ">=0.4.0" },
|
|
250
252
|
{ name = "nemo-toolkit", extras = ["asr"], marker = "python_full_version < '3.14' and extra == 'nemo-whisper'", specifier = ">=2.2.0" },
|
|
251
253
|
{ name = "notebook", marker = "extra == 'dev'" },
|
|
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
|