agent-cli 0.95.0__tar.gz → 0.95.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/workflows/pytest.yml +3 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/workflows/release.yml +4 -1
- {agent_cli-0.95.0 → agent_cli-0.95.2}/PKG-INFO +8 -4
- {agent_cli-0.95.0 → agent_cli-0.95.2}/README.md +7 -3
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/transcribe.py +40 -13
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/transcribe_live.py +4 -2
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/deps.py +1 -1
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/process.py +102 -48
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/utils.py +107 -15
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/opts.py +12 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/transcribe.md +2 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Package.swift +5 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +19 -14
- {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +34 -120
- {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +22 -9
- {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +3 -1
- {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +5 -5
- agent_cli-0.95.2/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +33 -0
- agent_cli-0.95.2/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +77 -0
- agent_cli-0.95.2/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +16 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/build-macos-app.sh +97 -4
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_speak.py +25 -15
- agent_cli-0.95.2/tests/agents/test_transcribe_agent.py +200 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_voice_edit.py +33 -18
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/conftest.py +8 -1
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_macos_app.py +100 -22
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_process_manager.py +137 -54
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_requires_extras.py +13 -3
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_utils.py +31 -22
- agent_cli-0.95.0/tests/agents/test_transcribe_agent.py +0 -79
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.claude-plugin/README.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.cursorrules +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.dockerignore +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.env.example +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/logo.svg +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/release-drafter.yml +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/renovate.json +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/scripts/sync_extras.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/workflows/docker.yml +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/workflows/docs.yml +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/workflows/markdown-code-runner.yml +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/workflows/release-drafter.yml +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.gitignore +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.jscpd.json +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.pre-commit-config.yaml +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.prompts/docs-review.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/.prompts/pr-review.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/CLAUDE.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/LICENSE +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/LLAMA_SERVER_USAGE.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/__main__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_extras.json +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/diarization.txt +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/mlx-whisper.txt +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/vad.txt +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/vectordb.txt +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/whisper-transformers.txt +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_requirements/wyoming.txt +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/_tools.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/diarize_live_session.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/speakers.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/api.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/cli.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/config.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/constants.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/alignment.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/diarization.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/speaker_identity.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/vad.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/daemon/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/daemon/cli.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/_branch_name.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/_config.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/_output.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/cleanup.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/cli.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/base.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/hooks.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/launch.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/project.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/skill/SKILL.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/registry.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/tmux.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/example-config.toml +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/install/common.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/install/extras.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/install/launchd.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/install/service_config.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/install/services.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/install/systemd.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/py.typed +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/cli.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/common.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/proxy/api.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/tts/backends/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/tts/model_manager.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/tts/wyoming_handler.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/backends/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/backends/base.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/backends/mlx.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/backends/transformers.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/model_manager.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/services/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/services/asr.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docker/docker-compose.yml +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docker/memory-proxy.Dockerfile +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docker/rag-proxy.Dockerfile +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docker/transcribe-proxy.Dockerfile +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docker/tts.Dockerfile +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docker/whisper.Dockerfile +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/CNAME +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/architecture/index.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/architecture/memory.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/architecture/rag.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/assistant.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/chat.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/config.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/daemon.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/dev.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/diarize-live-session.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/index.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/install-extras.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/install-services.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/memory.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/server/index.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/server/transcribe-proxy.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/server/whisper.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/speak.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/speakers.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/start-services.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/transcribe-live.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/configuration.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/getting-started.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/index.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/installation/docker.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/installation/index.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/installation/linux.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/installation/macos.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/installation/nixos.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/installation/windows.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/logo-avatar.svg +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/logo-clean.svg +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/docs/system-integration.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/justfile +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Package.resolved +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/README.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Resources/Info.plist +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/macos/test-macos-app-e2e.sh +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/pyproject.toml +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/reddit.md +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/shell.nix +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_speakers.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_transcribe.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_transcribe_live.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_transcribe_recovery.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/core/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/core/test_audio.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/core/test_sse.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/core/test_vad.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/core/test_watch.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_cleanup.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_cli.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_hooks.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_launch.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_project.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_terminals.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_verification.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/install/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/install/test_extras.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/install/test_launchd.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_client.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_files.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_git_integration.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_store.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/mocks/audio.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/mocks/llm.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/__init__.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_api.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_history.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_store.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_alignment.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_api.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_api_integration.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_asr.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_cli.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_config.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_daemon.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_diarization.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_diarize_live_session.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_env_vars.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_faster_whisper_backend.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_json_output.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_llm.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_mlx_backend.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_server_tts.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_server_whisper.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_services.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_speaker_identity.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_tools.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_transformers_backend.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_tts.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_wake_word.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/uv.lock +0 -0
- {agent_cli-0.95.0 → agent_cli-0.95.2}/zensical.toml +0 -0
|
@@ -28,6 +28,9 @@ jobs:
|
|
|
28
28
|
run: sudo apt-get update && sudo apt-get install -y portaudio19-dev
|
|
29
29
|
- name: Install uv
|
|
30
30
|
uses: astral-sh/setup-uv@v8.1.0
|
|
31
|
+
- name: Run macOS app Swift tests
|
|
32
|
+
if: matrix.os == 'macos-latest' && matrix.python-version == '3.13'
|
|
33
|
+
run: swift test --package-path macos/AgentCLI --enable-xctest
|
|
31
34
|
- name: Run pytest (macOS - all extras)
|
|
32
35
|
if: matrix.os == 'macos-latest'
|
|
33
36
|
run: uv run --all-extras pytest -vvv
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
name:
|
|
1
|
+
name: Publish Release
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
release:
|
|
@@ -6,6 +6,7 @@ on:
|
|
|
6
6
|
|
|
7
7
|
jobs:
|
|
8
8
|
deploy:
|
|
9
|
+
name: Publish Python package
|
|
9
10
|
runs-on: ubuntu-latest
|
|
10
11
|
environment:
|
|
11
12
|
name: pypi
|
|
@@ -22,7 +23,9 @@ jobs:
|
|
|
22
23
|
uses: pypa/gh-action-pypi-publish@release/v1
|
|
23
24
|
|
|
24
25
|
build_macos_app:
|
|
26
|
+
name: Build and publish macOS app
|
|
25
27
|
runs-on: macos-latest
|
|
28
|
+
timeout-minutes: 45
|
|
26
29
|
permissions:
|
|
27
30
|
contents: write
|
|
28
31
|
steps:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-cli
|
|
3
|
-
Version: 0.95.
|
|
3
|
+
Version: 0.95.2
|
|
4
4
|
Summary: A suite of AI-powered command-line tools for text correction, audio transcription, and voice assistance.
|
|
5
5
|
Project-URL: Homepage, https://github.com/basnijholt/agent-cli
|
|
6
6
|
Author-email: Bas Nijholt <bas@nijho.lt>
|
|
@@ -961,9 +961,13 @@ the `[defaults]` section of your configuration file.
|
|
|
961
961
|
│ [env var: GEMINI_API_KEY] │
|
|
962
962
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
|
963
963
|
╭─ Process Management ───────────────────────────────────────────────────────────────────╮
|
|
964
|
-
│ --
|
|
965
|
-
│ --
|
|
966
|
-
│ --
|
|
964
|
+
│ --start Start this command if it is not already running. │
|
|
965
|
+
│ --stop Stop any running instance of this command. │
|
|
966
|
+
│ --status Check if an instance is currently running. │
|
|
967
|
+
│ --toggle Start if not running, stop if running. Ideal for hotkey │
|
|
968
|
+
│ binding. │
|
|
969
|
+
│ --wait-for-start When stopping, wait briefly for a just-launched process to │
|
|
970
|
+
│ write its PID. │
|
|
967
971
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
|
968
972
|
╭─ General Options ──────────────────────────────────────────────────────────────────────╮
|
|
969
973
|
│ --clipboard --no-clipboard Copy result to │
|
|
@@ -856,9 +856,13 @@ the `[defaults]` section of your configuration file.
|
|
|
856
856
|
│ [env var: GEMINI_API_KEY] │
|
|
857
857
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
|
858
858
|
╭─ Process Management ───────────────────────────────────────────────────────────────────╮
|
|
859
|
-
│ --
|
|
860
|
-
│ --
|
|
861
|
-
│ --
|
|
859
|
+
│ --start Start this command if it is not already running. │
|
|
860
|
+
│ --stop Stop any running instance of this command. │
|
|
861
|
+
│ --status Check if an instance is currently running. │
|
|
862
|
+
│ --toggle Start if not running, stop if running. Ideal for hotkey │
|
|
863
|
+
│ binding. │
|
|
864
|
+
│ --wait-for-start When stopping, wait briefly for a just-launched process to │
|
|
865
|
+
│ write its PID. │
|
|
862
866
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
|
863
867
|
╭─ General Options ──────────────────────────────────────────────────────────────────────╮
|
|
864
868
|
│ --clipboard --no-clipboard Copy result to │
|
|
@@ -625,9 +625,11 @@ def transcribe( # noqa: PLR0912, PLR0911, PLR0915, C901
|
|
|
625
625
|
gemini_api_key: str | None = opts.GEMINI_API_KEY,
|
|
626
626
|
llm: bool = opts.LLM,
|
|
627
627
|
# --- Process Management ---
|
|
628
|
+
start: bool = opts.START,
|
|
628
629
|
stop: bool = opts.STOP,
|
|
629
630
|
status: bool = opts.STATUS,
|
|
630
631
|
toggle: bool = opts.TOGGLE,
|
|
632
|
+
wait_for_start: bool = opts.WAIT_FOR_START,
|
|
631
633
|
# --- General Options ---
|
|
632
634
|
clipboard: bool = opts.CLIPBOARD,
|
|
633
635
|
log_level: opts.LogLevel = opts.LOG_LEVEL,
|
|
@@ -854,6 +856,29 @@ def transcribe( # noqa: PLR0912, PLR0911, PLR0915, C901
|
|
|
854
856
|
|
|
855
857
|
# Normal recording mode
|
|
856
858
|
process_name = "transcribe"
|
|
859
|
+
if start:
|
|
860
|
+
process_status = process.get_process_status(process_name)
|
|
861
|
+
if process_status.running:
|
|
862
|
+
if json_output:
|
|
863
|
+
print(
|
|
864
|
+
json.dumps(
|
|
865
|
+
{
|
|
866
|
+
"action": "start",
|
|
867
|
+
"process": process_name,
|
|
868
|
+
"running": True,
|
|
869
|
+
"status": "running",
|
|
870
|
+
"pid": process_status.pid,
|
|
871
|
+
"stale_cleaned": process_status.stale_cleaned,
|
|
872
|
+
},
|
|
873
|
+
),
|
|
874
|
+
)
|
|
875
|
+
elif not general_cfg.quiet:
|
|
876
|
+
print_with_style(
|
|
877
|
+
f"✅ Transcribe is already running (PID: {process_status.pid}).",
|
|
878
|
+
style="green",
|
|
879
|
+
)
|
|
880
|
+
return
|
|
881
|
+
|
|
857
882
|
if stop_or_status_or_toggle(
|
|
858
883
|
process_name,
|
|
859
884
|
"transcribe",
|
|
@@ -861,24 +886,26 @@ def transcribe( # noqa: PLR0912, PLR0911, PLR0915, C901
|
|
|
861
886
|
status,
|
|
862
887
|
toggle,
|
|
863
888
|
quiet=general_cfg.quiet,
|
|
889
|
+
json_output=json_output,
|
|
890
|
+
wait_for_start_seconds=300.0 if wait_for_start else 0.0,
|
|
864
891
|
):
|
|
865
892
|
return
|
|
866
893
|
|
|
867
|
-
|
|
868
|
-
input_device_index=input_device_index,
|
|
869
|
-
input_device_name=input_device_name,
|
|
870
|
-
)
|
|
871
|
-
|
|
872
|
-
# We only use setup_devices for its input device handling
|
|
873
|
-
device_info = setup_devices(general_cfg, audio_in_cfg, None)
|
|
874
|
-
if device_info is None:
|
|
875
|
-
return
|
|
876
|
-
input_device_index, _, _ = device_info
|
|
877
|
-
audio_in_cfg.input_device_index = input_device_index
|
|
878
|
-
|
|
879
|
-
# Use context manager for PID file management
|
|
894
|
+
# Use context manager before audio setup so --stop can target startup reliably.
|
|
880
895
|
try:
|
|
881
896
|
with process.pid_file_context(process_name), suppress(KeyboardInterrupt):
|
|
897
|
+
audio_in_cfg = config.AudioInput(
|
|
898
|
+
input_device_index=input_device_index,
|
|
899
|
+
input_device_name=input_device_name,
|
|
900
|
+
)
|
|
901
|
+
|
|
902
|
+
# We only use setup_devices for its input device handling
|
|
903
|
+
device_info = setup_devices(general_cfg, audio_in_cfg, None)
|
|
904
|
+
if device_info is None:
|
|
905
|
+
return
|
|
906
|
+
input_device_index, _, _ = device_info
|
|
907
|
+
audio_in_cfg.input_device_index = input_device_index
|
|
908
|
+
|
|
882
909
|
result = asyncio.run(
|
|
883
910
|
_async_main(
|
|
884
911
|
extra_instructions=extra_instructions,
|
|
@@ -408,7 +408,8 @@ def transcribe_live( # noqa: PLR0912
|
|
|
408
408
|
|
|
409
409
|
# Handle stop/status commands
|
|
410
410
|
if stop:
|
|
411
|
-
|
|
411
|
+
result = process.stop_process(process_name)
|
|
412
|
+
if result.was_running or result.stale_cleaned:
|
|
412
413
|
if not quiet:
|
|
413
414
|
print_with_style(f"✅ Stopped {process_name}", style="green")
|
|
414
415
|
elif not quiet:
|
|
@@ -416,7 +417,8 @@ def transcribe_live( # noqa: PLR0912
|
|
|
416
417
|
return
|
|
417
418
|
|
|
418
419
|
if status:
|
|
419
|
-
|
|
420
|
+
process_status = process.get_process_status(process_name)
|
|
421
|
+
if process_status.running:
|
|
420
422
|
if not quiet:
|
|
421
423
|
print_with_style(f"✅ {process_name} is running", style="green")
|
|
422
424
|
elif not quiet:
|
|
@@ -382,7 +382,7 @@ def _should_skip_extra_check_for_process_control(
|
|
|
382
382
|
|
|
383
383
|
from agent_cli.core import process # noqa: PLC0415
|
|
384
384
|
|
|
385
|
-
return process.
|
|
385
|
+
return process.get_process_status(process_name).running
|
|
386
386
|
|
|
387
387
|
|
|
388
388
|
def requires_extras(
|
|
@@ -24,6 +24,24 @@ class _PidInfo(NamedTuple):
|
|
|
24
24
|
uses_lock: bool
|
|
25
25
|
|
|
26
26
|
|
|
27
|
+
class ProcessStatus(NamedTuple):
|
|
28
|
+
"""Current state of a managed Agent CLI process."""
|
|
29
|
+
|
|
30
|
+
process_name: str
|
|
31
|
+
running: bool
|
|
32
|
+
pid: int | None
|
|
33
|
+
stale_cleaned: bool = False
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class StopProcessResult(NamedTuple):
|
|
37
|
+
"""Result of a stop request for a managed Agent CLI process."""
|
|
38
|
+
|
|
39
|
+
process_name: str
|
|
40
|
+
was_running: bool
|
|
41
|
+
status: ProcessStatus
|
|
42
|
+
stale_cleaned: bool = False
|
|
43
|
+
|
|
44
|
+
|
|
27
45
|
def _default_pid_dir() -> Path:
|
|
28
46
|
"""Return local runtime dir for process control files."""
|
|
29
47
|
if runtime_dir := os.environ.get("AGENTCLI_RUNTIME_DIR"):
|
|
@@ -116,8 +134,10 @@ def _is_pid_running(pid: int) -> bool:
|
|
|
116
134
|
try:
|
|
117
135
|
os.kill(pid, 0)
|
|
118
136
|
return True
|
|
119
|
-
except
|
|
137
|
+
except ProcessLookupError:
|
|
120
138
|
return False
|
|
139
|
+
except PermissionError:
|
|
140
|
+
return True
|
|
121
141
|
|
|
122
142
|
|
|
123
143
|
def _supports_process_locks() -> bool:
|
|
@@ -233,58 +253,59 @@ def _cleanup_process_files(process_name: str) -> None:
|
|
|
233
253
|
clear_stop_file(process_name)
|
|
234
254
|
|
|
235
255
|
|
|
236
|
-
def
|
|
237
|
-
"""
|
|
256
|
+
def get_process_status(process_name: str) -> ProcessStatus:
|
|
257
|
+
"""Return process state and deterministically clean stale control files."""
|
|
238
258
|
if not _get_pid_file(process_name).exists():
|
|
239
|
-
return None
|
|
259
|
+
return ProcessStatus(process_name=process_name, running=False, pid=None)
|
|
240
260
|
|
|
241
261
|
pid_info = _read_pid_info(process_name)
|
|
242
262
|
if pid_info is None:
|
|
243
263
|
_cleanup_process_files(process_name)
|
|
244
|
-
return
|
|
264
|
+
return ProcessStatus(
|
|
265
|
+
process_name=process_name,
|
|
266
|
+
running=False,
|
|
267
|
+
pid=None,
|
|
268
|
+
stale_cleaned=True,
|
|
269
|
+
)
|
|
245
270
|
|
|
246
271
|
if pid_info.uses_lock and _supports_process_locks() and not _is_process_lock_held(process_name):
|
|
247
272
|
_cleanup_process_files(process_name)
|
|
248
|
-
return
|
|
273
|
+
return ProcessStatus(
|
|
274
|
+
process_name=process_name,
|
|
275
|
+
running=False,
|
|
276
|
+
pid=None,
|
|
277
|
+
stale_cleaned=True,
|
|
278
|
+
)
|
|
249
279
|
|
|
250
280
|
if _is_pid_running(pid_info.pid):
|
|
251
|
-
return pid_info.pid
|
|
281
|
+
return ProcessStatus(process_name=process_name, running=True, pid=pid_info.pid)
|
|
252
282
|
|
|
253
283
|
_cleanup_process_files(process_name)
|
|
254
|
-
return
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
def
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
"""
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
# Check if we have a running process
|
|
281
|
-
pid = _get_running_pid(process_name)
|
|
282
|
-
|
|
283
|
-
# If _get_running_pid returned None but file existed, it cleaned up a stale file
|
|
284
|
-
if pid is None:
|
|
285
|
-
clear_stop_file(process_name)
|
|
286
|
-
return True
|
|
287
|
-
|
|
284
|
+
return ProcessStatus(
|
|
285
|
+
process_name=process_name,
|
|
286
|
+
running=False,
|
|
287
|
+
pid=None,
|
|
288
|
+
stale_cleaned=True,
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def _wait_for_process_start(
|
|
293
|
+
process_name: str,
|
|
294
|
+
*,
|
|
295
|
+
wait_for_start_seconds: float,
|
|
296
|
+
poll_interval: float,
|
|
297
|
+
) -> ProcessStatus:
|
|
298
|
+
"""Wait briefly for a just-launched process to write its PID file."""
|
|
299
|
+
deadline = time.monotonic() + wait_for_start_seconds
|
|
300
|
+
status = get_process_status(process_name)
|
|
301
|
+
while not status.running and time.monotonic() < deadline:
|
|
302
|
+
time.sleep(poll_interval)
|
|
303
|
+
status = get_process_status(process_name)
|
|
304
|
+
return status
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
def _signal_running_process(process_name: str, pid: int) -> None:
|
|
308
|
+
"""Signal a known-running process and clean control files if it exits."""
|
|
288
309
|
stop_file = _get_stop_file(process_name)
|
|
289
310
|
should_force_kill = sys.platform != "win32" and stop_file.exists()
|
|
290
311
|
|
|
@@ -317,7 +338,39 @@ def kill_process(process_name: str) -> bool:
|
|
|
317
338
|
elif not should_force_kill:
|
|
318
339
|
stop_file.touch()
|
|
319
340
|
|
|
320
|
-
|
|
341
|
+
|
|
342
|
+
def stop_process(
|
|
343
|
+
process_name: str,
|
|
344
|
+
*,
|
|
345
|
+
wait_for_start_seconds: float = 0.0,
|
|
346
|
+
poll_interval: float = 0.1,
|
|
347
|
+
) -> StopProcessResult:
|
|
348
|
+
"""Stop a process by name and return the resulting process state."""
|
|
349
|
+
initial_status = get_process_status(process_name)
|
|
350
|
+
if not initial_status.running and wait_for_start_seconds > 0:
|
|
351
|
+
initial_status = _wait_for_process_start(
|
|
352
|
+
process_name,
|
|
353
|
+
wait_for_start_seconds=wait_for_start_seconds,
|
|
354
|
+
poll_interval=poll_interval,
|
|
355
|
+
)
|
|
356
|
+
|
|
357
|
+
if not initial_status.running or initial_status.pid is None:
|
|
358
|
+
clear_stop_file(process_name)
|
|
359
|
+
return StopProcessResult(
|
|
360
|
+
process_name=process_name,
|
|
361
|
+
was_running=False,
|
|
362
|
+
status=initial_status,
|
|
363
|
+
stale_cleaned=initial_status.stale_cleaned,
|
|
364
|
+
)
|
|
365
|
+
|
|
366
|
+
_signal_running_process(process_name, initial_status.pid)
|
|
367
|
+
status = get_process_status(process_name)
|
|
368
|
+
return StopProcessResult(
|
|
369
|
+
process_name=process_name,
|
|
370
|
+
was_running=True,
|
|
371
|
+
status=status,
|
|
372
|
+
stale_cleaned=initial_status.stale_cleaned or status.stale_cleaned,
|
|
373
|
+
)
|
|
321
374
|
|
|
322
375
|
|
|
323
376
|
@contextmanager
|
|
@@ -329,14 +382,15 @@ def pid_file_context(process_name: str) -> Generator[Path, None, None]:
|
|
|
329
382
|
"""
|
|
330
383
|
lock_fd = _acquire_process_lock(process_name)
|
|
331
384
|
if _supports_process_locks() and lock_fd is None:
|
|
332
|
-
|
|
333
|
-
print(f"Process {process_name} is already running (PID: {
|
|
385
|
+
existing_status = get_process_status(process_name)
|
|
386
|
+
print(f"Process {process_name} is already running (PID: {existing_status.pid})")
|
|
334
387
|
sys.exit(1)
|
|
335
388
|
|
|
336
|
-
if not _supports_process_locks()
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
389
|
+
if not _supports_process_locks():
|
|
390
|
+
existing_status = get_process_status(process_name)
|
|
391
|
+
if existing_status.running:
|
|
392
|
+
print(f"Process {process_name} is already running (PID: {existing_status.pid})")
|
|
393
|
+
sys.exit(1)
|
|
340
394
|
|
|
341
395
|
if _supports_process_locks():
|
|
342
396
|
pid_info = _read_pid_info(process_name)
|
|
@@ -326,6 +326,94 @@ def signal_handling_context(
|
|
|
326
326
|
signal.signal(signum, previous)
|
|
327
327
|
|
|
328
328
|
|
|
329
|
+
def _process_status_payload(
|
|
330
|
+
*,
|
|
331
|
+
action: str,
|
|
332
|
+
process_name: str,
|
|
333
|
+
process_status: process.ProcessStatus,
|
|
334
|
+
was_running: bool | None = None,
|
|
335
|
+
stale_cleaned: bool | None = None,
|
|
336
|
+
) -> dict[str, object]:
|
|
337
|
+
"""Build machine-readable process control output."""
|
|
338
|
+
payload: dict[str, object] = {
|
|
339
|
+
"action": action,
|
|
340
|
+
"process": process_name,
|
|
341
|
+
"running": process_status.running,
|
|
342
|
+
"status": "running" if process_status.running else "stopped",
|
|
343
|
+
"pid": process_status.pid,
|
|
344
|
+
"stale_cleaned": (process_status.stale_cleaned if stale_cleaned is None else stale_cleaned),
|
|
345
|
+
}
|
|
346
|
+
if was_running is not None:
|
|
347
|
+
payload["was_running"] = was_running
|
|
348
|
+
return payload
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
def _handle_process_stop(
|
|
352
|
+
process_name: str,
|
|
353
|
+
which: str,
|
|
354
|
+
*,
|
|
355
|
+
quiet: bool,
|
|
356
|
+
json_output: bool,
|
|
357
|
+
wait_for_start_seconds: float,
|
|
358
|
+
) -> bool:
|
|
359
|
+
"""Handle a process stop request."""
|
|
360
|
+
result = process.stop_process(
|
|
361
|
+
process_name,
|
|
362
|
+
wait_for_start_seconds=wait_for_start_seconds,
|
|
363
|
+
)
|
|
364
|
+
if json_output:
|
|
365
|
+
print(
|
|
366
|
+
json.dumps(
|
|
367
|
+
_process_status_payload(
|
|
368
|
+
action="stop",
|
|
369
|
+
process_name=process_name,
|
|
370
|
+
process_status=result.status,
|
|
371
|
+
was_running=result.was_running,
|
|
372
|
+
stale_cleaned=result.stale_cleaned,
|
|
373
|
+
),
|
|
374
|
+
),
|
|
375
|
+
)
|
|
376
|
+
return True
|
|
377
|
+
|
|
378
|
+
stopped = result.was_running or result.stale_cleaned
|
|
379
|
+
|
|
380
|
+
if stopped:
|
|
381
|
+
if not quiet:
|
|
382
|
+
print_with_style(f"✅ {which.capitalize()} stopped.")
|
|
383
|
+
elif not quiet:
|
|
384
|
+
print_with_style(f"⚠️ No {which} is running.", style="yellow")
|
|
385
|
+
return True
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
def _handle_process_status(
|
|
389
|
+
process_name: str,
|
|
390
|
+
which: str,
|
|
391
|
+
*,
|
|
392
|
+
quiet: bool,
|
|
393
|
+
json_output: bool,
|
|
394
|
+
) -> bool:
|
|
395
|
+
"""Handle a process status request."""
|
|
396
|
+
process_status = process.get_process_status(process_name)
|
|
397
|
+
if json_output:
|
|
398
|
+
print(
|
|
399
|
+
json.dumps(
|
|
400
|
+
_process_status_payload(
|
|
401
|
+
action="status",
|
|
402
|
+
process_name=process_name,
|
|
403
|
+
process_status=process_status,
|
|
404
|
+
),
|
|
405
|
+
),
|
|
406
|
+
)
|
|
407
|
+
return True
|
|
408
|
+
|
|
409
|
+
if process_status.running:
|
|
410
|
+
if not quiet:
|
|
411
|
+
print_with_style(f"✅ {which.capitalize()} is running (PID: {process_status.pid}).")
|
|
412
|
+
elif not quiet:
|
|
413
|
+
print_with_style(f"⚠️ {which.capitalize()} is not running.", style="yellow")
|
|
414
|
+
return True
|
|
415
|
+
|
|
416
|
+
|
|
329
417
|
def stop_or_status_or_toggle(
|
|
330
418
|
process_name: str,
|
|
331
419
|
which: str,
|
|
@@ -334,28 +422,32 @@ def stop_or_status_or_toggle(
|
|
|
334
422
|
toggle: bool,
|
|
335
423
|
*,
|
|
336
424
|
quiet: bool = False,
|
|
425
|
+
json_output: bool = False,
|
|
426
|
+
wait_for_start_seconds: float = 0.0,
|
|
337
427
|
) -> bool:
|
|
338
428
|
"""Handle process control for a given process name."""
|
|
339
429
|
if stop:
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
430
|
+
return _handle_process_stop(
|
|
431
|
+
process_name,
|
|
432
|
+
which,
|
|
433
|
+
quiet=quiet,
|
|
434
|
+
json_output=json_output,
|
|
435
|
+
wait_for_start_seconds=wait_for_start_seconds,
|
|
436
|
+
)
|
|
346
437
|
|
|
347
438
|
if status:
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
return True
|
|
439
|
+
return _handle_process_status(
|
|
440
|
+
process_name,
|
|
441
|
+
which,
|
|
442
|
+
quiet=quiet,
|
|
443
|
+
json_output=json_output,
|
|
444
|
+
)
|
|
355
445
|
|
|
356
446
|
if toggle:
|
|
357
|
-
|
|
358
|
-
|
|
447
|
+
process_status = process.get_process_status(process_name)
|
|
448
|
+
if process_status.running:
|
|
449
|
+
result = process.stop_process(process_name)
|
|
450
|
+
if (result.was_running or result.stale_cleaned) and not quiet:
|
|
359
451
|
print_with_style(f"✅ {which.capitalize()} stopped.")
|
|
360
452
|
return True
|
|
361
453
|
if not quiet:
|
|
@@ -326,6 +326,12 @@ TTS_GEMINI_VOICE: str = typer.Option(
|
|
|
326
326
|
|
|
327
327
|
|
|
328
328
|
# --- Process Management Options ---
|
|
329
|
+
START: bool = typer.Option(
|
|
330
|
+
False, # noqa: FBT003
|
|
331
|
+
"--start",
|
|
332
|
+
help="Start this command if it is not already running.",
|
|
333
|
+
rich_help_panel="Process Management",
|
|
334
|
+
)
|
|
329
335
|
STOP: bool = typer.Option(
|
|
330
336
|
False, # noqa: FBT003
|
|
331
337
|
"--stop",
|
|
@@ -344,6 +350,12 @@ TOGGLE: bool = typer.Option(
|
|
|
344
350
|
help="Start if not running, stop if running. Ideal for hotkey binding.",
|
|
345
351
|
rich_help_panel="Process Management",
|
|
346
352
|
)
|
|
353
|
+
WAIT_FOR_START: bool = typer.Option(
|
|
354
|
+
False, # noqa: FBT003
|
|
355
|
+
"--wait-for-start",
|
|
356
|
+
help="When stopping, wait briefly for a just-launched process to write its PID.",
|
|
357
|
+
rich_help_panel="Process Management",
|
|
358
|
+
)
|
|
347
359
|
|
|
348
360
|
# --- General Options ---
|
|
349
361
|
|
|
@@ -168,9 +168,11 @@ The `--from-file` option supports multiple audio formats:
|
|
|
168
168
|
|
|
169
169
|
| Option | Default | Description |
|
|
170
170
|
|--------|---------|-------------|
|
|
171
|
+
| `--start` | `false` | Start this command if it is not already running. |
|
|
171
172
|
| `--stop` | `false` | Stop any running instance of this command. |
|
|
172
173
|
| `--status` | `false` | Check if an instance is currently running. |
|
|
173
174
|
| `--toggle` | `false` | Start if not running, stop if running. Ideal for hotkey binding. |
|
|
175
|
+
| `--wait-for-start` | `false` | When stopping, wait briefly for a just-launched process to write its PID. |
|
|
174
176
|
|
|
175
177
|
### General Options
|
|
176
178
|
|