agent-cli 0.95.5__tar.gz → 0.95.7__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.5 → agent_cli-0.95.7}/PKG-INFO +1 -1
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/install/service_config.py +6 -1
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +1 -1
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -6
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +53 -16
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +74 -14
- agent_cli-0.95.7/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +48 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +42 -3
- agent_cli-0.95.7/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +111 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +60 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +35 -1
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/memory/test_git_integration.py +1 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_daemon.py +43 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_macos_app.py +87 -13
- agent_cli-0.95.5/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -67
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.claude-plugin/README.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.cursorrules +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.dockerignore +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.env.example +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.github/logo.svg +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.github/release-drafter.yml +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.github/renovate.json +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.github/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.github/scripts/sync_extras.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.github/workflows/docker.yml +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.github/workflows/docs.yml +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.github/workflows/markdown-code-runner.yml +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.github/workflows/pytest.yml +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.github/workflows/release-drafter.yml +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.github/workflows/release.yml +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.gitignore +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.jscpd.json +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.pre-commit-config.yaml +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.prompts/docs-review.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/.prompts/pr-review.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/CLAUDE.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/LICENSE +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/LLAMA_SERVER_USAGE.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/README.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/__main__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/_extras.json +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/_requirements/diarization.txt +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/_requirements/mlx-whisper.txt +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/_requirements/vad.txt +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/_requirements/vectordb.txt +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/_requirements/whisper-transformers.txt +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/_requirements/wyoming.txt +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/_tools.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/agents/diarize_live_session.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/agents/speakers.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/agents/transcribe.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/agents/transcribe_live.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/api.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/cli.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/config.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/constants.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/core/alignment.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/core/deps.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/core/diarization.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/core/process.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/core/speaker_identity.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/core/utils.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/core/vad.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/daemon/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/daemon/cli.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/_branch_name.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/_config.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/_output.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/cleanup.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/cli.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/base.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/hooks.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/launch.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/project.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/skill/SKILL.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/terminals/registry.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/terminals/tmux.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/example-config.toml +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/install/common.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/install/extras.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/install/launchd.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/install/services.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/install/systemd.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/opts.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/py.typed +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/cli.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/common.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/proxy/api.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/tts/backends/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/tts/model_manager.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/tts/wyoming_handler.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/whisper/backends/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/whisper/backends/base.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/whisper/backends/mlx.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/whisper/backends/transformers.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/whisper/model_manager.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/services/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/services/asr.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docker/docker-compose.yml +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docker/memory-proxy.Dockerfile +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docker/rag-proxy.Dockerfile +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docker/transcribe-proxy.Dockerfile +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docker/tts.Dockerfile +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docker/whisper.Dockerfile +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/CNAME +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/architecture/index.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/architecture/memory.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/architecture/rag.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/assistant.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/chat.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/config.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/daemon.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/dev.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/diarize-live-session.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/index.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/install-extras.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/install-services.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/memory.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/server/index.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/server/transcribe-proxy.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/server/whisper.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/speak.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/speakers.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/start-services.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/transcribe-live.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/transcribe.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/configuration.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/getting-started.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/index.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/installation/docker.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/installation/index.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/installation/linux.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/installation/macos.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/installation/nixos.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/installation/windows.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/logo-avatar.svg +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/logo-clean.svg +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/docs/system-integration.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/justfile +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Package.resolved +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Package.swift +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/README.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Resources/Info.plist +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/build-macos-app.sh +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/macos/test-macos-app-e2e.sh +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/pyproject.toml +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/reddit.md +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/shell.nix +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/agents/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/agents/test_speak.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/agents/test_speakers.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/agents/test_transcribe.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/agents/test_transcribe_agent.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/agents/test_transcribe_live.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/agents/test_transcribe_recovery.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/agents/test_voice_edit.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/conftest.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/core/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/core/test_audio.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/core/test_sse.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/core/test_vad.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/core/test_watch.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/dev/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/dev/test_cleanup.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/dev/test_cli.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/dev/test_hooks.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/dev/test_launch.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/dev/test_project.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/dev/test_terminals.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/dev/test_verification.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/install/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/install/test_extras.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/install/test_launchd.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/memory/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/memory/test_client.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/memory/test_files.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/memory/test_store.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/mocks/audio.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/mocks/llm.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/rag/__init__.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/rag/test_api.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/rag/test_history.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/rag/test_store.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_alignment.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_api.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_api_integration.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_asr.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_cli.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_config.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_diarization.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_diarize_live_session.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_env_vars.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_faster_whisper_backend.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_json_output.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_llm.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_mlx_backend.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_process_manager.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_requires_extras.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_server_tts.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_server_whisper.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_services.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_speaker_identity.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_tools.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_transformers_backend.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_tts.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_utils.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_wake_word.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/uv.lock +0 -0
- {agent_cli-0.95.5 → agent_cli-0.95.7}/zensical.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-cli
|
|
3
|
-
Version: 0.95.
|
|
3
|
+
Version: 0.95.7
|
|
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>
|
|
@@ -152,6 +152,12 @@ def build_service_command(
|
|
|
152
152
|
|
|
153
153
|
def find_uv(extra_paths: list[Path] | None = None) -> Path | None:
|
|
154
154
|
"""Find uv executable, preferring system paths over virtualenv."""
|
|
155
|
+
explicit_uv = os.environ.get("AGENTCLI_UV_PATH")
|
|
156
|
+
if explicit_uv:
|
|
157
|
+
explicit_uv_path = Path(explicit_uv).expanduser()
|
|
158
|
+
if explicit_uv_path.is_file() and os.access(explicit_uv_path, os.X_OK):
|
|
159
|
+
return explicit_uv_path
|
|
160
|
+
|
|
155
161
|
bundled_uv = os.environ.get("AGENTCLI_BUNDLED_UV")
|
|
156
162
|
if bundled_uv:
|
|
157
163
|
bundled_uv_path = Path(bundled_uv).expanduser()
|
|
@@ -187,7 +193,6 @@ def install_uv() -> tuple[bool, str]:
|
|
|
187
193
|
["sh"], # noqa: S607
|
|
188
194
|
input=result.stdout,
|
|
189
195
|
capture_output=True,
|
|
190
|
-
text=True,
|
|
191
196
|
check=True,
|
|
192
197
|
)
|
|
193
198
|
return True, "uv installed successfully"
|
{agent_cli-0.95.5 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift
RENAMED
|
@@ -19,8 +19,6 @@ private enum HoldTranscriptionState {
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
typealias AgentBootstrap = @Sendable (AgentBootstrapRequirement, Bool) -> CommandResult
|
|
23
|
-
|
|
24
22
|
@MainActor
|
|
25
23
|
final class AgentCommandRunner: ObservableObject {
|
|
26
24
|
static let shared = AgentCommandRunner()
|
|
@@ -29,6 +27,7 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
29
27
|
@Published var lastOutput = ""
|
|
30
28
|
@Published private(set) var hasLastError = false
|
|
31
29
|
@Published private(set) var isRecording = false
|
|
30
|
+
@Published private(set) var bootstrapPhase: BootstrapPhase = .idle
|
|
32
31
|
@Published private var activeCommandCount = 0
|
|
33
32
|
private var recordingIndicator = RecordingIndicatorController()
|
|
34
33
|
private let pasteController: TranscriptPasteController
|
|
@@ -47,6 +46,9 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
47
46
|
if isRecording {
|
|
48
47
|
return "Recording"
|
|
49
48
|
}
|
|
49
|
+
if bootstrapPhase.isPreparing {
|
|
50
|
+
return bootstrapPhase.statusMessage
|
|
51
|
+
}
|
|
50
52
|
if holdTranscriptionState.isFinishing {
|
|
51
53
|
return "Transcribing..."
|
|
52
54
|
}
|
|
@@ -56,10 +58,20 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
56
58
|
return Self.compactMenuStatus(statusMessage)
|
|
57
59
|
}
|
|
58
60
|
|
|
61
|
+
var menuBarIconState: MenuBarIconState {
|
|
62
|
+
if isRecording {
|
|
63
|
+
return .recording
|
|
64
|
+
}
|
|
65
|
+
if bootstrapPhase.isPreparing {
|
|
66
|
+
return .preparing
|
|
67
|
+
}
|
|
68
|
+
return .idle
|
|
69
|
+
}
|
|
70
|
+
|
|
59
71
|
init(
|
|
60
72
|
pasteController: TranscriptPasteController = TranscriptPasteController(),
|
|
61
|
-
bootstrap: @escaping AgentBootstrap = { requirement, force in
|
|
62
|
-
AgentRuntime.shared.ensureReady(for: requirement, force: force)
|
|
73
|
+
bootstrap: @escaping AgentBootstrap = { requirement, force, progress in
|
|
74
|
+
AgentRuntime.shared.ensureReady(for: requirement, force: force, progress: progress)
|
|
63
75
|
}
|
|
64
76
|
) {
|
|
65
77
|
self.pasteController = pasteController
|
|
@@ -82,13 +94,12 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
82
94
|
hasStartedTranscriptionWarmUp = true
|
|
83
95
|
|
|
84
96
|
activeCommandCount += 1
|
|
85
|
-
|
|
86
|
-
statusMessage = "Preparing voice service..."
|
|
87
|
-
}
|
|
97
|
+
reportBootstrapPhase(.checkingRuntime)
|
|
88
98
|
|
|
89
99
|
let bootstrap = self.bootstrap
|
|
100
|
+
let reportBootstrapPhase = makeBootstrapProgressReporter()
|
|
90
101
|
DispatchQueue.global(qos: .utility).async {
|
|
91
|
-
let result = bootstrap(.transcriptionModel, false)
|
|
102
|
+
let result = bootstrap(.transcriptionModel, false, reportBootstrapPhase)
|
|
92
103
|
|
|
93
104
|
Task { @MainActor in
|
|
94
105
|
self.activeCommandCount = max(0, self.activeCommandCount - 1)
|
|
@@ -97,12 +108,11 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
97
108
|
}
|
|
98
109
|
|
|
99
110
|
if result.exitCode == 0 {
|
|
100
|
-
|
|
101
|
-
self.statusMessage = "Ready"
|
|
102
|
-
}
|
|
111
|
+
self.reportBootstrapPhase(.idle)
|
|
103
112
|
return
|
|
104
113
|
}
|
|
105
114
|
|
|
115
|
+
self.reportBootstrapPhase(.failed)
|
|
106
116
|
self.recordFailure(title: "Startup Voice Service Warm-Up", result: result)
|
|
107
117
|
self.statusMessage = result.output.isEmpty
|
|
108
118
|
? "Voice service warm-up failed with exit code \(result.exitCode)"
|
|
@@ -111,6 +121,18 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
111
121
|
}
|
|
112
122
|
}
|
|
113
123
|
|
|
124
|
+
private func reportBootstrapPhase(_ phase: BootstrapPhase) {
|
|
125
|
+
bootstrapPhase = phase
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
private func makeBootstrapProgressReporter() -> AgentBootstrapProgress {
|
|
129
|
+
{ [weak self] phase in
|
|
130
|
+
Task { @MainActor in
|
|
131
|
+
self?.reportBootstrapPhase(phase)
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
114
136
|
@discardableResult
|
|
115
137
|
func beginHoldToTranscribe() -> Bool {
|
|
116
138
|
guard holdTranscriptionState == .idle else {
|
|
@@ -171,19 +193,23 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
171
193
|
}
|
|
172
194
|
|
|
173
195
|
activeCommandCount += 1
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
196
|
+
if !self.bootstrapPhase.isPreparing {
|
|
197
|
+
statusMessage = isStopRequest
|
|
198
|
+
? "Stopping \(command.title)..."
|
|
199
|
+
: "Running \(command.title)..."
|
|
200
|
+
}
|
|
177
201
|
|
|
178
202
|
let bootstrap = self.bootstrap
|
|
203
|
+
let reportBootstrapPhase = makeBootstrapProgressReporter()
|
|
179
204
|
let commandArguments = command.resolvedArguments(extraInstructions: TranscriptionSettings.extraInstructions)
|
|
180
205
|
DispatchQueue.global(qos: .userInitiated).async {
|
|
181
|
-
let bootstrapResult = bootstrap(command.bootstrapRequirement, command.forceBootstrap)
|
|
206
|
+
let bootstrapResult = bootstrap(command.bootstrapRequirement, command.forceBootstrap, reportBootstrapPhase)
|
|
182
207
|
guard bootstrapResult.exitCode == 0 else {
|
|
183
208
|
let message = Self.statusMessage(for: command, result: bootstrapResult)
|
|
184
209
|
let notificationTitle = Self.notificationTitle(for: command, result: bootstrapResult)
|
|
185
210
|
let notificationBody = Self.notificationBody(for: command, result: bootstrapResult, statusMessage: message)
|
|
186
211
|
Task { @MainActor in
|
|
212
|
+
self.reportBootstrapPhase(.failed)
|
|
187
213
|
if isStopRequest {
|
|
188
214
|
self.clearStopRequested(for: command)
|
|
189
215
|
}
|
|
@@ -200,6 +226,10 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
200
226
|
return
|
|
201
227
|
}
|
|
202
228
|
|
|
229
|
+
Task { @MainActor in
|
|
230
|
+
self.reportBootstrapPhase(.idle)
|
|
231
|
+
}
|
|
232
|
+
|
|
203
233
|
if shouldStartRecording {
|
|
204
234
|
Task { @MainActor in
|
|
205
235
|
if self.beginRecordingIndicator(for: command) {
|
|
@@ -261,14 +291,17 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
261
291
|
statusMessage = "Stopping Toggle Transcription..."
|
|
262
292
|
|
|
263
293
|
let bootstrap = self.bootstrap
|
|
294
|
+
let reportBootstrapPhase = makeBootstrapProgressReporter()
|
|
264
295
|
DispatchQueue.global(qos: .userInitiated).async {
|
|
265
296
|
let bootstrapResult = bootstrap(
|
|
266
297
|
AgentCommand.stopTranscription.bootstrapRequirement,
|
|
267
|
-
AgentCommand.stopTranscription.forceBootstrap
|
|
298
|
+
AgentCommand.stopTranscription.forceBootstrap,
|
|
299
|
+
reportBootstrapPhase
|
|
268
300
|
)
|
|
269
301
|
guard bootstrapResult.exitCode == 0 else {
|
|
270
302
|
let message = Self.statusMessage(for: AgentCommand.stopTranscription, result: bootstrapResult)
|
|
271
303
|
Task { @MainActor in
|
|
304
|
+
self.reportBootstrapPhase(.failed)
|
|
272
305
|
self.holdTranscriptionState = .idle
|
|
273
306
|
self.lastOutput = bootstrapResult.output
|
|
274
307
|
self.recordFailure(command: AgentCommand.stopTranscription, result: bootstrapResult)
|
|
@@ -281,6 +314,10 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
281
314
|
return
|
|
282
315
|
}
|
|
283
316
|
|
|
317
|
+
Task { @MainActor in
|
|
318
|
+
self.reportBootstrapPhase(.idle)
|
|
319
|
+
}
|
|
320
|
+
|
|
284
321
|
let result = AgentRuntime.shared.runAgentCLI(arguments: AgentCommand.stopTranscription.arguments)
|
|
285
322
|
|
|
286
323
|
Task { @MainActor in
|
|
@@ -170,7 +170,10 @@ struct AgentRuntime {
|
|
|
170
170
|
exit(0)
|
|
171
171
|
}
|
|
172
172
|
|
|
173
|
-
func ensureInstalled(
|
|
173
|
+
func ensureInstalled(
|
|
174
|
+
force: Bool = false,
|
|
175
|
+
progress: AgentBootstrapProgress = { _ in }
|
|
176
|
+
) -> CommandResult {
|
|
174
177
|
let mode = runtimeMode
|
|
175
178
|
do {
|
|
176
179
|
try prepareDirectories(for: mode)
|
|
@@ -179,6 +182,7 @@ struct AgentRuntime {
|
|
|
179
182
|
}
|
|
180
183
|
|
|
181
184
|
if mode == .userInstalled {
|
|
185
|
+
progress(.checkingRuntime)
|
|
182
186
|
return ensureUserInstalledCLIAvailable()
|
|
183
187
|
}
|
|
184
188
|
|
|
@@ -188,6 +192,7 @@ struct AgentRuntime {
|
|
|
188
192
|
return CommandResult(exitCode: 0, output: "")
|
|
189
193
|
}
|
|
190
194
|
|
|
195
|
+
progress(.installingRuntime)
|
|
191
196
|
guard fileManager.isExecutableFile(atPath: bundledUVURL.path) else {
|
|
192
197
|
return CommandResult(
|
|
193
198
|
exitCode: 127,
|
|
@@ -243,36 +248,54 @@ struct AgentRuntime {
|
|
|
243
248
|
"packageSource=\(agentCLIPackageSource)\ninstallRequirement=\(agentCLIInstallRequirement)\n"
|
|
244
249
|
}
|
|
245
250
|
|
|
246
|
-
func ensureReady(
|
|
251
|
+
func ensureReady(
|
|
252
|
+
for requirement: AgentBootstrapRequirement,
|
|
253
|
+
force: Bool = false,
|
|
254
|
+
progress: AgentBootstrapProgress = { _ in }
|
|
255
|
+
) -> CommandResult {
|
|
247
256
|
Self.bootstrapQueue.sync {
|
|
248
|
-
ensureReadyUnsynchronized(for: requirement, force: force)
|
|
257
|
+
ensureReadyUnsynchronized(for: requirement, force: force, progress: progress)
|
|
249
258
|
}
|
|
250
259
|
}
|
|
251
260
|
|
|
252
|
-
private func ensureReadyUnsynchronized(
|
|
261
|
+
private func ensureReadyUnsynchronized(
|
|
262
|
+
for requirement: AgentBootstrapRequirement,
|
|
263
|
+
force: Bool = false,
|
|
264
|
+
progress: AgentBootstrapProgress
|
|
265
|
+
) -> CommandResult {
|
|
253
266
|
switch requirement {
|
|
254
267
|
case .cliRuntime:
|
|
255
|
-
return ensureInstalled(force: force)
|
|
268
|
+
return ensureInstalled(force: force, progress: progress)
|
|
256
269
|
case .transcription:
|
|
257
|
-
let installResult = ensureInstalled(force: force)
|
|
270
|
+
let installResult = ensureInstalled(force: force, progress: progress)
|
|
258
271
|
guard installResult.exitCode == 0 else {
|
|
259
272
|
return installResult
|
|
260
273
|
}
|
|
261
|
-
return ensureWhisperDaemon(force: force)
|
|
274
|
+
return ensureWhisperDaemon(force: force, progress: progress)
|
|
262
275
|
case .transcriptionModel:
|
|
263
|
-
let daemonResult = ensureReadyUnsynchronized(
|
|
276
|
+
let daemonResult = ensureReadyUnsynchronized(
|
|
277
|
+
for: .transcription,
|
|
278
|
+
force: force,
|
|
279
|
+
progress: progress
|
|
280
|
+
)
|
|
264
281
|
guard daemonResult.exitCode == 0 else {
|
|
265
282
|
return daemonResult
|
|
266
283
|
}
|
|
284
|
+
progress(.warmingWhisperModel)
|
|
267
285
|
return warmUpWhisperModel()
|
|
268
286
|
}
|
|
269
287
|
}
|
|
270
288
|
|
|
271
|
-
private func ensureWhisperDaemon(
|
|
289
|
+
private func ensureWhisperDaemon(
|
|
290
|
+
force: Bool = false,
|
|
291
|
+
progress: AgentBootstrapProgress
|
|
292
|
+
) -> CommandResult {
|
|
272
293
|
if !force, (try? String(contentsOf: whisperDaemonMarkerURL)) == whisperDaemonMarkerContents {
|
|
294
|
+
progress(.waitingForVoiceService)
|
|
273
295
|
return waitForWhisperDaemonReady()
|
|
274
296
|
}
|
|
275
297
|
|
|
298
|
+
progress(.installingVoiceService)
|
|
276
299
|
let result = runAgentCLI(arguments: ["daemon", "install", "whisper", "-y"])
|
|
277
300
|
guard result.exitCode == 0 else {
|
|
278
301
|
return result
|
|
@@ -283,6 +306,7 @@ struct AgentRuntime {
|
|
|
283
306
|
atomically: true,
|
|
284
307
|
encoding: .utf8
|
|
285
308
|
)
|
|
309
|
+
progress(.waitingForVoiceService)
|
|
286
310
|
return waitForWhisperDaemonReady()
|
|
287
311
|
}
|
|
288
312
|
|
|
@@ -425,8 +449,12 @@ struct AgentRuntime {
|
|
|
425
449
|
for key in Self.appPrivateEnvironmentKeys {
|
|
426
450
|
environment.removeValue(forKey: key)
|
|
427
451
|
}
|
|
452
|
+
// Preserve AGENTCLI_UV_PATH so GUI launches can point at a user-managed uv.
|
|
428
453
|
let existingPATH = environment["PATH"] ?? "/usr/bin:/bin:/usr/sbin:/sbin"
|
|
429
|
-
environment["PATH"] = userInstalledCLIPath(
|
|
454
|
+
environment["PATH"] = userInstalledCLIPath(
|
|
455
|
+
existingPATH: existingPATH,
|
|
456
|
+
loginShellPATH: Self.loginShellPATH(environment: baseEnvironment)
|
|
457
|
+
)
|
|
430
458
|
return environment
|
|
431
459
|
}
|
|
432
460
|
|
|
@@ -460,15 +488,47 @@ struct AgentRuntime {
|
|
|
460
488
|
return environment
|
|
461
489
|
}
|
|
462
490
|
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
491
|
+
func userInstalledCLIPath(existingPATH: String, loginShellPATH: String? = nil) -> String {
|
|
492
|
+
let homeURL = FileManager.default.homeDirectoryForCurrentUser
|
|
493
|
+
var pathValues: [String] = []
|
|
494
|
+
if let loginShellPATH {
|
|
495
|
+
pathValues.append(loginShellPATH)
|
|
496
|
+
}
|
|
497
|
+
pathValues.append(contentsOf: [
|
|
498
|
+
homeURL
|
|
466
499
|
.appendingPathComponent(".local/bin", isDirectory: true)
|
|
467
500
|
.path,
|
|
501
|
+
homeURL
|
|
502
|
+
.appendingPathComponent(".cargo/bin", isDirectory: true)
|
|
503
|
+
.path,
|
|
468
504
|
"/opt/homebrew/bin",
|
|
469
505
|
"/usr/local/bin",
|
|
470
506
|
existingPATH
|
|
471
|
-
]
|
|
507
|
+
])
|
|
508
|
+
|
|
509
|
+
var seen = Set<String>()
|
|
510
|
+
return pathValues
|
|
511
|
+
.flatMap { $0.split(separator: ":").map(String.init) }
|
|
512
|
+
.filter { !$0.isEmpty }
|
|
513
|
+
.filter { seen.insert($0).inserted }
|
|
514
|
+
.joined(separator: ":")
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
private static func loginShellPATH(environment: [String: String]) -> String? {
|
|
518
|
+
let shellPath = environment["SHELL"].flatMap { $0.isEmpty ? nil : $0 } ?? "/bin/zsh"
|
|
519
|
+
guard FileManager.default.isExecutableFile(atPath: shellPath) else { return nil }
|
|
520
|
+
|
|
521
|
+
let result = runProcess(
|
|
522
|
+
executableURL: URL(fileURLWithPath: shellPath),
|
|
523
|
+
arguments: ["-lic", "printf '%s\\n' \"$PATH\""],
|
|
524
|
+
environment: environment
|
|
525
|
+
)
|
|
526
|
+
guard result.exitCode == 0 else { return nil }
|
|
527
|
+
|
|
528
|
+
return result.output
|
|
529
|
+
.split(separator: "\n")
|
|
530
|
+
.last
|
|
531
|
+
.map(String.init)
|
|
472
532
|
}
|
|
473
533
|
|
|
474
534
|
private func prepareDirectories(for mode: AgentCLIRuntimeMode = .bundled) throws {
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
|
|
3
|
+
enum AgentBootstrapRequirement: Equatable {
|
|
4
|
+
case cliRuntime
|
|
5
|
+
case transcription
|
|
6
|
+
case transcriptionModel
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
enum BootstrapPhase: Equatable {
|
|
10
|
+
case idle
|
|
11
|
+
case checkingRuntime
|
|
12
|
+
case installingRuntime
|
|
13
|
+
case installingVoiceService
|
|
14
|
+
case waitingForVoiceService
|
|
15
|
+
case warmingWhisperModel
|
|
16
|
+
case failed
|
|
17
|
+
|
|
18
|
+
var isPreparing: Bool {
|
|
19
|
+
switch self {
|
|
20
|
+
case .idle, .failed:
|
|
21
|
+
return false
|
|
22
|
+
case .checkingRuntime, .installingRuntime, .installingVoiceService, .waitingForVoiceService, .warmingWhisperModel:
|
|
23
|
+
return true
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
var statusMessage: String {
|
|
28
|
+
switch self {
|
|
29
|
+
case .idle:
|
|
30
|
+
return "Ready"
|
|
31
|
+
case .checkingRuntime:
|
|
32
|
+
return "Checking CLI runtime..."
|
|
33
|
+
case .installingRuntime:
|
|
34
|
+
return "Installing CLI runtime..."
|
|
35
|
+
case .installingVoiceService:
|
|
36
|
+
return "Installing voice service..."
|
|
37
|
+
case .waitingForVoiceService:
|
|
38
|
+
return "Waiting for voice service..."
|
|
39
|
+
case .warmingWhisperModel:
|
|
40
|
+
return "Warming Whisper model..."
|
|
41
|
+
case .failed:
|
|
42
|
+
return "Voice service warm-up failed"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
typealias AgentBootstrapProgress = (BootstrapPhase) -> Void
|
|
48
|
+
typealias AgentBootstrap = (AgentBootstrapRequirement, Bool, @escaping AgentBootstrapProgress) -> CommandResult
|
|
@@ -22,18 +22,50 @@ final class ConfigurableHotkeyController {
|
|
|
22
22
|
guard !registered else { return }
|
|
23
23
|
|
|
24
24
|
self.runner = runner
|
|
25
|
+
registerStandardTranscriptionHotkeys(runner: runner)
|
|
25
26
|
registerFunctionAwareTranscriptionHotkeys(runner: runner)
|
|
26
27
|
|
|
27
28
|
KeyboardShortcuts.onKeyUp(for: .autocorrect) {
|
|
29
|
+
guard !ShortcutRecordingState.shared.isRecording else { return }
|
|
28
30
|
Task { @MainActor in runner.run(.autocorrect) }
|
|
29
31
|
}
|
|
30
32
|
KeyboardShortcuts.onKeyUp(for: .voiceEdit) {
|
|
33
|
+
guard !ShortcutRecordingState.shared.isRecording else { return }
|
|
31
34
|
Task { @MainActor in runner.run(.voiceEdit) }
|
|
32
35
|
}
|
|
33
36
|
|
|
34
37
|
registered = true
|
|
35
38
|
}
|
|
36
39
|
|
|
40
|
+
private func registerStandardTranscriptionHotkeys(runner: AgentCommandRunner) {
|
|
41
|
+
KeyboardShortcuts.onKeyUp(for: .toggleTranscription) {
|
|
42
|
+
guard !ShortcutRecordingState.shared.isRecording,
|
|
43
|
+
let shortcut = KeyboardShortcuts.getShortcut(for: .toggleTranscription),
|
|
44
|
+
!self.usesFunctionShortcut(shortcut) else {
|
|
45
|
+
return
|
|
46
|
+
}
|
|
47
|
+
Task { @MainActor in runner.run(.toggleTranscription) }
|
|
48
|
+
}
|
|
49
|
+
KeyboardShortcuts.onKeyDown(for: .holdToTranscribe) {
|
|
50
|
+
guard !ShortcutRecordingState.shared.isRecording,
|
|
51
|
+
let shortcut = KeyboardShortcuts.getShortcut(for: .holdToTranscribe),
|
|
52
|
+
!self.usesFunctionShortcut(shortcut) else {
|
|
53
|
+
return
|
|
54
|
+
}
|
|
55
|
+
Task { @MainActor in
|
|
56
|
+
_ = runner.beginHoldToTranscribe()
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
KeyboardShortcuts.onKeyUp(for: .holdToTranscribe) {
|
|
60
|
+
guard !ShortcutRecordingState.shared.isRecording,
|
|
61
|
+
let shortcut = KeyboardShortcuts.getShortcut(for: .holdToTranscribe),
|
|
62
|
+
!self.usesFunctionShortcut(shortcut) else {
|
|
63
|
+
return
|
|
64
|
+
}
|
|
65
|
+
Task { @MainActor in runner.endHoldToTranscribe() }
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
37
69
|
private func registerFunctionAwareTranscriptionHotkeys(runner: AgentCommandRunner) {
|
|
38
70
|
let eventMask =
|
|
39
71
|
CGEventMask(1 << CGEventType.keyDown.rawValue) |
|
|
@@ -84,6 +116,11 @@ final class ConfigurableHotkeyController {
|
|
|
84
116
|
break
|
|
85
117
|
}
|
|
86
118
|
|
|
119
|
+
if ShortcutRecordingState.shared.isRecording {
|
|
120
|
+
cancelPendingHoldToTranscribe()
|
|
121
|
+
return Unmanaged.passUnretained(event)
|
|
122
|
+
}
|
|
123
|
+
|
|
87
124
|
if handleToggleTranscriptionShortcut(type: type, event: event) {
|
|
88
125
|
return nil
|
|
89
126
|
}
|
|
@@ -99,13 +136,14 @@ final class ConfigurableHotkeyController {
|
|
|
99
136
|
|
|
100
137
|
private func handleToggleTranscriptionShortcut(type: CGEventType, event: CGEvent) -> Bool {
|
|
101
138
|
guard let shortcut = KeyboardShortcuts.getShortcut(for: .toggleTranscription),
|
|
139
|
+
usesFunctionShortcut(shortcut),
|
|
102
140
|
shortcutMatches(type: type, event: event, shortcut: shortcut) else {
|
|
103
141
|
return false
|
|
104
142
|
}
|
|
105
143
|
|
|
106
144
|
if type == .keyDown {
|
|
107
145
|
cancelPendingHoldToTranscribe()
|
|
108
|
-
suppressNextFunctionKeyRelease =
|
|
146
|
+
suppressNextFunctionKeyRelease = usesFunctionShortcut(shortcut)
|
|
109
147
|
|
|
110
148
|
if !isAutorepeat(event) && !holdToTranscribeIsRecording {
|
|
111
149
|
Task { @MainActor in
|
|
@@ -122,6 +160,7 @@ final class ConfigurableHotkeyController {
|
|
|
122
160
|
return false
|
|
123
161
|
}
|
|
124
162
|
guard !isBareFunctionShortcut(shortcut),
|
|
163
|
+
usesFunctionShortcut(shortcut),
|
|
125
164
|
shortcutMatches(type: type, event: event, shortcut: shortcut) else {
|
|
126
165
|
return false
|
|
127
166
|
}
|
|
@@ -237,8 +276,8 @@ final class ConfigurableHotkeyController {
|
|
|
237
276
|
return carbonModifiers(from: event.flags) == shortcut.carbonModifiers
|
|
238
277
|
}
|
|
239
278
|
|
|
240
|
-
private func
|
|
241
|
-
shortcut.carbonModifiers & kEventKeyModifierFnMask != 0
|
|
279
|
+
private func usesFunctionShortcut(_ shortcut: KeyboardShortcuts.Shortcut) -> Bool {
|
|
280
|
+
isBareFunctionShortcut(shortcut) || shortcut.carbonModifiers & kEventKeyModifierFnMask != 0
|
|
242
281
|
}
|
|
243
282
|
|
|
244
283
|
private func isBareFunctionShortcut(_ shortcut: KeyboardShortcuts.Shortcut) -> Bool {
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import AppKit
|
|
2
|
+
import Foundation
|
|
3
|
+
import SwiftUI
|
|
4
|
+
|
|
5
|
+
enum MenuBarIconState: Equatable {
|
|
6
|
+
case idle
|
|
7
|
+
case preparing
|
|
8
|
+
case recording
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
struct AgentCLIMenuBarIcon: View {
|
|
12
|
+
let state: MenuBarIconState
|
|
13
|
+
|
|
14
|
+
var body: some View {
|
|
15
|
+
if let image = Self.logoImage(state: state) {
|
|
16
|
+
Image(nsImage: image)
|
|
17
|
+
.resizable()
|
|
18
|
+
.aspectRatio(contentMode: .fit)
|
|
19
|
+
.frame(width: 22, height: 18)
|
|
20
|
+
.id(state)
|
|
21
|
+
.accessibilityLabel(accessibilityLabel)
|
|
22
|
+
} else {
|
|
23
|
+
Image(systemName: fallbackSystemImage)
|
|
24
|
+
.id(state)
|
|
25
|
+
.accessibilityLabel(accessibilityLabel)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
private var accessibilityLabel: Text {
|
|
30
|
+
switch state {
|
|
31
|
+
case .idle:
|
|
32
|
+
return Text("Agent CLI")
|
|
33
|
+
case .preparing:
|
|
34
|
+
return Text("Agent CLI preparing")
|
|
35
|
+
case .recording:
|
|
36
|
+
return Text("Agent CLI recording")
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
private var fallbackSystemImage: String {
|
|
41
|
+
switch state {
|
|
42
|
+
case .idle:
|
|
43
|
+
return "person.crop.circle"
|
|
44
|
+
case .preparing:
|
|
45
|
+
return "arrow.triangle.2.circlepath.circle.fill"
|
|
46
|
+
case .recording:
|
|
47
|
+
return "record.circle.fill"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private static func logoImage(state: MenuBarIconState) -> NSImage? {
|
|
52
|
+
switch state {
|
|
53
|
+
case .idle:
|
|
54
|
+
return idleLogoImage
|
|
55
|
+
case .preparing:
|
|
56
|
+
return preparingLogoImage
|
|
57
|
+
case .recording:
|
|
58
|
+
return recordingLogoImage
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
private static let idleLogoImage: NSImage? = {
|
|
63
|
+
guard let url = Bundle.main.url(forResource: "logo-avatar", withExtension: "svg"),
|
|
64
|
+
let image = NSImage(contentsOf: url)
|
|
65
|
+
else {
|
|
66
|
+
return nil
|
|
67
|
+
}
|
|
68
|
+
image.isTemplate = true
|
|
69
|
+
image.size = NSSize(width: 18, height: 18)
|
|
70
|
+
return image
|
|
71
|
+
}()
|
|
72
|
+
|
|
73
|
+
private static let recordingLogoImage: NSImage? = makeRecordingLogoImage()
|
|
74
|
+
private static let preparingLogoImage: NSImage? = makePreparingLogoImage()
|
|
75
|
+
|
|
76
|
+
private static func makeRecordingLogoImage() -> NSImage? {
|
|
77
|
+
makeBadgedLogoImage(badgeColor: .systemRed, badgeDiameter: 7)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private static func makePreparingLogoImage() -> NSImage? {
|
|
81
|
+
makeBadgedLogoImage(badgeColor: .controlAccentColor, badgeDiameter: 7)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private static func makeBadgedLogoImage(badgeColor: NSColor, badgeDiameter: CGFloat) -> NSImage? {
|
|
85
|
+
guard let url = Bundle.main.url(forResource: "logo-avatar", withExtension: "svg"),
|
|
86
|
+
let avatar = NSImage(contentsOf: url)
|
|
87
|
+
else {
|
|
88
|
+
return nil
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
avatar.size = NSSize(width: 18, height: 18)
|
|
92
|
+
|
|
93
|
+
let image = NSImage(size: NSSize(width: 22, height: 18))
|
|
94
|
+
image.lockFocus()
|
|
95
|
+
avatar.draw(
|
|
96
|
+
in: NSRect(x: 0, y: 0, width: 18, height: 18),
|
|
97
|
+
from: .zero,
|
|
98
|
+
operation: .sourceOver,
|
|
99
|
+
fraction: 1
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
NSColor.white.setFill()
|
|
103
|
+
NSBezierPath(ovalIn: NSRect(x: 12.5, y: 0.5, width: 10, height: 10)).fill()
|
|
104
|
+
badgeColor.setFill()
|
|
105
|
+
NSBezierPath(ovalIn: NSRect(x: 14, y: 2, width: badgeDiameter, height: badgeDiameter)).fill()
|
|
106
|
+
image.unlockFocus()
|
|
107
|
+
|
|
108
|
+
image.isTemplate = false
|
|
109
|
+
return image
|
|
110
|
+
}
|
|
111
|
+
}
|