agent-cli 0.95.6__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.6 → agent_cli-0.95.7}/PKG-INFO +1 -1
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +1 -1
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -6
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +53 -16
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +33 -9
- agent_cli-0.95.7/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +48 -0
- agent_cli-0.95.7/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +111 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +5 -1
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_git_integration.py +1 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_macos_app.py +49 -10
- agent_cli-0.95.6/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -67
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.claude-plugin/README.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.cursorrules +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.dockerignore +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.env.example +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/logo.svg +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/release-drafter.yml +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/renovate.json +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/scripts/sync_extras.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/workflows/docker.yml +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/workflows/docs.yml +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/workflows/markdown-code-runner.yml +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/workflows/pytest.yml +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/workflows/release-drafter.yml +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/workflows/release.yml +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.gitignore +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.jscpd.json +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.pre-commit-config.yaml +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.prompts/docs-review.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/.prompts/pr-review.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/CLAUDE.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/LICENSE +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/LLAMA_SERVER_USAGE.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/README.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/__main__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_extras.json +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/diarization.txt +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/mlx-whisper.txt +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/vad.txt +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/vectordb.txt +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/whisper-transformers.txt +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_requirements/wyoming.txt +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/_tools.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/diarize_live_session.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/speakers.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/transcribe.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/transcribe_live.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/api.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/cli.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/config.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/constants.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/alignment.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/deps.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/diarization.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/process.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/speaker_identity.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/utils.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/vad.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/daemon/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/daemon/cli.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/_branch_name.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/_config.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/_output.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/cleanup.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/cli.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/base.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/hooks.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/launch.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/project.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/skill/SKILL.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/registry.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/tmux.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/example-config.toml +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/install/common.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/install/extras.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/install/launchd.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/install/service_config.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/install/services.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/install/systemd.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/opts.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/py.typed +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/cli.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/common.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/proxy/api.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/tts/backends/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/tts/model_manager.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/tts/wyoming_handler.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/backends/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/backends/base.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/backends/mlx.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/backends/transformers.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/model_manager.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/services/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/services/asr.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docker/docker-compose.yml +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docker/memory-proxy.Dockerfile +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docker/rag-proxy.Dockerfile +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docker/transcribe-proxy.Dockerfile +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docker/tts.Dockerfile +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docker/whisper.Dockerfile +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/CNAME +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/architecture/index.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/architecture/memory.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/architecture/rag.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/assistant.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/chat.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/config.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/daemon.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/dev.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/diarize-live-session.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/index.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/install-extras.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/install-services.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/memory.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/server/index.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/server/transcribe-proxy.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/server/whisper.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/speak.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/speakers.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/start-services.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/transcribe-live.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/transcribe.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/configuration.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/getting-started.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/index.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/installation/docker.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/installation/index.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/installation/linux.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/installation/macos.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/installation/nixos.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/installation/windows.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/logo-avatar.svg +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/logo-clean.svg +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/docs/system-integration.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/justfile +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Package.resolved +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Package.swift +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/README.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Resources/Info.plist +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/build-macos-app.sh +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/macos/test-macos-app-e2e.sh +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/pyproject.toml +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/reddit.md +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/shell.nix +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_speak.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_speakers.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_transcribe.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_transcribe_agent.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_transcribe_live.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_transcribe_recovery.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_voice_edit.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/conftest.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/core/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/core/test_audio.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/core/test_sse.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/core/test_vad.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/core/test_watch.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_cleanup.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_cli.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_hooks.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_launch.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_project.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_terminals.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_verification.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/install/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/install/test_extras.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/install/test_launchd.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_client.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_files.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_store.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/mocks/audio.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/mocks/llm.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/__init__.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_api.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_history.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_store.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_alignment.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_api.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_api_integration.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_asr.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_cli.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_config.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_daemon.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_diarization.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_diarize_live_session.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_env_vars.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_faster_whisper_backend.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_json_output.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_llm.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_mlx_backend.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_process_manager.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_requires_extras.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_server_tts.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_server_whisper.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_services.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_speaker_identity.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_tools.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_transformers_backend.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_tts.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_utils.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_wake_word.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.95.6 → agent_cli-0.95.7}/uv.lock +0 -0
- {agent_cli-0.95.6 → 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>
|
{agent_cli-0.95.6 → 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
|
|
|
@@ -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
|
|
@@ -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
|
+
}
|
{agent_cli-0.95.6 → agent_cli-0.95.7}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift
RENAMED
|
@@ -156,7 +156,11 @@ private final class BootstrapRecorder {
|
|
|
156
156
|
lock.withLock { storedCalls }
|
|
157
157
|
}
|
|
158
158
|
|
|
159
|
-
func bootstrap(
|
|
159
|
+
func bootstrap(
|
|
160
|
+
requirement: AgentBootstrapRequirement,
|
|
161
|
+
force: Bool,
|
|
162
|
+
progress: AgentBootstrapProgress
|
|
163
|
+
) -> CommandResult {
|
|
160
164
|
lock.withLock {
|
|
161
165
|
storedCalls.append(.init(requirement: requirement, force: force))
|
|
162
166
|
}
|
|
@@ -50,6 +50,7 @@ def test_macos_app_package_files_exist() -> None:
|
|
|
50
50
|
"AgentCommandRunner.swift",
|
|
51
51
|
"AgentRuntime.swift",
|
|
52
52
|
"AppDelegate.swift",
|
|
53
|
+
"BootstrapState.swift",
|
|
53
54
|
"CommandResult.swift",
|
|
54
55
|
"ConfigurableHotkeyController.swift",
|
|
55
56
|
"FocusedTextTarget.swift",
|
|
@@ -211,6 +212,8 @@ def test_macos_app_menu_prioritizes_daily_voice_actions() -> None:
|
|
|
211
212
|
assert troubleshooting_menu_index < copy_output_index < troubleshooting_label_index
|
|
212
213
|
assert 'Menu("Setup")' not in source
|
|
213
214
|
assert 'Text("Voice: \\(runner.menuStatusMessage)")' in source
|
|
215
|
+
assert "var menuBarIconState: MenuBarIconState" in source
|
|
216
|
+
assert "AgentCLIMenuBarIcon(state: runner.menuBarIconState)" in source
|
|
214
217
|
assert "var menuStatusMessage: String" in source
|
|
215
218
|
assert "menuStatusMaxLength" in source
|
|
216
219
|
assert "Text(runner.statusMessage)" not in source
|
|
@@ -252,18 +255,18 @@ def test_macos_app_uses_avatar_svg_as_menu_bar_icon() -> None:
|
|
|
252
255
|
assert MENU_BAR_LOGO_SVG.is_file()
|
|
253
256
|
avatar_svg = MENU_BAR_LOGO_SVG.read_text()
|
|
254
257
|
|
|
255
|
-
assert "AgentCLIMenuBarIcon(
|
|
256
|
-
assert "Self.logoImage(
|
|
258
|
+
assert "AgentCLIMenuBarIcon(state: runner.menuBarIconState)" in source
|
|
259
|
+
assert "Self.logoImage(state: state)" in source
|
|
257
260
|
assert "Image(nsImage: image)" in source
|
|
258
|
-
assert ".id(
|
|
259
|
-
assert "private static func logoImage(
|
|
261
|
+
assert ".id(state)" in source
|
|
262
|
+
assert "private static func logoImage(state: MenuBarIconState) -> NSImage?" in source
|
|
260
263
|
assert "private static let idleLogoImage" in source
|
|
261
264
|
assert "private static let recordingLogoImage" in source
|
|
262
265
|
assert "makeRecordingLogoImage" in source
|
|
263
266
|
assert 'forResource: "logo-avatar", withExtension: "svg"' in source
|
|
264
267
|
assert "NSImage(contentsOf:" in source
|
|
265
268
|
assert "image.isTemplate = true" in source
|
|
266
|
-
assert "
|
|
269
|
+
assert "badgeColor: .systemRed" in source
|
|
267
270
|
assert 'MENU_BAR_LOGO_SVG="$ROOT_DIR/docs/logo-avatar.svg"' in build_script
|
|
268
271
|
assert "Contents/Resources/logo-avatar.svg" in build_script
|
|
269
272
|
assert 'test -f "$APP/Contents/Resources/logo-avatar.svg"' in e2e_script
|
|
@@ -485,8 +488,14 @@ def test_macos_app_uses_bootstrap_requirement_model() -> None:
|
|
|
485
488
|
assert "case transcription" in source
|
|
486
489
|
assert "case transcriptionModel" in source
|
|
487
490
|
assert "let bootstrapRequirement: AgentBootstrapRequirement" in source
|
|
488
|
-
assert
|
|
489
|
-
|
|
491
|
+
assert (
|
|
492
|
+
"AgentRuntime.shared.ensureReady(for: requirement, force: force, progress: progress)"
|
|
493
|
+
in source
|
|
494
|
+
)
|
|
495
|
+
assert (
|
|
496
|
+
"bootstrap(command.bootstrapRequirement, command.forceBootstrap, reportBootstrapPhase)"
|
|
497
|
+
in source
|
|
498
|
+
)
|
|
490
499
|
assert "requiresWhisperDaemon" not in source
|
|
491
500
|
|
|
492
501
|
|
|
@@ -496,18 +505,48 @@ def test_macos_app_warms_transcription_on_launch() -> None:
|
|
|
496
505
|
|
|
497
506
|
assert "AgentCommandRunner.shared.warmUpTranscription()" in source
|
|
498
507
|
assert "private var hasStartedTranscriptionWarmUp = false" in source
|
|
499
|
-
assert
|
|
500
|
-
assert "let result = bootstrap(.transcriptionModel, false)" in source
|
|
508
|
+
assert "@Published private(set) var bootstrapPhase: BootstrapPhase = .idle" in source
|
|
509
|
+
assert "let result = bootstrap(.transcriptionModel, false, reportBootstrapPhase)" in source
|
|
501
510
|
assert 'recordFailure(title: "Startup Voice Service Warm-Up", result: result)' in source
|
|
502
511
|
assert 'DispatchQueue(label: "lt.nijho.agent-cli.bootstrap")' in source
|
|
503
512
|
|
|
504
513
|
|
|
514
|
+
def test_macos_app_keeps_preparing_status_visible_during_command_bootstrap() -> None:
|
|
515
|
+
"""A command started during launch warm-up should not hide preparation progress."""
|
|
516
|
+
source = swift_source()
|
|
517
|
+
|
|
518
|
+
assert "enum BootstrapPhase: Equatable" in source
|
|
519
|
+
assert "var isPreparing: Bool" in source
|
|
520
|
+
assert "var statusMessage: String" in source
|
|
521
|
+
assert (
|
|
522
|
+
"if bootstrapPhase.isPreparing {\n return bootstrapPhase.statusMessage" in source
|
|
523
|
+
)
|
|
524
|
+
assert (
|
|
525
|
+
"if !self.bootstrapPhase.isPreparing {\n statusMessage = isStopRequest" in source
|
|
526
|
+
)
|
|
527
|
+
assert "self.reportBootstrapPhase(.idle)" in source
|
|
528
|
+
assert 'statusMessage == "Preparing voice service..."' not in source
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
def test_macos_app_shows_preparing_menu_bar_icon_state() -> None:
|
|
532
|
+
"""Initial setup should be visible in the menu bar without opening the menu."""
|
|
533
|
+
source = swift_source()
|
|
534
|
+
|
|
535
|
+
assert "enum MenuBarIconState: Equatable" in source
|
|
536
|
+
assert "case preparing" in source
|
|
537
|
+
assert "if bootstrapPhase.isPreparing {\n return .preparing" in source
|
|
538
|
+
assert "private static let preparingLogoImage" in source
|
|
539
|
+
assert "makePreparingLogoImage()" in source
|
|
540
|
+
assert "badgeColor: .controlAccentColor" in source
|
|
541
|
+
assert 'return Text("Agent CLI preparing")' in source
|
|
542
|
+
|
|
543
|
+
|
|
505
544
|
def test_macos_app_warms_whisper_model_on_launch() -> None:
|
|
506
545
|
"""Startup warm-up should force Whisper's lazily loaded model to initialize."""
|
|
507
546
|
source = swift_source()
|
|
508
547
|
|
|
509
548
|
assert "case transcriptionModel" in source
|
|
510
|
-
assert "let result = bootstrap(.transcriptionModel, false)" in source
|
|
549
|
+
assert "let result = bootstrap(.transcriptionModel, false, reportBootstrapPhase)" in source
|
|
511
550
|
assert "warmUpWhisperModel()" in source
|
|
512
551
|
assert "writeWhisperWarmUpAudio()" in source
|
|
513
552
|
assert 'appendingPathComponent("whisper-model-warmup.wav")' in source
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import AppKit
|
|
2
|
-
import Foundation
|
|
3
|
-
import SwiftUI
|
|
4
|
-
|
|
5
|
-
struct AgentCLIMenuBarIcon: View {
|
|
6
|
-
let isRecording: Bool
|
|
7
|
-
|
|
8
|
-
var body: some View {
|
|
9
|
-
if let image = Self.logoImage(isRecording: isRecording) {
|
|
10
|
-
Image(nsImage: image)
|
|
11
|
-
.resizable()
|
|
12
|
-
.aspectRatio(contentMode: .fit)
|
|
13
|
-
.frame(width: 22, height: 18)
|
|
14
|
-
.id(isRecording)
|
|
15
|
-
.accessibilityLabel(Text(isRecording ? "Agent CLI recording" : "Agent CLI"))
|
|
16
|
-
} else {
|
|
17
|
-
Image(systemName: isRecording ? "record.circle.fill" : "person.crop.circle")
|
|
18
|
-
.id(isRecording)
|
|
19
|
-
.accessibilityLabel(Text(isRecording ? "Agent CLI recording" : "Agent CLI"))
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
private static func logoImage(isRecording: Bool) -> NSImage? {
|
|
24
|
-
isRecording ? recordingLogoImage : idleLogoImage
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
private static let idleLogoImage: NSImage? = {
|
|
28
|
-
guard let url = Bundle.main.url(forResource: "logo-avatar", withExtension: "svg"),
|
|
29
|
-
let image = NSImage(contentsOf: url)
|
|
30
|
-
else {
|
|
31
|
-
return nil
|
|
32
|
-
}
|
|
33
|
-
image.isTemplate = true
|
|
34
|
-
image.size = NSSize(width: 18, height: 18)
|
|
35
|
-
return image
|
|
36
|
-
}()
|
|
37
|
-
|
|
38
|
-
private static let recordingLogoImage: NSImage? = makeRecordingLogoImage()
|
|
39
|
-
|
|
40
|
-
private static func makeRecordingLogoImage() -> NSImage? {
|
|
41
|
-
guard let url = Bundle.main.url(forResource: "logo-avatar", withExtension: "svg"),
|
|
42
|
-
let avatar = NSImage(contentsOf: url)
|
|
43
|
-
else {
|
|
44
|
-
return nil
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
avatar.size = NSSize(width: 18, height: 18)
|
|
48
|
-
|
|
49
|
-
let image = NSImage(size: NSSize(width: 22, height: 18))
|
|
50
|
-
image.lockFocus()
|
|
51
|
-
avatar.draw(
|
|
52
|
-
in: NSRect(x: 0, y: 0, width: 18, height: 18),
|
|
53
|
-
from: .zero,
|
|
54
|
-
operation: .sourceOver,
|
|
55
|
-
fraction: 1
|
|
56
|
-
)
|
|
57
|
-
|
|
58
|
-
NSColor.white.setFill()
|
|
59
|
-
NSBezierPath(ovalIn: NSRect(x: 12.5, y: 0.5, width: 10, height: 10)).fill()
|
|
60
|
-
NSColor.systemRed.setFill()
|
|
61
|
-
NSBezierPath(ovalIn: NSRect(x: 14, y: 2, width: 7, height: 7)).fill()
|
|
62
|
-
image.unlockFocus()
|
|
63
|
-
|
|
64
|
-
image.isTemplate = false
|
|
65
|
-
return image
|
|
66
|
-
}
|
|
67
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|