agent-cli 0.106.0__tar.gz → 0.107.0__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.106.0 → agent_cli-0.107.0}/PKG-INFO +1 -1
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +3 -1
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +2 -1
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +104 -9
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +13 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/VoiceLevelMeterTests.swift +92 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/appcast.xml +27 -33
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.claude-plugin/README.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.cursorrules +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.dockerignore +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.env.example +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/logo.svg +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/release-drafter.yml +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/renovate.json +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/scripts/normalize_appcast.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/scripts/sync_extras.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/workflows/docker.yml +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/workflows/docs.yml +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/workflows/markdown-code-runner.yml +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/workflows/pytest.yml +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/workflows/release-drafter.yml +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/workflows/release.yml +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.gitignore +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.jscpd.json +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.pre-commit-config.yaml +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.prompts/docs-review.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/.prompts/pr-review.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/CLAUDE.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/LICENSE +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/LLAMA_SERVER_USAGE.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/README.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/__main__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_extras.json +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_overrides/nemo-whisper.txt +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/diarization.txt +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/mlx-whisper.txt +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/nemo-whisper.txt +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/vad.txt +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/vectordb.txt +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/whisper-transformers.txt +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_requirements/wyoming.txt +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/_tools.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/diarize_live_session.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/speakers.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/transcribe.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/transcribe_live.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/api.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/cli.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/config.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/constants.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/alignment.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/deps.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/diarization.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/process.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/speaker_identity.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/utils.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/vad.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/daemon/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/daemon/cli.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/_branch_name.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/_config.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/_output.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/cleanup.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/cli.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/base.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/hooks.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/launch.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/project.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/skill/SKILL.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/cmux.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/registry.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/tmux.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/example-config.toml +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/install/common.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/install/extras.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/install/launchd.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/install/service_config.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/install/services.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/install/systemd.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/opts.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/py.typed +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/cli.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/common.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/proxy/api.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/proxy/diarization.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/tts/backends/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/tts/model_manager.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/tts/wyoming_handler.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/backends/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/backends/audio.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/backends/base.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/backends/mlx.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/backends/nemo.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/backends/transformers.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/model_manager.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/services/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/services/asr.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docker/diarization.Dockerfile +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docker/docker-compose.yml +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docker/memory-proxy.Dockerfile +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docker/rag-proxy.Dockerfile +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docker/transcribe-proxy.Dockerfile +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docker/tts.Dockerfile +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docker/whisper.Dockerfile +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/CNAME +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/architecture/index.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/architecture/memory.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/architecture/rag.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/assistant.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/chat.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/config.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/daemon.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/dev.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/diarize-live-session.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/index.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/install-extras.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/install-services.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/memory.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/server/index.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/server/transcribe-proxy.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/server/whisper.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/speak.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/speakers.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/start-services.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/transcribe-live.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/transcribe.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/configuration.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/getting-started.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/index.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/installation/docker.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/installation/index.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/installation/linux.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/installation/macos-app.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/installation/macos.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/installation/nixos.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/installation/windows.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/logo-avatar.svg +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/logo-clean.svg +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/docs/system-integration.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/justfile +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Package.resolved +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Package.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/README.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Resources/Info.plist +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/LiveTranscriptionPreview.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatus.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatusRow.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/MenuActivityTracker.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/ConfigurableHotkeyControllerTests.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/LivePreviewSwiftTestingTests.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/LiveTranscriptionPreviewTests.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Tests/AgentCLITests/TranscriptionResultTests.swift +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/build-macos-app.sh +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/macos/test-macos-app-e2e.sh +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/pyproject.toml +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/reddit.md +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/shell.nix +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_speak.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_speakers.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_transcribe.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_transcribe_agent.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_transcribe_live.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_transcribe_recovery.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_voice_edit.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/conftest.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/core/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/core/test_audio.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/core/test_audio_levels.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/core/test_sse.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/core/test_vad.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/core/test_watch.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_cleanup.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_cli.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_hooks.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_launch.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_project.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_terminals.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_verification.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/install/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/install/test_extras.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/install/test_launchd.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_client.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_files.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_git_integration.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_store.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/mocks/audio.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/mocks/llm.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/__init__.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_api.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_history.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_store.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_alignment.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_api.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_api_integration.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_asr.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_cli.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_config.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_daemon.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_diarization.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_diarize_live_session.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_env_vars.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_faster_whisper_backend.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_json_output.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_llm.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_macos_app.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_mlx_backend.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_nemo_backend.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_normalize_appcast.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_process_manager.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_proxy_diarization.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_requires_extras.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_server_tts.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_server_tts_wyoming.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_server_whisper.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_server_whisper_wyoming.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_services.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_speaker_identity.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_tools.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_transformers_backend.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_tts.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_utils.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_wake_word.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_whisper_backend_audio.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/uv.lock +0 -0
- {agent_cli-0.106.0 → agent_cli-0.107.0}/zensical.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: agent-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.107.0
|
|
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>
|
{agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift
RENAMED
|
@@ -161,13 +161,13 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
161
161
|
holdTranscriptionState = .stopping
|
|
162
162
|
|
|
163
163
|
let wasRecording = recordingIndicator.isRecordingCommand(.toggleTranscription)
|
|
164
|
-
beginTranscribingActivity()
|
|
165
164
|
if wasRecording {
|
|
166
165
|
endRecordingIndicator(for: .toggleTranscription)
|
|
167
166
|
statusMessage = "Transcribing..."
|
|
168
167
|
} else {
|
|
169
168
|
statusMessage = "Stopping transcription as soon as it starts..."
|
|
170
169
|
}
|
|
170
|
+
beginTranscribingActivity()
|
|
171
171
|
stopHeldTranscriptionWhenReady()
|
|
172
172
|
}
|
|
173
173
|
|
|
@@ -386,11 +386,13 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
386
386
|
|
|
387
387
|
private func beginTranscribingActivity() {
|
|
388
388
|
activityTracker.beginTranscribing()
|
|
389
|
+
VoiceLevelOverlayController.shared.showTranscribing()
|
|
389
390
|
}
|
|
390
391
|
|
|
391
392
|
private func clearTranscribingActivityIfFinished() {
|
|
392
393
|
if pendingStopRecordingCommands.isEmpty && !holdTranscriptionState.isFinishing {
|
|
393
394
|
activityTracker.finishTranscribing()
|
|
395
|
+
VoiceLevelOverlayController.shared.finishTranscribing()
|
|
394
396
|
}
|
|
395
397
|
}
|
|
396
398
|
|
|
@@ -38,6 +38,7 @@ final class RecordingIndicatorController {
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
func end(for command: AgentCommand) {
|
|
41
|
+
guard isRecordingCommand(command) else { return }
|
|
41
42
|
let wasRecording = isRecording
|
|
42
43
|
let activeCommandCount = max(0, activeRecordingCommands[command.identifier, default: 0] - 1)
|
|
43
44
|
if activeCommandCount > 0 {
|
|
@@ -48,7 +49,7 @@ final class RecordingIndicatorController {
|
|
|
48
49
|
recordingCommandCount = max(0, recordingCommandCount - 1)
|
|
49
50
|
if wasRecording && !isRecording {
|
|
50
51
|
play(.finishedRecording)
|
|
51
|
-
VoiceLevelOverlayController.shared.
|
|
52
|
+
VoiceLevelOverlayController.shared.endRecording()
|
|
52
53
|
}
|
|
53
54
|
if command.supportsLivePreviewOverlay {
|
|
54
55
|
LiveTranscriptionPreview.shared.stop()
|
{agent_cli-0.106.0 → agent_cli-0.107.0}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift
RENAMED
|
@@ -75,7 +75,9 @@ struct VoiceLevelOverlayView: View {
|
|
|
75
75
|
.accessibilityElement(children: .ignore)
|
|
76
76
|
.accessibilityLabel(Text(meter.captureState == .recording
|
|
77
77
|
? "Recording \(meter.recordingDuration)"
|
|
78
|
-
: meter.captureState.
|
|
78
|
+
: meter.captureState == .transcribing
|
|
79
|
+
? "Transcribing \(meter.transcribingDuration)"
|
|
80
|
+
: meter.captureState.label))
|
|
79
81
|
.accessibilityValue(Text(showsPreviewSpace ? preview.text : ""))
|
|
80
82
|
}
|
|
81
83
|
|
|
@@ -85,15 +87,23 @@ struct VoiceLevelOverlayView: View {
|
|
|
85
87
|
Text(meter.recordingDuration)
|
|
86
88
|
.font(.system(size: 12, weight: .semibold))
|
|
87
89
|
.monospacedDigit()
|
|
90
|
+
.fixedSize()
|
|
88
91
|
waveform
|
|
89
92
|
} else {
|
|
90
93
|
ProgressView()
|
|
91
94
|
.controlSize(.small)
|
|
92
95
|
Text(meter.captureState.label)
|
|
93
96
|
.font(.system(size: 12, weight: .semibold))
|
|
97
|
+
if meter.captureState == .transcribing {
|
|
98
|
+
Text(meter.transcribingDuration)
|
|
99
|
+
.font(.system(size: 12, weight: .semibold))
|
|
100
|
+
.monospacedDigit()
|
|
101
|
+
.fixedSize()
|
|
102
|
+
}
|
|
94
103
|
}
|
|
95
104
|
}
|
|
96
105
|
.foregroundStyle(statusColor)
|
|
106
|
+
.padding(.horizontal, 14)
|
|
97
107
|
.frame(width: VoiceLevelOverlayLayout.pillSize.width, height: VoiceLevelOverlayLayout.pillSize.height)
|
|
98
108
|
.background(Capsule().fill(statusColor.opacity(isLightMode ? 0.10 : 0.14)))
|
|
99
109
|
.background(Capsule().fill(backgroundColor))
|
|
@@ -119,10 +129,12 @@ struct VoiceLevelOverlayView: View {
|
|
|
119
129
|
endPoint: .top
|
|
120
130
|
)
|
|
121
131
|
)
|
|
122
|
-
.frame(
|
|
132
|
+
.frame(maxWidth: .infinity)
|
|
133
|
+
.frame(height: max(6, 30 * amplitude))
|
|
123
134
|
.animation(.easeOut(duration: 0.11), value: amplitude)
|
|
124
135
|
}
|
|
125
136
|
}
|
|
137
|
+
.frame(maxWidth: .infinity)
|
|
126
138
|
}
|
|
127
139
|
|
|
128
140
|
private var isLightMode: Bool {
|
|
@@ -150,6 +162,11 @@ struct VoiceLevelOverlayView: View {
|
|
|
150
162
|
}
|
|
151
163
|
|
|
152
164
|
private var statusColor: Color {
|
|
165
|
+
if meter.captureState == .transcribing {
|
|
166
|
+
return isLightMode
|
|
167
|
+
? Color(red: 0.10, green: 0.32, blue: 0.70)
|
|
168
|
+
: Color(red: 0.45, green: 0.72, blue: 1.0)
|
|
169
|
+
}
|
|
153
170
|
if meter.captureState == .recording {
|
|
154
171
|
return isLightMode
|
|
155
172
|
? Color(red: 0.04, green: 0.40, blue: 0.18)
|
|
@@ -166,27 +183,63 @@ final class VoiceLevelOverlayController {
|
|
|
166
183
|
|
|
167
184
|
private var panel: NSPanel?
|
|
168
185
|
private var showsPreviewSpace = false
|
|
186
|
+
private var recordingShowsPreviewSpace = false
|
|
187
|
+
private var isRecording = false
|
|
188
|
+
private var isTranscribing = false
|
|
169
189
|
|
|
170
190
|
private init() {}
|
|
171
191
|
|
|
172
192
|
func show(showsPreviewSpace: Bool = false) {
|
|
193
|
+
isRecording = true
|
|
194
|
+
recordingShowsPreviewSpace = showsPreviewSpace
|
|
173
195
|
let panel = panel ?? makePanel()
|
|
174
196
|
self.panel = panel
|
|
175
|
-
|
|
176
|
-
self.showsPreviewSpace = showsPreviewSpace
|
|
177
|
-
updatePanelContent(panel)
|
|
178
|
-
}
|
|
179
|
-
panel.setContentSize(VoiceLevelOverlayLayout.panelSize(showsPreviewSpace: showsPreviewSpace))
|
|
180
|
-
position(panel)
|
|
197
|
+
setPreviewSpace(showsPreviewSpace, for: panel)
|
|
181
198
|
VoiceLevelMeter.shared.start()
|
|
182
199
|
panel.orderFrontRegardless()
|
|
183
200
|
}
|
|
184
201
|
|
|
185
202
|
func hide() {
|
|
203
|
+
isRecording = false
|
|
204
|
+
isTranscribing = false
|
|
186
205
|
VoiceLevelMeter.shared.stop()
|
|
187
206
|
panel?.orderOut(nil)
|
|
188
207
|
}
|
|
189
208
|
|
|
209
|
+
func showTranscribing() {
|
|
210
|
+
isTranscribing = true
|
|
211
|
+
let panel = panel ?? makePanel()
|
|
212
|
+
self.panel = panel
|
|
213
|
+
VoiceLevelMeter.shared.beginTranscribing()
|
|
214
|
+
setPreviewSpace(false, for: panel)
|
|
215
|
+
panel.orderFrontRegardless()
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
func finishTranscribing() {
|
|
219
|
+
guard isTranscribing else { return }
|
|
220
|
+
isTranscribing = false
|
|
221
|
+
if isRecording {
|
|
222
|
+
if let panel {
|
|
223
|
+
setPreviewSpace(recordingShowsPreviewSpace, for: panel)
|
|
224
|
+
}
|
|
225
|
+
VoiceLevelMeter.shared.resumeRecording()
|
|
226
|
+
} else {
|
|
227
|
+
hide()
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
func endRecording() {
|
|
232
|
+
isRecording = false
|
|
233
|
+
if isTranscribing {
|
|
234
|
+
VoiceLevelMeter.shared.beginTranscribing()
|
|
235
|
+
if let panel {
|
|
236
|
+
setPreviewSpace(false, for: panel)
|
|
237
|
+
}
|
|
238
|
+
} else {
|
|
239
|
+
hide()
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
190
243
|
private func makePanel() -> NSPanel {
|
|
191
244
|
let panel = NSPanel(
|
|
192
245
|
contentRect: NSRect(
|
|
@@ -208,6 +261,15 @@ final class VoiceLevelOverlayController {
|
|
|
208
261
|
return panel
|
|
209
262
|
}
|
|
210
263
|
|
|
264
|
+
private func setPreviewSpace(_ showsPreviewSpace: Bool, for panel: NSPanel) {
|
|
265
|
+
if self.showsPreviewSpace != showsPreviewSpace {
|
|
266
|
+
self.showsPreviewSpace = showsPreviewSpace
|
|
267
|
+
updatePanelContent(panel)
|
|
268
|
+
}
|
|
269
|
+
panel.setContentSize(VoiceLevelOverlayLayout.panelSize(showsPreviewSpace: showsPreviewSpace))
|
|
270
|
+
position(panel)
|
|
271
|
+
}
|
|
272
|
+
|
|
211
273
|
private func updatePanelContent(_ panel: NSPanel) {
|
|
212
274
|
panel.contentView = NSHostingView(rootView: VoiceLevelOverlayView(
|
|
213
275
|
meter: VoiceLevelMeter.shared,
|
|
@@ -330,6 +392,7 @@ enum VoiceCaptureState {
|
|
|
330
392
|
case connecting
|
|
331
393
|
case recording
|
|
332
394
|
case waitingForAudio
|
|
395
|
+
case transcribing
|
|
333
396
|
|
|
334
397
|
var label: String {
|
|
335
398
|
switch self {
|
|
@@ -337,6 +400,7 @@ enum VoiceCaptureState {
|
|
|
337
400
|
case .connecting: return "Connecting…"
|
|
338
401
|
case .recording: return "Recording"
|
|
339
402
|
case .waitingForAudio: return "Waiting for audio…"
|
|
403
|
+
case .transcribing: return "Transcribing…"
|
|
340
404
|
}
|
|
341
405
|
}
|
|
342
406
|
}
|
|
@@ -347,6 +411,7 @@ final class VoiceLevelMeter: ObservableObject {
|
|
|
347
411
|
@Published private(set) var amplitudes = VoiceLevelMeter.idleAmplitudes
|
|
348
412
|
@Published private(set) var captureState = VoiceCaptureState.idle
|
|
349
413
|
@Published private(set) var recordingDuration = "00:00"
|
|
414
|
+
@Published private(set) var transcribingDuration = "00:00"
|
|
350
415
|
|
|
351
416
|
private static let barCount = 16
|
|
352
417
|
private static let idleAmplitudes = Array(repeating: CGFloat(0.16), count: barCount)
|
|
@@ -357,6 +422,7 @@ final class VoiceLevelMeter: ObservableObject {
|
|
|
357
422
|
private let now: () -> Date
|
|
358
423
|
private var timer: Timer?
|
|
359
424
|
private var recordingStartedAt: Date?
|
|
425
|
+
private var transcribingStartedAt: Date?
|
|
360
426
|
private var phase = 0.0
|
|
361
427
|
private var smoothedLevel = CGFloat(0.16)
|
|
362
428
|
|
|
@@ -366,15 +432,21 @@ final class VoiceLevelMeter: ObservableObject {
|
|
|
366
432
|
}
|
|
367
433
|
|
|
368
434
|
func start() {
|
|
369
|
-
guard timer == nil else { return }
|
|
435
|
+
guard timer == nil || captureState == .transcribing else { return }
|
|
370
436
|
VoiceLevelLog.reset(levelLogURL)
|
|
371
437
|
captureState = .connecting
|
|
372
438
|
recordingStartedAt = nil
|
|
373
439
|
recordingDuration = "00:00"
|
|
440
|
+
transcribingStartedAt = nil
|
|
441
|
+
transcribingDuration = "00:00"
|
|
374
442
|
phase = 0
|
|
375
443
|
smoothedLevel = Self.idleLevel
|
|
376
444
|
amplitudes = Self.idleAmplitudes
|
|
445
|
+
startPolling()
|
|
446
|
+
}
|
|
377
447
|
|
|
448
|
+
private func startPolling() {
|
|
449
|
+
timer?.invalidate()
|
|
378
450
|
let timer = Timer(timeInterval: Self.pollInterval, repeats: true) { [weak self] _ in
|
|
379
451
|
self?.pollLevel()
|
|
380
452
|
}
|
|
@@ -383,10 +455,19 @@ final class VoiceLevelMeter: ObservableObject {
|
|
|
383
455
|
pollLevel()
|
|
384
456
|
}
|
|
385
457
|
|
|
458
|
+
func resumeRecording() {
|
|
459
|
+
guard captureState == .transcribing else { return }
|
|
460
|
+
transcribingStartedAt = nil
|
|
461
|
+
captureState = recordingStartedAt == nil ? .connecting : .waitingForAudio
|
|
462
|
+
startPolling()
|
|
463
|
+
}
|
|
464
|
+
|
|
386
465
|
func stop() {
|
|
387
466
|
timer?.invalidate()
|
|
388
467
|
timer = nil
|
|
389
468
|
captureState = .idle
|
|
469
|
+
transcribingStartedAt = nil
|
|
470
|
+
transcribingDuration = "00:00"
|
|
390
471
|
recordingStartedAt = nil
|
|
391
472
|
recordingDuration = "00:00"
|
|
392
473
|
phase = 0
|
|
@@ -394,9 +475,23 @@ final class VoiceLevelMeter: ObservableObject {
|
|
|
394
475
|
amplitudes = Self.idleAmplitudes
|
|
395
476
|
}
|
|
396
477
|
|
|
478
|
+
func beginTranscribing() {
|
|
479
|
+
guard captureState != .transcribing else { return }
|
|
480
|
+
transcribingStartedAt = now()
|
|
481
|
+
transcribingDuration = "00:00"
|
|
482
|
+
captureState = .transcribing
|
|
483
|
+
amplitudes = Self.idleAmplitudes
|
|
484
|
+
startPolling()
|
|
485
|
+
}
|
|
486
|
+
|
|
397
487
|
func pollLevel() {
|
|
398
488
|
guard timer != nil else { return }
|
|
399
489
|
let now = now()
|
|
490
|
+
if captureState == .transcribing {
|
|
491
|
+
let elapsed = max(0, Int(now.timeIntervalSince(transcribingStartedAt ?? now)))
|
|
492
|
+
transcribingDuration = String(format: "%02d:%02d", elapsed / 60, elapsed % 60)
|
|
493
|
+
return
|
|
494
|
+
}
|
|
400
495
|
guard let level = VoiceLevelLog.latestLevel(from: levelLogURL, now: now) else {
|
|
401
496
|
if captureState == .recording {
|
|
402
497
|
captureState = .waitingForAudio
|
|
@@ -4,6 +4,19 @@ import XCTest
|
|
|
4
4
|
@testable import AgentCLI
|
|
5
5
|
|
|
6
6
|
final class RecordingIndicatorControllerTests: XCTestCase {
|
|
7
|
+
func testRepeatedEndDoesNotStopAnotherRecording() {
|
|
8
|
+
let defaults = UserDefaults(suiteName: "AgentCLITests.recording-repeated-end")!
|
|
9
|
+
defaults.removePersistentDomain(forName: "AgentCLITests.recording-repeated-end")
|
|
10
|
+
let controller = RecordingIndicatorController(defaults: defaults, audioCuePlayer: RecordingCuePlayerSpy())
|
|
11
|
+
defer { controller.end(for: .voiceEdit) }
|
|
12
|
+
controller.begin(for: .toggleTranscription)
|
|
13
|
+
controller.begin(for: .voiceEdit)
|
|
14
|
+
controller.end(for: .toggleTranscription)
|
|
15
|
+
controller.end(for: .toggleTranscription)
|
|
16
|
+
XCTAssertTrue(controller.isRecording)
|
|
17
|
+
XCTAssertTrue(controller.isRecordingCommand(.voiceEdit))
|
|
18
|
+
}
|
|
19
|
+
|
|
7
20
|
func testRecordingSoundsAreDisabledByDefault() {
|
|
8
21
|
let defaults = UserDefaults(suiteName: "AgentCLITests.recording-sounds-default")!
|
|
9
22
|
defaults.removePersistentDomain(forName: "AgentCLITests.recording-sounds-default")
|
|
@@ -1,9 +1,101 @@
|
|
|
1
1
|
#if canImport(XCTest)
|
|
2
2
|
import Foundation
|
|
3
|
+
import AppKit
|
|
4
|
+
import SwiftUI
|
|
3
5
|
import XCTest
|
|
4
6
|
@testable import AgentCLI
|
|
5
7
|
|
|
6
8
|
final class VoiceLevelMeterTests: XCTestCase {
|
|
9
|
+
func testTranscribingCompactsPreviewAndFailedStopRestoresIt() throws {
|
|
10
|
+
let overlay = VoiceLevelOverlayController.shared
|
|
11
|
+
defer { overlay.hide() }
|
|
12
|
+
overlay.show(showsPreviewSpace: true)
|
|
13
|
+
let panel = try XCTUnwrap(NSApplication.shared.windows.first {
|
|
14
|
+
$0.contentView is NSHostingView<VoiceLevelOverlayView>
|
|
15
|
+
})
|
|
16
|
+
XCTAssertEqual(panel.frame.width, 446)
|
|
17
|
+
overlay.showTranscribing()
|
|
18
|
+
XCTAssertEqual(panel.frame.width, 216)
|
|
19
|
+
overlay.finishTranscribing()
|
|
20
|
+
XCTAssertEqual(panel.frame.width, 446)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
func testTranscriptionTimerStartsAtReleaseAndResetsForNextRequest() {
|
|
24
|
+
let logURL = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
|
|
25
|
+
var now = Date()
|
|
26
|
+
let meter = VoiceLevelMeter(levelLogURL: logURL, now: { now })
|
|
27
|
+
defer {
|
|
28
|
+
meter.stop()
|
|
29
|
+
try? FileManager.default.removeItem(at: logURL)
|
|
30
|
+
}
|
|
31
|
+
meter.start()
|
|
32
|
+
now = now.addingTimeInterval(20)
|
|
33
|
+
meter.beginTranscribing()
|
|
34
|
+
XCTAssertEqual(meter.transcribingDuration, "00:00")
|
|
35
|
+
now = now.addingTimeInterval(65)
|
|
36
|
+
meter.pollLevel()
|
|
37
|
+
XCTAssertEqual(meter.transcribingDuration, "01:05")
|
|
38
|
+
meter.beginTranscribing()
|
|
39
|
+
XCTAssertEqual(meter.transcribingDuration, "01:05", "Repeated transitions must not reset elapsed time.")
|
|
40
|
+
meter.stop()
|
|
41
|
+
meter.beginTranscribing()
|
|
42
|
+
XCTAssertEqual(meter.transcribingDuration, "00:00")
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
func testEndingRecordingKeepsPendingTranscriptionVisible() {
|
|
46
|
+
let overlay = VoiceLevelOverlayController.shared
|
|
47
|
+
defer { overlay.hide() }
|
|
48
|
+
overlay.show()
|
|
49
|
+
overlay.showTranscribing()
|
|
50
|
+
overlay.endRecording()
|
|
51
|
+
XCTAssertEqual(VoiceLevelMeter.shared.captureState, .transcribing)
|
|
52
|
+
overlay.finishTranscribing()
|
|
53
|
+
XCTAssertEqual(VoiceLevelMeter.shared.captureState, .idle)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
func testFailedStopRestoresOngoingRecording() {
|
|
57
|
+
let overlay = VoiceLevelOverlayController.shared
|
|
58
|
+
defer { overlay.hide() }
|
|
59
|
+
overlay.show()
|
|
60
|
+
overlay.showTranscribing()
|
|
61
|
+
overlay.finishTranscribing()
|
|
62
|
+
XCTAssertEqual(VoiceLevelMeter.shared.captureState, .connecting)
|
|
63
|
+
overlay.endRecording()
|
|
64
|
+
XCTAssertEqual(VoiceLevelMeter.shared.captureState, .idle)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
func testFinishingTranscriptionDoesNotDismissANewRecording() {
|
|
68
|
+
let overlay = VoiceLevelOverlayController.shared
|
|
69
|
+
defer { overlay.hide() }
|
|
70
|
+
overlay.showTranscribing()
|
|
71
|
+
overlay.finishTranscribing()
|
|
72
|
+
XCTAssertEqual(VoiceLevelMeter.shared.captureState, .idle)
|
|
73
|
+
|
|
74
|
+
overlay.showTranscribing()
|
|
75
|
+
overlay.show()
|
|
76
|
+
overlay.finishTranscribing()
|
|
77
|
+
XCTAssertEqual(VoiceLevelMeter.shared.captureState, .connecting)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
func testTranscribingStopsAudioPollingAndAllowsNextRecording() throws {
|
|
81
|
+
let logURL = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
|
|
82
|
+
let meter = VoiceLevelMeter(levelLogURL: logURL)
|
|
83
|
+
defer {
|
|
84
|
+
meter.stop()
|
|
85
|
+
try? FileManager.default.removeItem(at: logURL)
|
|
86
|
+
}
|
|
87
|
+
meter.start()
|
|
88
|
+
meter.beginTranscribing()
|
|
89
|
+
try "{\"timestamp\":\"\(Self.iso8601.string(from: Date()))\",\"level\":0.9}"
|
|
90
|
+
.write(to: logURL, atomically: true, encoding: .utf8)
|
|
91
|
+
meter.pollLevel()
|
|
92
|
+
XCTAssertEqual(meter.captureState, .transcribing)
|
|
93
|
+
meter.start()
|
|
94
|
+
XCTAssertEqual(meter.captureState, .connecting)
|
|
95
|
+
meter.stop()
|
|
96
|
+
XCTAssertEqual(meter.captureState, .idle)
|
|
97
|
+
}
|
|
98
|
+
|
|
7
99
|
func testRecordingTimerExcludesStartupAndResetsBetweenRecordings() throws {
|
|
8
100
|
let logURL = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
|
|
9
101
|
var now = try XCTUnwrap(Self.iso8601.date(from: "2026-06-04T12:00:00Z"))
|
|
@@ -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.106.0</title>
|
|
9
|
+
<pubDate>Mon, 21 Sep 2026 16:57:54 +0000</pubDate>
|
|
10
|
+
<link>https://github.com/basnijholt/agent-cli</link>
|
|
11
|
+
<sparkle:version>207</sparkle:version>
|
|
12
|
+
<sparkle:shortVersionString>0.106.0</sparkle:shortVersionString>
|
|
13
|
+
<sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
|
|
14
|
+
<sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
|
|
15
|
+
<description sparkle:format="markdown"><![CDATA[## Features
|
|
16
|
+
|
|
17
|
+
- **Know when recording really starts.** The macOS overlay now shows an amber “Connecting…” indicator while capture starts, then a green waveform once audio arrives. If audio samples stop arriving, it switches to “Waiting for audio…”. Silence still counts as active recording. (#650)
|
|
18
|
+
- **See elapsed recording time.** A compact MM:SS timer sits beside the waveform. It starts with the first audio sample, excludes connection delay, and resets for each recording. (#650)
|
|
19
|
+
|
|
20
|
+
## Fixes
|
|
21
|
+
|
|
22
|
+
- **No more false success for empty transcriptions.** Empty or whitespace-only results now produce a clear error with recovery guidance instead of “Transcription Finished” and an empty paste. The macOS check also covers older user-installed CLI versions. (#649)
|
|
23
|
+
- **Keep recognized speech when cleanup fails.** If LLM cleanup returns blank text, the CLI preserves the raw transcription on the clipboard and identifies cleanup as the failed step. Empty speech-recognition results leave the clipboard unchanged. (#649)
|
|
24
|
+
|
|
25
|
+
## Maintenance
|
|
26
|
+
|
|
27
|
+
- Update Docker build actions and Codecov integration. (#645, #646, #647, #648)
|
|
28
|
+
|
|
29
|
+
**Full changelog:** https://github.com/basnijholt/agent-cli/compare/v0.105.2...v0.106.0
|
|
30
|
+
|
|
31
|
+
]]></description>
|
|
32
|
+
<enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.106.0/AgentCLI.zip" length="18866625" type="application/octet-stream" sparkle:edSignature="yrWDCZXck8LWQYTTdtjMI4rk9cqUtHaxL0zHi6nJl4MZWx6pkkU3u5PqULflm3GkMPfwisscZlX6E21H2JxHAg=="/>
|
|
33
|
+
</item>
|
|
7
34
|
<item>
|
|
8
35
|
<title>0.105.2</title>
|
|
9
36
|
<pubDate>Tue, 15 Sep 2026 07:58:55 +0000</pubDate>
|
|
@@ -179,38 +206,5 @@
|
|
|
179
206
|
]]></description>
|
|
180
207
|
<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=="/>
|
|
181
208
|
</item>
|
|
182
|
-
<item>
|
|
183
|
-
<title>0.102.0</title>
|
|
184
|
-
<pubDate>Tue, 14 Jul 2026 05:57:01 +0000</pubDate>
|
|
185
|
-
<link>https://github.com/basnijholt/agent-cli</link>
|
|
186
|
-
<sparkle:version>197</sparkle:version>
|
|
187
|
-
<sparkle:shortVersionString>0.102.0</sparkle:shortVersionString>
|
|
188
|
-
<sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
|
|
189
|
-
<sparkle:hardwareRequirements>arm64</sparkle:hardwareRequirements>
|
|
190
|
-
<description sparkle:format="markdown"><![CDATA[## What’s Changed
|
|
191
|
-
|
|
192
|
-
* Fix Wyoming TTS voice selection and metadata (#613) @basnijholt
|
|
193
|
-
* ⬆️ Update actions/checkout action to v7 (#598) @[renovate[bot]](https://github.com/apps/renovate)
|
|
194
|
-
* ⬆️ Update sparkle-project/Sparkle to v2.9.4 (#607) @[renovate[bot]](https://github.com/apps/renovate)
|
|
195
|
-
* [pre-commit.ci] pre-commit autoupdate (#612) @[pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci)
|
|
196
|
-
* ⬆️ Update astral-sh/setup-uv action to v8.3.2 (#611) @[renovate[bot]](https://github.com/apps/renovate)
|
|
197
|
-
* ⬆️ Update astral-sh/setup-uv action to v8.3.1 (#610) @[renovate[bot]](https://github.com/apps/renovate)
|
|
198
|
-
* ⬆️ Update astral-sh/setup-uv action to v8.3.0 (#609) @[renovate[bot]](https://github.com/apps/renovate)
|
|
199
|
-
* ⬆️ Update docker/login-action action to v4.4.0 (#608) @[renovate[bot]](https://github.com/apps/renovate)
|
|
200
|
-
* ⬆️ Update docker/setup-buildx-action action to v4.2.0 (#606) @[renovate[bot]](https://github.com/apps/renovate)
|
|
201
|
-
* ⬆️ Update docker/metadata-action action to v6.2.0 (#605) @[renovate[bot]](https://github.com/apps/renovate)
|
|
202
|
-
* ⬆️ Update docker/login-action action to v4.3.0 (#604) @[renovate[bot]](https://github.com/apps/renovate)
|
|
203
|
-
* ⬆️ Update docker/build-push-action action to v7.3.0 (#603) @[renovate[bot]](https://github.com/apps/renovate)
|
|
204
|
-
* [pre-commit.ci] pre-commit autoupdate (#602) @[pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci)
|
|
205
|
-
* ⬆️ Update release-drafter/release-drafter action to v7.5.1 (#601) @[renovate[bot]](https://github.com/apps/renovate)
|
|
206
|
-
* ⬆️ Update actions/setup-python action to v6.3.0 (#600) @[renovate[bot]](https://github.com/apps/renovate)
|
|
207
|
-
* [pre-commit.ci] pre-commit autoupdate (#599) @[pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci)
|
|
208
|
-
* ⬆️ Update release-drafter/release-drafter action to v7.4.0 (#596) @[renovate[bot]](https://github.com/apps/renovate)
|
|
209
|
-
* [pre-commit.ci] pre-commit autoupdate (#595) @[pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci)
|
|
210
|
-
* Pick best available installer for generic Python project setup (#591) @basnijholt
|
|
211
|
-
|
|
212
|
-
]]></description>
|
|
213
|
-
<enclosure url="https://github.com/basnijholt/agent-cli/releases/download/v0.102.0/AgentCLI.zip" length="24388215" type="application/octet-stream" sparkle:edSignature="1b3tpgDf/VolJ9MLr0R5N9gPmOkYG7Uf6ZyXQTNLPTfiMeo2malwMj5kzTFcCp7xQr/jijUB7/nRNoSzZiBnCg=="/>
|
|
214
|
-
</item>
|
|
215
209
|
</channel>
|
|
216
210
|
</rss>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|