agent-cli 0.96.3__tar.gz → 0.96.5__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.96.3 → agent_cli-0.96.5}/Casks/agent-cli.rb +2 -2
- {agent_cli-0.96.3 → agent_cli-0.96.5}/PKG-INFO +1 -1
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +18 -56
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +23 -1
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +2 -2
- agent_cli-0.96.5/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatusRow.swift +26 -0
- agent_cli-0.96.5/macos/AgentCLI/Sources/AgentCLI/MenuActivityTracker.swift +64 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +14 -1
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +1 -1
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +1 -1
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +10 -34
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +2 -1
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +96 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +6 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Tests/AgentCLITests/VoiceLevelMeterTests.swift +1 -1
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/appcast.xml +32 -18
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_macos_app.py +2 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.claude-plugin/README.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.cursorrules +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.dockerignore +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.env.example +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/logo.svg +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/release-drafter.yml +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/renovate.json +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/scripts/normalize_appcast.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/scripts/sync_extras.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/scripts/update_cask.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/workflows/docker.yml +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/workflows/docs.yml +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/workflows/markdown-code-runner.yml +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/workflows/pytest.yml +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/workflows/release-drafter.yml +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/workflows/release.yml +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.gitignore +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.jscpd.json +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.pre-commit-config.yaml +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.prompts/docs-review.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/.prompts/pr-review.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/CLAUDE.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/LICENSE +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/LLAMA_SERVER_USAGE.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/README.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/__main__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_extras.json +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/diarization.txt +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/mlx-whisper.txt +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/vad.txt +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/vectordb.txt +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/whisper-transformers.txt +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_requirements/wyoming.txt +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/_tools.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/diarize_live_session.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/speakers.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/transcribe.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/transcribe_live.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/api.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/cli.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/config.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/constants.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/alignment.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/deps.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/diarization.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/process.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/speaker_identity.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/utils.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/vad.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/daemon/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/daemon/cli.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/_branch_name.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/_config.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/_output.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/cleanup.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/cli.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/base.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/hooks.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/launch.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/project.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/skill/SKILL.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/registry.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/tmux.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/example-config.toml +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/install/common.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/install/extras.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/install/launchd.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/install/service_config.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/install/services.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/install/systemd.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/opts.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/py.typed +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/cli.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/common.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/proxy/api.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/tts/backends/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/tts/model_manager.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/tts/wyoming_handler.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/backends/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/backends/base.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/backends/mlx.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/backends/transformers.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/model_manager.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/services/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/services/asr.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docker/docker-compose.yml +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docker/memory-proxy.Dockerfile +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docker/rag-proxy.Dockerfile +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docker/transcribe-proxy.Dockerfile +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docker/tts.Dockerfile +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docker/whisper.Dockerfile +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/CNAME +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/architecture/index.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/architecture/memory.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/architecture/rag.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/assistant.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/chat.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/config.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/daemon.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/dev.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/diarize-live-session.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/index.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/install-extras.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/install-services.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/memory.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/server/index.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/server/transcribe-proxy.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/server/whisper.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/speak.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/speakers.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/start-services.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/transcribe-live.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/transcribe.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/configuration.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/getting-started.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/index.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/installation/docker.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/installation/index.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/installation/linux.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/installation/macos-app.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/installation/macos.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/installation/nixos.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/installation/windows.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/logo-avatar.svg +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/logo-clean.svg +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/docs/system-integration.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/justfile +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Package.resolved +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Package.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/README.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Resources/Info.plist +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatus.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/build-macos-app.sh +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/macos/test-macos-app-e2e.sh +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/pyproject.toml +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/reddit.md +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/shell.nix +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_speak.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_speakers.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_transcribe.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_transcribe_agent.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_transcribe_live.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_transcribe_recovery.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_voice_edit.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/conftest.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/core/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/core/test_audio.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/core/test_sse.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/core/test_vad.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/core/test_watch.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_cleanup.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_cli.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_hooks.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_launch.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_project.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_terminals.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_verification.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/install/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/install/test_extras.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/install/test_launchd.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_client.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_files.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_git_integration.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_store.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/mocks/audio.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/mocks/llm.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/__init__.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_api.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_history.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_store.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_alignment.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_api.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_api_integration.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_asr.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_cli.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_config.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_daemon.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_diarization.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_diarize_live_session.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_env_vars.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_faster_whisper_backend.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_json_output.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_llm.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_mlx_backend.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_normalize_appcast.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_process_manager.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_requires_extras.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_server_tts.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_server_whisper.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_services.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_speaker_identity.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_tools.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_transformers_backend.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_tts.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_update_cask.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_utils.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_wake_word.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/uv.lock +0 -0
- {agent_cli-0.96.3 → agent_cli-0.96.5}/zensical.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
cask "agent-cli" do
|
|
2
|
-
version "0.96.
|
|
3
|
-
sha256 "
|
|
2
|
+
version "0.96.4"
|
|
3
|
+
sha256 "f80e56d625745e1342a01550c38909916f09442588ad35cd6063a2ad2eae4e8e"
|
|
4
4
|
|
|
5
5
|
url "https://github.com/basnijholt/agent-cli/releases/download/v#{version}/AgentCLI.dmg"
|
|
6
6
|
name "Agent CLI"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-cli
|
|
3
|
-
Version: 0.96.
|
|
3
|
+
Version: 0.96.5
|
|
4
4
|
Summary: A suite of AI-powered command-line tools for text correction, audio transcription, and voice assistance.
|
|
5
5
|
Project-URL: Homepage, https://github.com/basnijholt/agent-cli
|
|
6
6
|
Author-email: Bas Nijholt <bas@nijho.lt>
|
{agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift
RENAMED
|
@@ -18,11 +18,6 @@ private enum HoldTranscriptionState {
|
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
private struct ActiveCommandActivity {
|
|
22
|
-
let title: String
|
|
23
|
-
let startedAt: Date
|
|
24
|
-
}
|
|
25
|
-
|
|
26
21
|
@MainActor
|
|
27
22
|
final class AgentCommandRunner: ObservableObject {
|
|
28
23
|
static let shared = AgentCommandRunner()
|
|
@@ -36,11 +31,7 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
36
31
|
private var recordingIndicator = RecordingIndicatorController()
|
|
37
32
|
private let pasteController: TranscriptPasteController
|
|
38
33
|
private let bootstrap: AgentBootstrap
|
|
39
|
-
private var
|
|
40
|
-
private var recordingStartedAt: Date?
|
|
41
|
-
private var transcribingStartedAt: Date?
|
|
42
|
-
private var activeCommandActivities: [String: ActiveCommandActivity] = [:]
|
|
43
|
-
private var activeCommandActivityOrder: [String] = []
|
|
34
|
+
private var activityTracker = MenuActivityTracker()
|
|
44
35
|
private var pendingStopRecordingCommands: Set<String> = []
|
|
45
36
|
private var holdTranscriptionState: HoldTranscriptionState = .idle
|
|
46
37
|
private var holdToTranscribePasteTarget: FocusedTextTarget?
|
|
@@ -60,36 +51,20 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
60
51
|
}
|
|
61
52
|
|
|
62
53
|
func menuActivityStatus(now: Date) -> MenuActivityStatus {
|
|
63
|
-
if bootstrapPhase.isPreparing {
|
|
64
|
-
return MenuActivityStatus.active(
|
|
65
|
-
title: bootstrapPhase.activityTitle,
|
|
66
|
-
startedAt: bootstrapPhaseStartedAt ?? now,
|
|
67
|
-
now: now
|
|
68
|
-
)
|
|
69
|
-
}
|
|
70
|
-
if let transcribingStartedAt {
|
|
71
|
-
return MenuActivityStatus.active(title: "Transcribing", startedAt: transcribingStartedAt, now: now)
|
|
72
|
-
}
|
|
73
|
-
if isRecording {
|
|
74
|
-
return MenuActivityStatus.active(title: "Recording", startedAt: recordingStartedAt ?? now, now: now)
|
|
75
|
-
}
|
|
76
|
-
if let activity = currentCommandActivity {
|
|
77
|
-
return MenuActivityStatus.active(title: activity.title, startedAt: activity.startedAt, now: now)
|
|
78
|
-
}
|
|
79
54
|
if hasLastError && statusMessage.localizedCaseInsensitiveContains("failed") {
|
|
80
|
-
return
|
|
55
|
+
return activityTracker.status(
|
|
56
|
+
now: now,
|
|
57
|
+
fallback: MenuActivityStatus.inactive(message: "Last command failed")
|
|
58
|
+
)
|
|
81
59
|
}
|
|
82
|
-
return
|
|
60
|
+
return activityTracker.status(
|
|
61
|
+
now: now,
|
|
62
|
+
fallback: MenuActivityStatus.completed(title: Self.compactMenuStatus(statusMessage))
|
|
63
|
+
)
|
|
83
64
|
}
|
|
84
65
|
|
|
85
66
|
var menuBarIconState: MenuBarIconState {
|
|
86
|
-
|
|
87
|
-
return .recording
|
|
88
|
-
}
|
|
89
|
-
if bootstrapPhase.isPreparing {
|
|
90
|
-
return .preparing
|
|
91
|
-
}
|
|
92
|
-
return .idle
|
|
67
|
+
MenuBarIconState.current(isPreparing: bootstrapPhase.isPreparing, isRecording: isRecording)
|
|
93
68
|
}
|
|
94
69
|
|
|
95
70
|
init(
|
|
@@ -146,10 +121,10 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
146
121
|
bootstrapPhase = phase
|
|
147
122
|
if phase.isPreparing {
|
|
148
123
|
if !wasPreparing || phaseChanged {
|
|
149
|
-
|
|
124
|
+
activityTracker.beginBootstrap(title: phase.activityTitle)
|
|
150
125
|
}
|
|
151
126
|
} else {
|
|
152
|
-
|
|
127
|
+
activityTracker.finishBootstrap()
|
|
153
128
|
}
|
|
154
129
|
}
|
|
155
130
|
|
|
@@ -390,34 +365,21 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
390
365
|
pendingStopRecordingCommands.remove(command.identifier)
|
|
391
366
|
}
|
|
392
367
|
|
|
393
|
-
private var currentCommandActivity: ActiveCommandActivity? {
|
|
394
|
-
activeCommandActivityOrder.reversed().compactMap { activeCommandActivities[$0] }.first
|
|
395
|
-
}
|
|
396
|
-
|
|
397
368
|
private func beginCommandActivity(for command: AgentCommand) {
|
|
398
|
-
|
|
399
|
-
activeCommandActivityOrder.append(command.identifier)
|
|
400
|
-
}
|
|
401
|
-
activeCommandActivities[command.identifier] = ActiveCommandActivity(
|
|
402
|
-
title: command.menuActivityTitle,
|
|
403
|
-
startedAt: Date()
|
|
404
|
-
)
|
|
369
|
+
activityTracker.beginCommand(identifier: command.identifier, title: command.menuActivityTitle)
|
|
405
370
|
}
|
|
406
371
|
|
|
407
372
|
private func finishCommandActivity(for command: AgentCommand) {
|
|
408
|
-
|
|
409
|
-
activeCommandActivityOrder.removeAll { $0 == command.identifier }
|
|
373
|
+
activityTracker.finishCommand(identifier: command.identifier)
|
|
410
374
|
}
|
|
411
375
|
|
|
412
376
|
private func beginTranscribingActivity() {
|
|
413
|
-
|
|
414
|
-
transcribingStartedAt = Date()
|
|
415
|
-
}
|
|
377
|
+
activityTracker.beginTranscribing()
|
|
416
378
|
}
|
|
417
379
|
|
|
418
380
|
private func clearTranscribingActivityIfFinished() {
|
|
419
381
|
if pendingStopRecordingCommands.isEmpty && !holdTranscriptionState.isFinishing {
|
|
420
|
-
|
|
382
|
+
activityTracker.finishTranscribing()
|
|
421
383
|
}
|
|
422
384
|
}
|
|
423
385
|
|
|
@@ -447,7 +409,7 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
447
409
|
recordingIndicator.begin(for: command)
|
|
448
410
|
isRecording = recordingIndicator.isRecording
|
|
449
411
|
if !wasRecording && isRecording {
|
|
450
|
-
|
|
412
|
+
activityTracker.beginRecording()
|
|
451
413
|
}
|
|
452
414
|
return true
|
|
453
415
|
}
|
|
@@ -456,7 +418,7 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
456
418
|
recordingIndicator.end(for: command)
|
|
457
419
|
isRecording = recordingIndicator.isRecording
|
|
458
420
|
if !isRecording {
|
|
459
|
-
|
|
421
|
+
activityTracker.finishRecording()
|
|
460
422
|
}
|
|
461
423
|
}
|
|
462
424
|
|
|
@@ -12,6 +12,21 @@ private enum AgentCLIRuntimeMode: Equatable {
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
private final class UserInstalledCLICheckCache {
|
|
16
|
+
private let lock = NSLock()
|
|
17
|
+
private var isAvailable = false
|
|
18
|
+
|
|
19
|
+
func hasSuccessfulCheck() -> Bool {
|
|
20
|
+
lock.withLock { isAvailable }
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
func update(with result: CommandResult) {
|
|
24
|
+
lock.withLock {
|
|
25
|
+
isAvailable = result.exitCode == 0
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
15
30
|
typealias AgentProcessRunner = (URL, [String], [String: String]) -> CommandResult
|
|
16
31
|
typealias LocalhostConnector = (UInt16) -> Bool
|
|
17
32
|
|
|
@@ -42,6 +57,7 @@ struct AgentRuntime {
|
|
|
42
57
|
private let userDefaults: UserDefaults
|
|
43
58
|
private let processRunner: AgentProcessRunner
|
|
44
59
|
private let localhostConnector: LocalhostConnector
|
|
60
|
+
private let userInstalledCLICheckCache: UserInstalledCLICheckCache
|
|
45
61
|
private let whisperReadyTimeout: TimeInterval
|
|
46
62
|
let appSupportURL: URL
|
|
47
63
|
let bundledUVURL: URL
|
|
@@ -73,6 +89,7 @@ struct AgentRuntime {
|
|
|
73
89
|
self.userDefaults = userDefaults
|
|
74
90
|
self.processRunner = processRunner
|
|
75
91
|
self.localhostConnector = localhostConnector
|
|
92
|
+
self.userInstalledCLICheckCache = UserInstalledCLICheckCache()
|
|
76
93
|
self.whisperReadyTimeout = whisperReadyTimeout
|
|
77
94
|
|
|
78
95
|
if let override = environment["AGENTCLI_APP_SUPPORT_DIR"], !override.isEmpty {
|
|
@@ -196,8 +213,13 @@ struct AgentRuntime {
|
|
|
196
213
|
}
|
|
197
214
|
|
|
198
215
|
if mode == .userInstalled {
|
|
216
|
+
if !force, userInstalledCLICheckCache.hasSuccessfulCheck() {
|
|
217
|
+
return CommandResult(exitCode: 0, output: "")
|
|
218
|
+
}
|
|
199
219
|
progress(.checkingRuntime)
|
|
200
|
-
|
|
220
|
+
let result = ensureUserInstalledCLIAvailable()
|
|
221
|
+
userInstalledCLICheckCache.update(with: result)
|
|
222
|
+
return result
|
|
201
223
|
}
|
|
202
224
|
|
|
203
225
|
if !force,
|
|
@@ -217,7 +217,6 @@ final class ConfigurableHotkeyController {
|
|
|
217
217
|
|
|
218
218
|
private func handleFunctionKeyChanged(type: CGEventType, event: CGEvent) -> Bool {
|
|
219
219
|
guard type == .flagsChanged,
|
|
220
|
-
Int(event.getIntegerValueField(.keyboardEventKeycode)) == kVK_Function,
|
|
221
220
|
let shortcut = KeyboardShortcuts.getShortcut(for: .holdToTranscribe),
|
|
222
221
|
isBareFunctionShortcut(shortcut) else {
|
|
223
222
|
return false
|
|
@@ -225,12 +224,13 @@ final class ConfigurableHotkeyController {
|
|
|
225
224
|
|
|
226
225
|
let isFunctionDown = event.flags.contains(CGEventFlags.maskSecondaryFn)
|
|
227
226
|
if isFunctionDown {
|
|
228
|
-
guard !functionKeyIsDown else { return
|
|
227
|
+
guard !functionKeyIsDown else { return false }
|
|
229
228
|
functionKeyIsDown = true
|
|
230
229
|
schedulePendingHoldToTranscribe()
|
|
231
230
|
return true
|
|
232
231
|
}
|
|
233
232
|
|
|
233
|
+
guard functionKeyIsDown else { return false }
|
|
234
234
|
functionKeyIsDown = false
|
|
235
235
|
cancelPendingHoldToTranscribe()
|
|
236
236
|
guard !suppressNextFunctionKeyRelease else {
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import AppKit
|
|
2
|
+
|
|
3
|
+
@MainActor
|
|
4
|
+
final class MenuActivityStatusRow {
|
|
5
|
+
private let prefix: String
|
|
6
|
+
private let item: NSMenuItem
|
|
7
|
+
private let separator: NSMenuItem
|
|
8
|
+
|
|
9
|
+
init(prefix: String) {
|
|
10
|
+
self.prefix = prefix
|
|
11
|
+
item = NSMenuItem(title: "", action: nil, keyEquivalent: "")
|
|
12
|
+
item.isEnabled = false
|
|
13
|
+
separator = .separator()
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
func add(to menu: NSMenu) {
|
|
17
|
+
menu.addItem(item)
|
|
18
|
+
menu.addItem(separator)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
func update(_ activityStatus: MenuActivityStatus) {
|
|
22
|
+
item.title = "\(prefix)\(activityStatus.message)"
|
|
23
|
+
item.isHidden = !activityStatus.isActive
|
|
24
|
+
separator.isHidden = !activityStatus.isActive
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
|
|
3
|
+
struct MenuActivityTracker {
|
|
4
|
+
private struct Activity {
|
|
5
|
+
let title: String
|
|
6
|
+
let startedAt: Date
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
private var bootstrapActivity: Activity?
|
|
10
|
+
private var recordingActivity: Activity?
|
|
11
|
+
private var transcribingActivity: Activity?
|
|
12
|
+
private var commandActivities: [String: Activity] = [:]
|
|
13
|
+
private var commandActivityOrder: [String] = []
|
|
14
|
+
|
|
15
|
+
mutating func beginBootstrap(title: String, at startedAt: Date = Date()) {
|
|
16
|
+
bootstrapActivity = Activity(title: title, startedAt: startedAt)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
mutating func finishBootstrap() {
|
|
20
|
+
bootstrapActivity = nil
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
mutating func beginRecording(at startedAt: Date = Date()) {
|
|
24
|
+
guard recordingActivity == nil else { return }
|
|
25
|
+
recordingActivity = Activity(title: "Recording", startedAt: startedAt)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
mutating func finishRecording() {
|
|
29
|
+
recordingActivity = nil
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
mutating func beginTranscribing(at startedAt: Date = Date()) {
|
|
33
|
+
guard transcribingActivity == nil else { return }
|
|
34
|
+
transcribingActivity = Activity(title: "Transcribing", startedAt: startedAt)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
mutating func finishTranscribing() {
|
|
38
|
+
transcribingActivity = nil
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
mutating func beginCommand(identifier: String, title: String, at startedAt: Date = Date()) {
|
|
42
|
+
if commandActivities[identifier] == nil {
|
|
43
|
+
commandActivityOrder.append(identifier)
|
|
44
|
+
}
|
|
45
|
+
commandActivities[identifier] = Activity(title: title, startedAt: startedAt)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
mutating func finishCommand(identifier: String) {
|
|
49
|
+
commandActivities.removeValue(forKey: identifier)
|
|
50
|
+
commandActivityOrder.removeAll { $0 == identifier }
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
func status(now: Date = Date(), fallback: MenuActivityStatus) -> MenuActivityStatus {
|
|
54
|
+
guard let activity = currentActivity else { return fallback }
|
|
55
|
+
return MenuActivityStatus.active(title: activity.title, startedAt: activity.startedAt, now: now)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private var currentActivity: Activity? {
|
|
59
|
+
bootstrapActivity
|
|
60
|
+
?? transcribingActivity
|
|
61
|
+
?? recordingActivity
|
|
62
|
+
?? commandActivityOrder.reversed().compactMap { commandActivities[$0] }.first
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -6,6 +6,16 @@ enum MenuBarIconState: Equatable {
|
|
|
6
6
|
case idle
|
|
7
7
|
case preparing
|
|
8
8
|
case recording
|
|
9
|
+
|
|
10
|
+
static func current(isPreparing: Bool, isRecording: Bool) -> Self {
|
|
11
|
+
if isPreparing {
|
|
12
|
+
return .preparing
|
|
13
|
+
}
|
|
14
|
+
if isRecording {
|
|
15
|
+
return .recording
|
|
16
|
+
}
|
|
17
|
+
return .idle
|
|
18
|
+
}
|
|
9
19
|
}
|
|
10
20
|
|
|
11
21
|
struct AgentCLIMenuBarIcon: View {
|
|
@@ -94,12 +104,15 @@ enum MenuBarIconImage {
|
|
|
94
104
|
|
|
95
105
|
let image = NSImage(size: NSSize(width: 22, height: 18))
|
|
96
106
|
image.lockFocus()
|
|
107
|
+
let logoRect = NSRect(x: 0, y: 0, width: 18, height: 18)
|
|
97
108
|
avatar.draw(
|
|
98
|
-
in:
|
|
109
|
+
in: logoRect,
|
|
99
110
|
from: .zero,
|
|
100
111
|
operation: .sourceOver,
|
|
101
112
|
fraction: 1
|
|
102
113
|
)
|
|
114
|
+
NSColor.white.setFill()
|
|
115
|
+
logoRect.fill(using: .sourceIn)
|
|
103
116
|
|
|
104
117
|
NSColor.white.setFill()
|
|
105
118
|
NSBezierPath(ovalIn: NSRect(x: 12.5, y: 0.5, width: 10, height: 10)).fill()
|
|
@@ -308,7 +308,7 @@ struct SettingsView: View {
|
|
|
308
308
|
} header: {
|
|
309
309
|
Text("General")
|
|
310
310
|
} footer: {
|
|
311
|
-
Text("Runs the agent-cli found on PATH with your normal config instead of the app's private bundled-uv runtime. Recording sounds use Frog when recording starts and
|
|
311
|
+
Text("Runs the agent-cli found on PATH with your normal config instead of the app's private bundled-uv runtime. Recording sounds use Frog when recording starts and Purr when recording ends.")
|
|
312
312
|
}
|
|
313
313
|
|
|
314
314
|
Section {
|
{agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift
RENAMED
|
@@ -20,10 +20,8 @@ final class StatusMenuController: NSObject, NSMenuDelegate {
|
|
|
20
20
|
private let recentRecordingsMenu = NSMenu()
|
|
21
21
|
private let troubleshootingMenu = NSMenu()
|
|
22
22
|
private var voiceStatusItem: NSMenuItem?
|
|
23
|
-
private var
|
|
24
|
-
private var
|
|
25
|
-
private var troubleshootingActivityStatusItem: NSMenuItem?
|
|
26
|
-
private var troubleshootingActivityStatusSeparator: NSMenuItem?
|
|
23
|
+
private var recentActivityStatusRow: MenuActivityStatusRow?
|
|
24
|
+
private var troubleshootingActivityStatusRow: MenuActivityStatusRow?
|
|
27
25
|
private var statusRefreshTimer: Timer?
|
|
28
26
|
|
|
29
27
|
private override init() {
|
|
@@ -113,12 +111,7 @@ final class StatusMenuController: NSObject, NSMenuDelegate {
|
|
|
113
111
|
|
|
114
112
|
private func rebuildRecentRecordingsMenu() {
|
|
115
113
|
recentRecordingsMenu.removeAllItems()
|
|
116
|
-
|
|
117
|
-
let activitySeparator = NSMenuItem.separator()
|
|
118
|
-
recentRecordingsMenu.addItem(activityItem)
|
|
119
|
-
recentRecordingsMenu.addItem(activitySeparator)
|
|
120
|
-
recentActivityStatusItem = activityItem
|
|
121
|
-
recentActivityStatusSeparator = activitySeparator
|
|
114
|
+
recentActivityStatusRow = activityStatusRow(in: recentRecordingsMenu)
|
|
122
115
|
|
|
123
116
|
let recentTranscriptions = RecentTranscriptionReader.recentTranscriptions()
|
|
124
117
|
if recentTranscriptions.isEmpty {
|
|
@@ -141,12 +134,7 @@ final class StatusMenuController: NSObject, NSMenuDelegate {
|
|
|
141
134
|
|
|
142
135
|
private func rebuildTroubleshootingMenu() {
|
|
143
136
|
troubleshootingMenu.removeAllItems()
|
|
144
|
-
|
|
145
|
-
let activitySeparator = NSMenuItem.separator()
|
|
146
|
-
troubleshootingMenu.addItem(activityItem)
|
|
147
|
-
troubleshootingMenu.addItem(activitySeparator)
|
|
148
|
-
troubleshootingActivityStatusItem = activityItem
|
|
149
|
-
troubleshootingActivityStatusSeparator = activitySeparator
|
|
137
|
+
troubleshootingActivityStatusRow = activityStatusRow(in: troubleshootingMenu)
|
|
150
138
|
|
|
151
139
|
troubleshootingMenu.addItem(actionItem(
|
|
152
140
|
"Voice Service Status",
|
|
@@ -240,26 +228,14 @@ final class StatusMenuController: NSObject, NSMenuDelegate {
|
|
|
240
228
|
}
|
|
241
229
|
|
|
242
230
|
private func updateSubmenuActivityStatus(_ activityStatus: MenuActivityStatus) {
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
separator: recentActivityStatusSeparator,
|
|
246
|
-
activityStatus: activityStatus
|
|
247
|
-
)
|
|
248
|
-
updateSubmenuActivityStatus(
|
|
249
|
-
item: troubleshootingActivityStatusItem,
|
|
250
|
-
separator: troubleshootingActivityStatusSeparator,
|
|
251
|
-
activityStatus: activityStatus
|
|
252
|
-
)
|
|
231
|
+
recentActivityStatusRow?.update(activityStatus)
|
|
232
|
+
troubleshootingActivityStatusRow?.update(activityStatus)
|
|
253
233
|
}
|
|
254
234
|
|
|
255
|
-
private func
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
) {
|
|
260
|
-
item?.title = "\(Self.activityStatusTitlePrefix)\(activityStatus.message)"
|
|
261
|
-
item?.isHidden = !activityStatus.isActive
|
|
262
|
-
separator?.isHidden = !activityStatus.isActive
|
|
235
|
+
private func activityStatusRow(in menu: NSMenu) -> MenuActivityStatusRow {
|
|
236
|
+
let row = MenuActivityStatusRow(prefix: Self.activityStatusTitlePrefix)
|
|
237
|
+
row.add(to: menu)
|
|
238
|
+
return row
|
|
263
239
|
}
|
|
264
240
|
|
|
265
241
|
private var usesUserInstalledAgentCLI: Bool {
|
{agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift
RENAMED
|
@@ -195,7 +195,8 @@ final class VoiceLevelMeter: NSObject, ObservableObject {
|
|
|
195
195
|
|
|
196
196
|
private static func normalizedPower(_ power: Float, minimumPower: Float) -> CGFloat {
|
|
197
197
|
guard power > minimumPower else { return 0.08 }
|
|
198
|
-
|
|
198
|
+
let linearLevel = CGFloat((power - minimumPower) / abs(minimumPower))
|
|
199
|
+
return CGFloat(sqrt(Double(linearLevel)))
|
|
199
200
|
}
|
|
200
201
|
|
|
201
202
|
private static func samples(from buffer: AVAudioPCMBuffer) -> [Float]? {
|
{agent_cli-0.96.3 → agent_cli-0.96.5}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift
RENAMED
|
@@ -108,6 +108,33 @@ final class AgentCommandTests: XCTestCase {
|
|
|
108
108
|
XCTAssertTrue(runtime.commandEnvironment()["PATH"]?.contains("/custom/bin") == true)
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
+
func testUserInstalledRuntimeCachesSuccessfulCLIAvailabilityCheck() {
|
|
112
|
+
let defaults = UserDefaults(suiteName: "AgentCLITests.user-runtime-cache")!
|
|
113
|
+
defaults.removePersistentDomain(forName: "AgentCLITests.user-runtime-cache")
|
|
114
|
+
defaults.set(true, forKey: RuntimeSettings.useUserInstalledAgentCLIKey)
|
|
115
|
+
var processArguments: [[String]] = []
|
|
116
|
+
let runtime = AgentRuntime(
|
|
117
|
+
environment: [
|
|
118
|
+
"AGENTCLI_APP_SUPPORT_DIR": "/tmp/agentcli-test-support",
|
|
119
|
+
"PATH": "/custom/bin",
|
|
120
|
+
"SHELL": "/no/such/shell",
|
|
121
|
+
],
|
|
122
|
+
userDefaults: defaults,
|
|
123
|
+
processRunner: { _, arguments, _ in
|
|
124
|
+
processArguments.append(arguments)
|
|
125
|
+
return CommandResult(exitCode: 0, output: "agent-cli 1.2.3")
|
|
126
|
+
}
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
var phases: [BootstrapPhase] = []
|
|
130
|
+
XCTAssertEqual(runtime.ensureReady(for: .cliRuntime) { phases.append($0) }.exitCode, 0)
|
|
131
|
+
XCTAssertEqual(runtime.ensureReady(for: .cliRuntime) { phases.append($0) }.exitCode, 0)
|
|
132
|
+
XCTAssertEqual(runtime.ensureReady(for: .cliRuntime, force: true) { phases.append($0) }.exitCode, 0)
|
|
133
|
+
|
|
134
|
+
XCTAssertEqual(processArguments, [["agent-cli", "--version"], ["agent-cli", "--version"]])
|
|
135
|
+
XCTAssertEqual(phases, [.checkingRuntime, .checkingRuntime])
|
|
136
|
+
}
|
|
137
|
+
|
|
111
138
|
func testUserInstalledCLIPathUsesLoginShellPathAndCommonUvBins() {
|
|
112
139
|
let defaults = UserDefaults(suiteName: "AgentCLITests.user-runtime-path")!
|
|
113
140
|
defaults.removePersistentDomain(forName: "AgentCLITests.user-runtime-path")
|
|
@@ -280,6 +307,13 @@ final class AgentCommandTests: XCTestCase {
|
|
|
280
307
|
)
|
|
281
308
|
}
|
|
282
309
|
|
|
310
|
+
func testMenuBarIconShowsPreparingBeforeRecording() {
|
|
311
|
+
XCTAssertEqual(MenuBarIconState.current(isPreparing: false, isRecording: false), .idle)
|
|
312
|
+
XCTAssertEqual(MenuBarIconState.current(isPreparing: false, isRecording: true), .recording)
|
|
313
|
+
XCTAssertEqual(MenuBarIconState.current(isPreparing: true, isRecording: false), .preparing)
|
|
314
|
+
XCTAssertEqual(MenuBarIconState.current(isPreparing: true, isRecording: true), .preparing)
|
|
315
|
+
}
|
|
316
|
+
|
|
283
317
|
func testMenuActivityStatusFormatsActiveWorkWithSpinnerAndElapsedCounter() {
|
|
284
318
|
let startedAt = Date(timeIntervalSinceReferenceDate: 1_000)
|
|
285
319
|
let now = Date(timeIntervalSinceReferenceDate: 1_125)
|
|
@@ -297,6 +331,68 @@ final class AgentCommandTests: XCTestCase {
|
|
|
297
331
|
XCTAssertFalse(MenuActivityStatus.completed(title: "Ready").isActive)
|
|
298
332
|
}
|
|
299
333
|
|
|
334
|
+
func testMenuActivityTrackerPrioritizesAndRestoresActivities() {
|
|
335
|
+
var tracker = MenuActivityTracker()
|
|
336
|
+
let startedAt = Date(timeIntervalSinceReferenceDate: 1_000)
|
|
337
|
+
let now = Date(timeIntervalSinceReferenceDate: 1_065)
|
|
338
|
+
let fallback = MenuActivityStatus.completed(title: "Ready")
|
|
339
|
+
|
|
340
|
+
tracker.beginCommand(identifier: "autocorrect", title: "Autocorrect Clipboard", at: startedAt)
|
|
341
|
+
XCTAssertEqual(
|
|
342
|
+
tracker.status(now: now, fallback: fallback),
|
|
343
|
+
MenuActivityStatus.active(title: "Autocorrect Clipboard", startedAt: startedAt, now: now)
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
tracker.beginRecording(at: startedAt.addingTimeInterval(10))
|
|
347
|
+
XCTAssertEqual(
|
|
348
|
+
tracker.status(now: now, fallback: fallback),
|
|
349
|
+
MenuActivityStatus.active(title: "Recording", startedAt: startedAt.addingTimeInterval(10), now: now)
|
|
350
|
+
)
|
|
351
|
+
|
|
352
|
+
tracker.beginTranscribing(at: startedAt.addingTimeInterval(20))
|
|
353
|
+
XCTAssertEqual(
|
|
354
|
+
tracker.status(now: now, fallback: fallback),
|
|
355
|
+
MenuActivityStatus.active(title: "Transcribing", startedAt: startedAt.addingTimeInterval(20), now: now)
|
|
356
|
+
)
|
|
357
|
+
|
|
358
|
+
tracker.beginBootstrap(title: "Installing CLI runtime", at: startedAt.addingTimeInterval(30))
|
|
359
|
+
XCTAssertEqual(
|
|
360
|
+
tracker.status(now: now, fallback: fallback),
|
|
361
|
+
MenuActivityStatus.active(
|
|
362
|
+
title: "Installing CLI runtime",
|
|
363
|
+
startedAt: startedAt.addingTimeInterval(30),
|
|
364
|
+
now: now
|
|
365
|
+
)
|
|
366
|
+
)
|
|
367
|
+
|
|
368
|
+
tracker.finishBootstrap()
|
|
369
|
+
XCTAssertEqual(
|
|
370
|
+
tracker.status(now: now, fallback: fallback),
|
|
371
|
+
MenuActivityStatus.active(title: "Transcribing", startedAt: startedAt.addingTimeInterval(20), now: now)
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
tracker.finishTranscribing()
|
|
375
|
+
tracker.finishRecording()
|
|
376
|
+
tracker.finishCommand(identifier: "autocorrect")
|
|
377
|
+
|
|
378
|
+
XCTAssertEqual(tracker.status(now: now, fallback: fallback), fallback)
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
func testMenuActivityTrackerRestoresPreviousCommandWhenLatestFinishes() {
|
|
382
|
+
var tracker = MenuActivityTracker()
|
|
383
|
+
let startedAt = Date(timeIntervalSinceReferenceDate: 2_000)
|
|
384
|
+
let fallback = MenuActivityStatus.completed(title: "Ready")
|
|
385
|
+
|
|
386
|
+
tracker.beginCommand(identifier: "first", title: "First Command", at: startedAt)
|
|
387
|
+
tracker.beginCommand(identifier: "second", title: "Second Command", at: startedAt.addingTimeInterval(4))
|
|
388
|
+
tracker.finishCommand(identifier: "second")
|
|
389
|
+
|
|
390
|
+
XCTAssertEqual(
|
|
391
|
+
tracker.status(now: startedAt.addingTimeInterval(12), fallback: fallback),
|
|
392
|
+
MenuActivityStatus.active(title: "First Command", startedAt: startedAt, now: startedAt.addingTimeInterval(12))
|
|
393
|
+
)
|
|
394
|
+
}
|
|
395
|
+
|
|
300
396
|
@MainActor
|
|
301
397
|
func testIdleMenuStatusUsesCompletedCheckmark() {
|
|
302
398
|
let runner = AgentCommandRunner { _, _, _ in
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#if canImport(XCTest)
|
|
2
|
+
import AppKit
|
|
2
3
|
import XCTest
|
|
3
4
|
@testable import AgentCLI
|
|
4
5
|
|
|
@@ -28,6 +29,11 @@ final class RecordingIndicatorControllerTests: XCTestCase {
|
|
|
28
29
|
XCTAssertEqual(player.events, [.startedRecording, .finishedRecording])
|
|
29
30
|
}
|
|
30
31
|
|
|
32
|
+
func testRecordingSoundCueNamesUsePurrForFinishedRecording() {
|
|
33
|
+
XCTAssertEqual(RecordingSoundEvent.startedRecording.cueName, NSSound.Name("Frog"))
|
|
34
|
+
XCTAssertEqual(RecordingSoundEvent.finishedRecording.cueName, NSSound.Name("Purr"))
|
|
35
|
+
}
|
|
36
|
+
|
|
31
37
|
func testFinishSoundPlaysOnlyWhenAllRecordingCommandsHaveEnded() {
|
|
32
38
|
let defaults = UserDefaults(suiteName: "AgentCLITests.recording-sounds-nested")!
|
|
33
39
|
defaults.removePersistentDomain(forName: "AgentCLITests.recording-sounds-nested")
|