agent-cli 0.97.2__tar.gz → 0.98.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agent_cli-0.97.2 → agent_cli-0.98.1}/PKG-INFO +1 -1
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/deps.py +35 -1
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/install/launchd.py +6 -4
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/install/service_config.py +54 -1
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/backends/nemo.py +1 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/install-extras.md +13 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/server/index.md +1 -1
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/server/whisper.md +64 -5
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/configuration.md +32 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +13 -2
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +7 -1
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +13 -2
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +1 -1
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +84 -0
- agent_cli-0.98.1/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +105 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +261 -3
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/appcast.xml +32 -32
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_daemon.py +60 -0
- agent_cli-0.97.2/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -9
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.claude-plugin/README.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.cursorrules +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.dockerignore +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.env.example +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/logo.svg +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/release-drafter.yml +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/renovate.json +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/scripts/normalize_appcast.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/scripts/sync_extras.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/workflows/docker.yml +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/workflows/docs.yml +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/workflows/markdown-code-runner.yml +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/workflows/pytest.yml +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/workflows/release-drafter.yml +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/workflows/release.yml +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.gitignore +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.jscpd.json +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.pre-commit-config.yaml +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.prompts/docs-review.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/.prompts/pr-review.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/CLAUDE.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/LICENSE +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/LLAMA_SERVER_USAGE.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/README.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/__main__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_extras.json +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_overrides/nemo-whisper.txt +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/diarization.txt +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/mlx-whisper.txt +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/nemo-whisper.txt +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/vad.txt +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/vectordb.txt +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/whisper-transformers.txt +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_requirements/wyoming.txt +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/_tools.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/diarize_live_session.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/speakers.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/transcribe.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/transcribe_live.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/api.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/cli.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/config.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/constants.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/alignment.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/diarization.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/process.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/speaker_identity.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/utils.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/vad.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/daemon/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/daemon/cli.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/_branch_name.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/_config.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/_output.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/cleanup.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/cli.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/base.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/hooks.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/launch.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/project.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/skill/SKILL.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/registry.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/tmux.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/example-config.toml +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/install/common.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/install/extras.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/install/services.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/install/systemd.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/opts.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/py.typed +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/cli.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/common.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/proxy/api.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/tts/backends/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/tts/model_manager.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/tts/wyoming_handler.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/backends/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/backends/base.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/backends/mlx.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/backends/transformers.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/model_manager.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/services/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/services/asr.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docker/docker-compose.yml +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docker/memory-proxy.Dockerfile +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docker/rag-proxy.Dockerfile +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docker/transcribe-proxy.Dockerfile +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docker/tts.Dockerfile +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docker/whisper.Dockerfile +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/CNAME +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/architecture/index.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/architecture/memory.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/architecture/rag.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/assistant.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/chat.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/config.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/daemon.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/dev.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/diarize-live-session.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/index.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/install-services.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/memory.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/server/transcribe-proxy.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/speak.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/speakers.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/start-services.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/transcribe-live.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/transcribe.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/getting-started.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/index.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/installation/docker.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/installation/index.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/installation/linux.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/installation/macos-app.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/installation/macos.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/installation/nixos.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/installation/windows.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/logo-avatar.svg +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/logo-clean.svg +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/docs/system-integration.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/justfile +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Package.resolved +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Package.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/README.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Resources/Info.plist +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatus.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatusRow.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/MenuActivityTracker.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Tests/AgentCLITests/VoiceLevelMeterTests.swift +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/build-macos-app.sh +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/macos/test-macos-app-e2e.sh +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/pyproject.toml +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/reddit.md +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/shell.nix +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_speak.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_speakers.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_transcribe.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_transcribe_agent.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_transcribe_live.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_transcribe_recovery.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_voice_edit.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/conftest.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/core/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/core/test_audio.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/core/test_sse.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/core/test_vad.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/core/test_watch.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_cleanup.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_cli.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_hooks.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_launch.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_project.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_terminals.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_verification.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/install/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/install/test_extras.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/install/test_launchd.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_client.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_files.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_git_integration.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_store.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/mocks/audio.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/mocks/llm.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/__init__.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_api.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_history.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_store.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_alignment.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_api.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_api_integration.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_asr.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_cli.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_config.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_diarization.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_diarize_live_session.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_env_vars.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_faster_whisper_backend.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_json_output.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_llm.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_macos_app.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_mlx_backend.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_nemo_backend.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_normalize_appcast.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_process_manager.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_requires_extras.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_server_tts.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_server_whisper.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_services.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_speaker_identity.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_tools.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_transformers_backend.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_tts.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_utils.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_wake_word.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/uv.lock +0 -0
- {agent_cli-0.97.2 → agent_cli-0.98.1}/zensical.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.98.1
|
|
4
4
|
Summary: A suite of AI-powered command-line tools for text correction, audio transcription, and voice assistance.
|
|
5
5
|
Project-URL: Homepage, https://github.com/basnijholt/agent-cli
|
|
6
6
|
Author-email: Bas Nijholt <bas@nijho.lt>
|
|
@@ -283,7 +283,41 @@ def _is_uv_cmd(cmd: list[str]) -> bool:
|
|
|
283
283
|
|
|
284
284
|
def _uv_override_path(extra: str) -> Path:
|
|
285
285
|
"""Return the override file path for an extra."""
|
|
286
|
-
|
|
286
|
+
source = _OVERRIDES_DIR / f"{extra}.txt"
|
|
287
|
+
if not _path_contains_whitespace(source):
|
|
288
|
+
return source
|
|
289
|
+
# uv mishandles --overrides paths with spaces (for example, app bundles
|
|
290
|
+
# installed under "Application Support"), so hand it a copied no-space path.
|
|
291
|
+
return _materialize_uv_override(source)
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
def _path_contains_whitespace(path: Path) -> bool:
|
|
295
|
+
return any(character.isspace() for character in str(path))
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def _materialized_uv_overrides_dir() -> Path:
|
|
299
|
+
configured_dir = os.environ.get("AGENTCLI_UV_OVERRIDES_DIR")
|
|
300
|
+
if configured_dir:
|
|
301
|
+
configured_path = Path(configured_dir).expanduser()
|
|
302
|
+
if not _path_contains_whitespace(configured_path):
|
|
303
|
+
return configured_path
|
|
304
|
+
|
|
305
|
+
# Keep this outside AGENTCLI_APP_SUPPORT_DIR; that path usually contains a
|
|
306
|
+
# space on macOS and would reintroduce the launchd/uv parse failure.
|
|
307
|
+
return Path.home() / ".cache" / "agent-cli" / "uv-overrides"
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
def _materialize_uv_override(source: Path) -> Path:
|
|
311
|
+
"""Copy a bundled override to a no-space path that uv can parse."""
|
|
312
|
+
target = _materialized_uv_overrides_dir() / source.name
|
|
313
|
+
try:
|
|
314
|
+
source_bytes = source.read_bytes()
|
|
315
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
316
|
+
if not target.exists() or target.read_bytes() != source_bytes:
|
|
317
|
+
target.write_bytes(source_bytes)
|
|
318
|
+
except OSError:
|
|
319
|
+
return source
|
|
320
|
+
return target
|
|
287
321
|
|
|
288
322
|
|
|
289
323
|
def _supports_uv_runtime_override(
|
|
@@ -88,16 +88,18 @@ def _get_recent_logs(service_name: str, num_lines: int = 10) -> list[str]:
|
|
|
88
88
|
|
|
89
89
|
lines: list[str] = []
|
|
90
90
|
|
|
91
|
-
# Prefer stdout as it has structured output (startup message, usage examples)
|
|
92
|
-
# stderr often has noisy warnings from libraries like PyTorch/Kokoro
|
|
93
91
|
for log_file in [stdout_log, stderr_log]:
|
|
94
92
|
if log_file.exists():
|
|
95
93
|
try:
|
|
96
94
|
with log_file.open() as f:
|
|
97
95
|
all_lines = f.readlines()
|
|
98
|
-
|
|
96
|
+
recent_lines = [line.rstrip() for line in all_lines[-num_lines:]]
|
|
97
|
+
if not recent_lines:
|
|
98
|
+
continue
|
|
99
99
|
if lines:
|
|
100
|
-
|
|
100
|
+
lines.append("")
|
|
101
|
+
lines.append(f"==> {log_file.name} <==")
|
|
102
|
+
lines.extend(recent_lines)
|
|
101
103
|
except OSError:
|
|
102
104
|
continue
|
|
103
105
|
|
|
@@ -10,6 +10,8 @@ from dataclasses import dataclass
|
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
from typing import TYPE_CHECKING, NamedTuple
|
|
12
12
|
|
|
13
|
+
from agent_cli.core.deps import _uv_tool_extra_args
|
|
14
|
+
|
|
13
15
|
if TYPE_CHECKING:
|
|
14
16
|
from collections.abc import Callable
|
|
15
17
|
|
|
@@ -35,6 +37,12 @@ class ServiceConfig:
|
|
|
35
37
|
|
|
36
38
|
# TTS services that are mutually exclusive (same ports)
|
|
37
39
|
TTS_SERVICES = ("tts-kokoro", "tts-piper")
|
|
40
|
+
_WHISPER_BACKEND_EXTRAS = {
|
|
41
|
+
"faster-whisper",
|
|
42
|
+
"mlx-whisper",
|
|
43
|
+
"whisper-transformers",
|
|
44
|
+
"nemo-whisper",
|
|
45
|
+
}
|
|
38
46
|
|
|
39
47
|
|
|
40
48
|
def detect_preferred_tts() -> str:
|
|
@@ -127,14 +135,20 @@ def build_service_command(
|
|
|
127
135
|
) -> list[str]:
|
|
128
136
|
"""Build the command args for running a service via uv tool run."""
|
|
129
137
|
extra = (service.macos_extra or service.extra) if use_macos_extra else service.extra
|
|
138
|
+
extra = _service_extra_for_command(service, extra, extra_command_args)
|
|
139
|
+
extras = _split_extras(extra)
|
|
130
140
|
package_source = os.environ.get("AGENTCLI_PACKAGE_SOURCE", "agent-cli")
|
|
131
141
|
|
|
132
142
|
args = [str(uv_path), "tool", "run"]
|
|
133
143
|
|
|
134
144
|
# Add python version constraint (skip on macOS when using macos_extra,
|
|
135
145
|
# since macos_extra typically avoids deps that lack py3.14 wheels)
|
|
136
|
-
|
|
146
|
+
uses_macos_extra_without_python_pin = (
|
|
147
|
+
use_macos_extra and service.macos_extra and "nemo-whisper" not in extras
|
|
148
|
+
)
|
|
149
|
+
if service.python_version and not uses_macos_extra_without_python_pin:
|
|
137
150
|
args.extend(["--python", service.python_version])
|
|
151
|
+
args.extend(_uv_tool_extra_args(extras))
|
|
138
152
|
|
|
139
153
|
# Build the command: either custom command path or default "server <name>"
|
|
140
154
|
cmd_path = service.command or ["server", service.name]
|
|
@@ -152,6 +166,45 @@ def build_service_command(
|
|
|
152
166
|
return args
|
|
153
167
|
|
|
154
168
|
|
|
169
|
+
def _service_extra_for_command(
|
|
170
|
+
service: ServiceConfig,
|
|
171
|
+
extra: str,
|
|
172
|
+
extra_command_args: list[str] | None,
|
|
173
|
+
) -> str:
|
|
174
|
+
"""Adjust service extras when custom daemon args select a specific backend."""
|
|
175
|
+
if service.name != "whisper" or not _uses_nemo_backend(extra_command_args):
|
|
176
|
+
return extra
|
|
177
|
+
|
|
178
|
+
parts = _split_extras(extra)
|
|
179
|
+
result: list[str] = []
|
|
180
|
+
inserted = False
|
|
181
|
+
for part in parts:
|
|
182
|
+
if part in _WHISPER_BACKEND_EXTRAS:
|
|
183
|
+
if not inserted:
|
|
184
|
+
result.append("nemo-whisper")
|
|
185
|
+
inserted = True
|
|
186
|
+
continue
|
|
187
|
+
result.append(part)
|
|
188
|
+
|
|
189
|
+
if not inserted:
|
|
190
|
+
result.append("nemo-whisper")
|
|
191
|
+
return ",".join(result)
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def _split_extras(extra: str) -> list[str]:
|
|
195
|
+
return [part.strip() for part in extra.split(",") if part.strip()]
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def _uses_nemo_backend(extra_command_args: list[str] | None) -> bool:
|
|
199
|
+
args = extra_command_args or []
|
|
200
|
+
for index, arg in enumerate(args):
|
|
201
|
+
if arg in {"--backend", "-b"} and index + 1 < len(args):
|
|
202
|
+
return args[index + 1] == "nemo"
|
|
203
|
+
if arg in {"--backend=nemo", "-b=nemo"}:
|
|
204
|
+
return True
|
|
205
|
+
return False
|
|
206
|
+
|
|
207
|
+
|
|
155
208
|
def find_uv(extra_paths: list[Path] | None = None) -> Path | None:
|
|
156
209
|
"""Find uv executable, preferring system paths over virtualenv."""
|
|
157
210
|
explicit_uv = os.environ.get("AGENTCLI_UV_PATH")
|
|
@@ -83,3 +83,16 @@ agent-cli install-extras rag memory vad
|
|
|
83
83
|
# Install all extras
|
|
84
84
|
agent-cli install-extras --all
|
|
85
85
|
```
|
|
86
|
+
|
|
87
|
+
## NeMo / Parakeet
|
|
88
|
+
|
|
89
|
+
Use the runtime installer for NVIDIA NeMo support:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
agent-cli install-extras nemo-whisper wyoming
|
|
93
|
+
agent-cli server whisper --backend nemo
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
This matters on Python 3.14. Plain `pip install "agent-cli[nemo-whisper]"` uses
|
|
97
|
+
the published extra metadata, while `agent-cli install-extras nemo-whisper` can
|
|
98
|
+
apply agent-cli's temporary uv override for the pinned NeMo Git build.
|
|
@@ -57,7 +57,7 @@ While Faster Whisper, Piper, and Kokoro are all available as standalone servers,
|
|
|
57
57
|
|
|
58
58
|
2. **TTL-based memory management** - Like [LlamaSwap](https://github.com/mostlygeek/llama-swap), models load on-demand and automatically unload after idle periods. Run voice services 24/7 without permanently consuming RAM/VRAM - memory is freed when you're not actively using speech features.
|
|
59
59
|
|
|
60
|
-
3. **Multi-platform acceleration** - Whisper automatically uses the optimal backend: [MLX Whisper](https://github.com/ml-explore/mlx-examples/tree/main/whisper) on Apple Silicon for native Metal acceleration, [Faster Whisper](https://github.com/SYSTRAN/faster-whisper) on Linux/CUDA for GPU acceleration.
|
|
60
|
+
3. **Multi-platform acceleration** - Whisper automatically uses the optimal backend: [MLX Whisper](https://github.com/ml-explore/mlx-examples/tree/main/whisper) on Apple Silicon for native Metal acceleration, [Faster Whisper](https://github.com/SYSTRAN/faster-whisper) on Linux/CUDA for GPU acceleration, and [NVIDIA NeMo](https://github.com/NVIDIA/NeMo) for Parakeet models.
|
|
61
61
|
|
|
62
62
|
4. **Unified configuration** - Consistent CLI interface, environment variables, and Docker setup across all services.
|
|
63
63
|
|
|
@@ -34,6 +34,12 @@ Run a local ASR server with automatic backend selection based on your platform:
|
|
|
34
34
|
> --default-language en
|
|
35
35
|
> ```
|
|
36
36
|
>
|
|
37
|
+
> NVIDIA Parakeet via NeMo:
|
|
38
|
+
> ```bash
|
|
39
|
+
> agent-cli install-extras nemo-whisper wyoming
|
|
40
|
+
> agent-cli server whisper --backend nemo
|
|
41
|
+
> ```
|
|
42
|
+
>
|
|
37
43
|
> Use it with any OpenAI-compatible client, or configure agent-cli to use it - see [Configuration](../../configuration.md#using-local-whisper-server).
|
|
38
44
|
|
|
39
45
|
## Features
|
|
@@ -74,6 +80,12 @@ agent-cli server whisper --device cpu
|
|
|
74
80
|
agent-cli server whisper --model large-v3 --download-only
|
|
75
81
|
|
|
76
82
|
# Run NVIDIA Parakeet via NeMo
|
|
83
|
+
agent-cli server whisper --backend nemo
|
|
84
|
+
|
|
85
|
+
# Keep Parakeet loaded after first request (avoids repeated load cost)
|
|
86
|
+
agent-cli server whisper --backend nemo --ttl 0
|
|
87
|
+
|
|
88
|
+
# Run a specific Parakeet model instead of the NeMo default
|
|
77
89
|
agent-cli server whisper --backend nemo --model parakeet-tdt-0.6b-v3
|
|
78
90
|
|
|
79
91
|
# Preload model at startup and wait until ready
|
|
@@ -287,15 +299,62 @@ Notes for Cohere Transcribe:
|
|
|
287
299
|
|
|
288
300
|
### NVIDIA NeMo (Parakeet)
|
|
289
301
|
|
|
290
|
-
|
|
302
|
+
The NeMo backend runs NVIDIA Parakeet models behind the same OpenAI-compatible
|
|
303
|
+
HTTP API and Wyoming protocol as the other Whisper backends. With `--backend
|
|
304
|
+
nemo`, the default model is `parakeet-unified-en-0.6b`.
|
|
305
|
+
|
|
306
|
+
Install the runtime dependencies:
|
|
291
307
|
|
|
292
308
|
```bash
|
|
293
|
-
|
|
294
|
-
|
|
309
|
+
agent-cli install-extras nemo-whisper wyoming
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
Start the server:
|
|
313
|
+
|
|
314
|
+
```bash
|
|
315
|
+
agent-cli server whisper --backend nemo
|
|
295
316
|
```
|
|
296
317
|
|
|
297
|
-
|
|
298
|
-
|
|
318
|
+
Use it from agent-cli through either protocol:
|
|
319
|
+
|
|
320
|
+
```bash
|
|
321
|
+
# OpenAI-compatible HTTP API
|
|
322
|
+
ag transcribe \
|
|
323
|
+
--asr-provider openai \
|
|
324
|
+
--asr-openai-base-url http://localhost:10301/v1
|
|
325
|
+
|
|
326
|
+
# Wyoming protocol
|
|
327
|
+
ag transcribe \
|
|
328
|
+
--asr-provider wyoming \
|
|
329
|
+
--asr-wyoming-ip localhost \
|
|
330
|
+
--asr-wyoming-port 10300
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
Run it as a daemon with persistent arguments:
|
|
334
|
+
|
|
335
|
+
```bash
|
|
336
|
+
agent-cli daemon install whisper -y -- \
|
|
337
|
+
--backend nemo \
|
|
338
|
+
--model parakeet-unified-en-0.6b \
|
|
339
|
+
--ttl 0
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
Notes for NeMo/Parakeet:
|
|
343
|
+
|
|
344
|
+
- `--backend nemo` defaults to `parakeet-unified-en-0.6b`.
|
|
345
|
+
- `--backend auto` switches to NeMo when any requested model name is a Parakeet model.
|
|
346
|
+
- NeMo uses CUDA when available and CPU otherwise; it does not use MLX/MPS on Apple Silicon.
|
|
347
|
+
- First request can be slow because the model loads lazily. Use `--preload` to load at startup, or `--ttl 0` to keep it loaded after the first request.
|
|
348
|
+
- REST uploads can be WAV, MP3, M4A, FLAC, OGG, AAC, or WebM when `ffmpeg` is available.
|
|
349
|
+
- NeMo models are currently transcription-only in this server. Requests to `/v1/audio/translations` return `400`.
|
|
350
|
+
- Segment formats (`verbose_json`, `srt`, `vtt`) require timestamp output from the selected NeMo model.
|
|
351
|
+
|
|
352
|
+
Python 3.14 note:
|
|
353
|
+
|
|
354
|
+
On Python 3.14, the plain published extra path does not apply agent-cli's NeMo
|
|
355
|
+
override. The `agent-cli install-extras nemo-whisper` path is uv-aware and can
|
|
356
|
+
apply agent-cli's temporary pinned NeMo Git install plus override file. Prefer it
|
|
357
|
+
over plain `pip install "agent-cli[nemo-whisper]"` on Python 3.14.
|
|
299
358
|
|
|
300
359
|
### Docker
|
|
301
360
|
|
|
@@ -241,6 +241,7 @@ Add to your config file so all commands use your local server:
|
|
|
241
241
|
```toml
|
|
242
242
|
[defaults]
|
|
243
243
|
asr_provider = "wyoming"
|
|
244
|
+
asr_wyoming_ip = "localhost"
|
|
244
245
|
asr_wyoming_port = 10300
|
|
245
246
|
```
|
|
246
247
|
|
|
@@ -260,6 +261,37 @@ Now just run `agent-cli transcribe` - it automatically uses your local server.
|
|
|
260
261
|
> **OpenAI SDK users:** The server also exposes an OpenAI-compatible API on port 10301.
|
|
261
262
|
> See [server whisper docs](commands/server/whisper.md) for all options.
|
|
262
263
|
|
|
264
|
+
### NVIDIA Parakeet via NeMo
|
|
265
|
+
|
|
266
|
+
Start a Parakeet server:
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
agent-cli install-extras nemo-whisper wyoming
|
|
270
|
+
agent-cli server whisper --backend nemo --ttl 0
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
`--backend nemo` defaults to `parakeet-unified-en-0.6b`. `--ttl 0` keeps the
|
|
274
|
+
model loaded after the first request, which is useful because NeMo model loading
|
|
275
|
+
is expensive.
|
|
276
|
+
|
|
277
|
+
Use it from agent-cli through Wyoming:
|
|
278
|
+
|
|
279
|
+
```toml
|
|
280
|
+
[defaults]
|
|
281
|
+
asr_provider = "wyoming"
|
|
282
|
+
asr_wyoming_ip = "localhost"
|
|
283
|
+
asr_wyoming_port = 10300
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
Or through the OpenAI-compatible HTTP API:
|
|
287
|
+
|
|
288
|
+
```toml
|
|
289
|
+
[defaults]
|
|
290
|
+
asr_provider = "openai"
|
|
291
|
+
asr_openai_base_url = "http://localhost:10301/v1"
|
|
292
|
+
asr_openai_model = "whisper-1"
|
|
293
|
+
```
|
|
294
|
+
|
|
263
295
|
## Audio Device Configuration
|
|
264
296
|
|
|
265
297
|
```toml
|
|
@@ -15,6 +15,7 @@ struct AgentCommand {
|
|
|
15
15
|
let title: String
|
|
16
16
|
let arguments: [String]
|
|
17
17
|
let appliesTranscriptionExtraInstructions: Bool
|
|
18
|
+
let appliesTranscriptionDaemonSettings: Bool
|
|
18
19
|
let forceBootstrap: Bool
|
|
19
20
|
let bootstrapRequirement: AgentBootstrapRequirement
|
|
20
21
|
let showsRecordingIndicator: Bool
|
|
@@ -27,6 +28,7 @@ struct AgentCommand {
|
|
|
27
28
|
title: String,
|
|
28
29
|
arguments: [String],
|
|
29
30
|
appliesTranscriptionExtraInstructions: Bool = false,
|
|
31
|
+
appliesTranscriptionDaemonSettings: Bool = false,
|
|
30
32
|
forceBootstrap: Bool = false,
|
|
31
33
|
bootstrapRequirement: AgentBootstrapRequirement = .cliRuntime,
|
|
32
34
|
showsRecordingIndicator: Bool = false,
|
|
@@ -38,6 +40,7 @@ struct AgentCommand {
|
|
|
38
40
|
self.title = title
|
|
39
41
|
self.arguments = arguments
|
|
40
42
|
self.appliesTranscriptionExtraInstructions = appliesTranscriptionExtraInstructions
|
|
43
|
+
self.appliesTranscriptionDaemonSettings = appliesTranscriptionDaemonSettings
|
|
41
44
|
self.forceBootstrap = forceBootstrap
|
|
42
45
|
self.bootstrapRequirement = bootstrapRequirement
|
|
43
46
|
self.showsRecordingIndicator = showsRecordingIndicator
|
|
@@ -46,7 +49,14 @@ struct AgentCommand {
|
|
|
46
49
|
self.finishNotificationTitle = finishNotificationTitle
|
|
47
50
|
}
|
|
48
51
|
|
|
49
|
-
func resolvedArguments(
|
|
52
|
+
func resolvedArguments(
|
|
53
|
+
extraInstructions: String?,
|
|
54
|
+
transcriptionDaemonArguments: [String]? = nil
|
|
55
|
+
) -> [String] {
|
|
56
|
+
if appliesTranscriptionDaemonSettings {
|
|
57
|
+
return transcriptionDaemonArguments ?? arguments
|
|
58
|
+
}
|
|
59
|
+
|
|
50
60
|
guard appliesTranscriptionExtraInstructions else { return arguments }
|
|
51
61
|
|
|
52
62
|
let trimmedInstructions = extraInstructions?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
|
|
@@ -110,7 +120,8 @@ struct AgentCommand {
|
|
|
110
120
|
static let installVoiceService = AgentCommand(
|
|
111
121
|
identifier: "install-voice-service",
|
|
112
122
|
title: "Install Voice Service",
|
|
113
|
-
arguments: ["daemon", "install", "whisper", "-y"]
|
|
123
|
+
arguments: ["daemon", "install", "whisper", "-y"],
|
|
124
|
+
appliesTranscriptionDaemonSettings: true
|
|
114
125
|
)
|
|
115
126
|
|
|
116
127
|
static let installOrUpdateCLI = AgentCommand(
|
{agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift
RENAMED
|
@@ -207,7 +207,13 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
207
207
|
|
|
208
208
|
let bootstrap = self.bootstrap
|
|
209
209
|
let reportBootstrapPhase = makeBootstrapProgressReporter()
|
|
210
|
-
let
|
|
210
|
+
let transcriptionDaemonArguments = AgentRuntime.shared.usesUserInstalledAgentCLI
|
|
211
|
+
? nil
|
|
212
|
+
: TranscriptionSettings.whisperDaemonInstallArguments()
|
|
213
|
+
let commandArguments = command.resolvedArguments(
|
|
214
|
+
extraInstructions: TranscriptionSettings.extraInstructions,
|
|
215
|
+
transcriptionDaemonArguments: transcriptionDaemonArguments
|
|
216
|
+
)
|
|
211
217
|
DispatchQueue.global(qos: .userInitiated).async {
|
|
212
218
|
let bootstrapResult = bootstrap(command.bootstrapRequirement, command.forceBootstrap, reportBootstrapPhase)
|
|
213
219
|
guard bootstrapResult.exitCode == 0 else {
|
|
@@ -338,7 +338,10 @@ struct AgentRuntime {
|
|
|
338
338
|
|
|
339
339
|
private func installWhisperDaemon(progress: AgentBootstrapProgress) -> CommandResult {
|
|
340
340
|
progress(.installingVoiceService)
|
|
341
|
-
let
|
|
341
|
+
let arguments = runtimeMode == .bundled
|
|
342
|
+
? TranscriptionSettings.whisperDaemonInstallArguments(userDefaults: userDefaults)
|
|
343
|
+
: ["daemon", "ensure", "whisper", "--quiet"]
|
|
344
|
+
let result = runAgentCLI(arguments: arguments)
|
|
342
345
|
guard result.exitCode == 0 else {
|
|
343
346
|
return result
|
|
344
347
|
}
|
|
@@ -354,7 +357,15 @@ struct AgentRuntime {
|
|
|
354
357
|
|
|
355
358
|
private var whisperDaemonMarkerContents: String {
|
|
356
359
|
let modeName = runtimeMode == .userInstalled ? "user-installed" : "bundled"
|
|
357
|
-
|
|
360
|
+
var contents = "runtimeMode=\(modeName)\npackageSource=\(agentCLIPackageSource)\n"
|
|
361
|
+
if runtimeMode == .bundled {
|
|
362
|
+
let backend = TranscriptionSettings.selectedBackend(userDefaults: userDefaults)
|
|
363
|
+
let ttlSeconds = TranscriptionSettings.selectedModelTTLSeconds(userDefaults: userDefaults)
|
|
364
|
+
contents += "transcriptionBackend=\(backend.rawValue)\n"
|
|
365
|
+
contents += "transcriptionModel=\(TranscriptionSettings.selectedModelName(userDefaults: userDefaults))\n"
|
|
366
|
+
contents += "transcriptionModelTTLSeconds=\(ttlSeconds)\n"
|
|
367
|
+
}
|
|
368
|
+
return contents
|
|
358
369
|
}
|
|
359
370
|
|
|
360
371
|
private func warmUpWhisperModel() -> CommandResult {
|
{agent_cli-0.97.2 → agent_cli-0.98.1}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift
RENAMED
|
@@ -5,7 +5,7 @@ import SwiftUI
|
|
|
5
5
|
final class SettingsWindowController {
|
|
6
6
|
static let shared = SettingsWindowController()
|
|
7
7
|
|
|
8
|
-
private static let contentSize = NSSize(width: 460, height:
|
|
8
|
+
private static let contentSize = NSSize(width: 460, height: 680)
|
|
9
9
|
|
|
10
10
|
private var window: NSWindow?
|
|
11
11
|
|
|
@@ -281,10 +281,20 @@ struct SettingsView: View {
|
|
|
281
281
|
private var useUserInstalledAgentCLI = false
|
|
282
282
|
@AppStorage(RecordingSoundSettings.enabledKey)
|
|
283
283
|
private var recordingSoundsEnabled = false
|
|
284
|
+
@AppStorage(TranscriptionSettings.transcriptionBackendKey)
|
|
285
|
+
private var transcriptionBackend = TranscriptionBackend.whisper.rawValue
|
|
286
|
+
@AppStorage(TranscriptionSettings.transcriptionModelKey)
|
|
287
|
+
private var transcriptionModel = TranscriptionBackend.whisper.defaultModelName
|
|
288
|
+
@AppStorage(TranscriptionSettings.transcriptionModelTTLSecondsKey)
|
|
289
|
+
private var transcriptionModelTTLSeconds = TranscriptionSettings.defaultModelTTLSeconds
|
|
284
290
|
@AppStorage(TranscriptionSettings.transcriptionExtraInstructionsKey)
|
|
285
291
|
private var transcriptionExtraInstructions = ""
|
|
286
292
|
@State private var shortcutRevision = 0
|
|
287
293
|
|
|
294
|
+
private var selectedTranscriptionBackend: TranscriptionBackend {
|
|
295
|
+
TranscriptionBackend(rawValue: transcriptionBackend) ?? .whisper
|
|
296
|
+
}
|
|
297
|
+
|
|
288
298
|
var body: some View {
|
|
289
299
|
Form {
|
|
290
300
|
Section {
|
|
@@ -311,6 +321,50 @@ struct SettingsView: View {
|
|
|
311
321
|
Text("Runs the agent-cli found on PATH with your normal config instead of the app's private bundled-uv runtime. Recording sounds use Frog when recording starts and Purr when recording ends.")
|
|
312
322
|
}
|
|
313
323
|
|
|
324
|
+
Section {
|
|
325
|
+
Picker("Backend", selection: $transcriptionBackend) {
|
|
326
|
+
ForEach(TranscriptionBackend.allCases) { backend in
|
|
327
|
+
Text(backend.title).tag(backend.rawValue)
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
.pickerStyle(.menu)
|
|
331
|
+
.disabled(useUserInstalledAgentCLI)
|
|
332
|
+
|
|
333
|
+
Picker("Model", selection: $transcriptionModel) {
|
|
334
|
+
ForEach(selectedTranscriptionBackend.modelOptions) { model in
|
|
335
|
+
Text(model.title).tag(model.id)
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
.pickerStyle(.menu)
|
|
339
|
+
.disabled(useUserInstalledAgentCLI)
|
|
340
|
+
|
|
341
|
+
Stepper(
|
|
342
|
+
value: Binding(
|
|
343
|
+
get: { max(0, transcriptionModelTTLSeconds) },
|
|
344
|
+
set: { transcriptionModelTTLSeconds = max(0, $0) }
|
|
345
|
+
),
|
|
346
|
+
in: 0...86_400,
|
|
347
|
+
step: 60
|
|
348
|
+
) {
|
|
349
|
+
HStack {
|
|
350
|
+
Text("Model TTL")
|
|
351
|
+
Spacer()
|
|
352
|
+
Text(Self.formatTTLSeconds(transcriptionModelTTLSeconds))
|
|
353
|
+
.foregroundStyle(.secondary)
|
|
354
|
+
.monospacedDigit()
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
.disabled(useUserInstalledAgentCLI)
|
|
358
|
+
} header: {
|
|
359
|
+
Text("Voice Service")
|
|
360
|
+
} footer: {
|
|
361
|
+
Text(
|
|
362
|
+
useUserInstalledAgentCLI
|
|
363
|
+
? "Disabled while User-Installed agent-cli is active."
|
|
364
|
+
: "TTL is how long the selected model lives in memory after the last transcription. Set to 0 to keep it loaded until the voice service restarts."
|
|
365
|
+
)
|
|
366
|
+
}
|
|
367
|
+
|
|
314
368
|
Section {
|
|
315
369
|
TextEditor(text: $transcriptionExtraInstructions)
|
|
316
370
|
.font(.body)
|
|
@@ -378,9 +432,39 @@ struct SettingsView: View {
|
|
|
378
432
|
}
|
|
379
433
|
.formStyle(.grouped)
|
|
380
434
|
.padding()
|
|
435
|
+
.onChange(of: transcriptionBackend) { _ in
|
|
436
|
+
normalizeTranscriptionModel()
|
|
437
|
+
}
|
|
381
438
|
.onAppear {
|
|
382
439
|
loginItemController.refresh()
|
|
440
|
+
normalizeTranscriptionModel()
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
private func normalizeTranscriptionModel() {
|
|
445
|
+
let backend = selectedTranscriptionBackend
|
|
446
|
+
guard backend.modelOption(named: transcriptionModel) == nil else { return }
|
|
447
|
+
transcriptionModel = backend.defaultModelName
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
private static func formatTTLSeconds(_ seconds: Int) -> String {
|
|
451
|
+
let clampedSeconds = max(0, seconds)
|
|
452
|
+
if clampedSeconds == 0 {
|
|
453
|
+
return "Never"
|
|
454
|
+
}
|
|
455
|
+
if clampedSeconds < 60 {
|
|
456
|
+
return "\(clampedSeconds)s"
|
|
457
|
+
}
|
|
458
|
+
if clampedSeconds < 3_600 {
|
|
459
|
+
return "\(clampedSeconds / 60)m"
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
let hours = clampedSeconds / 3_600
|
|
463
|
+
let minutes = (clampedSeconds % 3_600) / 60
|
|
464
|
+
if minutes == 0 {
|
|
465
|
+
return "\(hours)h"
|
|
383
466
|
}
|
|
467
|
+
return "\(hours)h \(minutes)m"
|
|
384
468
|
}
|
|
385
469
|
}
|
|
386
470
|
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
|
|
3
|
+
struct TranscriptionModelOption: Identifiable, Equatable {
|
|
4
|
+
let id: String
|
|
5
|
+
let title: String
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
enum TranscriptionBackend: String, CaseIterable, Identifiable {
|
|
9
|
+
case whisper
|
|
10
|
+
case nemo
|
|
11
|
+
|
|
12
|
+
var id: String {
|
|
13
|
+
rawValue
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
var title: String {
|
|
17
|
+
switch self {
|
|
18
|
+
case .whisper:
|
|
19
|
+
return "Whisper"
|
|
20
|
+
case .nemo:
|
|
21
|
+
return "NeMo"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
var cliBackend: String {
|
|
26
|
+
switch self {
|
|
27
|
+
case .whisper:
|
|
28
|
+
return "auto"
|
|
29
|
+
case .nemo:
|
|
30
|
+
return "nemo"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
var defaultModelName: String {
|
|
35
|
+
modelOptions[0].id
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
var modelOptions: [TranscriptionModelOption] {
|
|
39
|
+
switch self {
|
|
40
|
+
case .whisper:
|
|
41
|
+
return [
|
|
42
|
+
TranscriptionModelOption(id: "large-v3", title: "Large v3"),
|
|
43
|
+
TranscriptionModelOption(id: "large-v3-turbo", title: "Turbo"),
|
|
44
|
+
TranscriptionModelOption(id: "small", title: "Small"),
|
|
45
|
+
]
|
|
46
|
+
case .nemo:
|
|
47
|
+
return [
|
|
48
|
+
TranscriptionModelOption(id: "parakeet-unified-en-0.6b", title: "Parakeet Unified 0.6B"),
|
|
49
|
+
TranscriptionModelOption(id: "parakeet-tdt-0.6b-v3", title: "Parakeet TDT 0.6B v3"),
|
|
50
|
+
TranscriptionModelOption(id: "parakeet-tdt_ctc-110m", title: "Parakeet TDT CTC 110M"),
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
func modelOption(named modelName: String) -> TranscriptionModelOption? {
|
|
56
|
+
modelOptions.first { $0.id == modelName }
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
enum TranscriptionSettings {
|
|
61
|
+
static let transcriptionExtraInstructionsKey = "transcriptionExtraInstructions"
|
|
62
|
+
static let transcriptionBackendKey = "transcriptionBackend"
|
|
63
|
+
static let transcriptionModelKey = "transcriptionModel"
|
|
64
|
+
static let transcriptionModelTTLSecondsKey = "transcriptionModelTTLSeconds"
|
|
65
|
+
static let defaultModelTTLSeconds = 300
|
|
66
|
+
|
|
67
|
+
static var extraInstructions: String {
|
|
68
|
+
UserDefaults.standard.string(forKey: transcriptionExtraInstructionsKey) ?? ""
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
static func selectedBackend(userDefaults: UserDefaults = .standard) -> TranscriptionBackend {
|
|
72
|
+
let rawValue = userDefaults.string(forKey: transcriptionBackendKey) ?? TranscriptionBackend.whisper.rawValue
|
|
73
|
+
return TranscriptionBackend(rawValue: rawValue) ?? .whisper
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
static func selectedModelName(userDefaults: UserDefaults = .standard) -> String {
|
|
77
|
+
let backend = selectedBackend(userDefaults: userDefaults)
|
|
78
|
+
let storedModelName = userDefaults.string(forKey: transcriptionModelKey) ?? ""
|
|
79
|
+
return backend.modelOption(named: storedModelName)?.id ?? backend.defaultModelName
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
static func selectedModelTTLSeconds(userDefaults: UserDefaults = .standard) -> Int {
|
|
83
|
+
guard let storedValue = userDefaults.object(forKey: transcriptionModelTTLSecondsKey) as? NSNumber else {
|
|
84
|
+
return defaultModelTTLSeconds
|
|
85
|
+
}
|
|
86
|
+
return max(0, storedValue.intValue)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
static func whisperDaemonInstallArguments(userDefaults: UserDefaults = .standard) -> [String] {
|
|
90
|
+
let backend = selectedBackend(userDefaults: userDefaults)
|
|
91
|
+
return [
|
|
92
|
+
"daemon",
|
|
93
|
+
"install",
|
|
94
|
+
"whisper",
|
|
95
|
+
"-y",
|
|
96
|
+
"--",
|
|
97
|
+
"--backend",
|
|
98
|
+
backend.cliBackend,
|
|
99
|
+
"--model",
|
|
100
|
+
selectedModelName(userDefaults: userDefaults),
|
|
101
|
+
"--ttl",
|
|
102
|
+
"\(selectedModelTTLSeconds(userDefaults: userDefaults))",
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
}
|