agent-cli 0.95.9__tar.gz → 0.95.11__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.9 → agent_cli-0.95.11}/.github/workflows/release.yml +52 -10
- {agent_cli-0.95.9 → agent_cli-0.95.11}/Casks/agent-cli.rb +2 -2
- {agent_cli-0.95.9 → agent_cli-0.95.11}/PKG-INFO +1 -1
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/daemon/cli.py +109 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/daemon.md +4 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Package.resolved +9 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Package.swift +2 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/README.md +12 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Resources/Info.plist +4 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +9 -2
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +2 -2
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +45 -21
- agent_cli-0.95.11/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +46 -0
- agent_cli-0.95.11/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +33 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +23 -0
- agent_cli-0.95.11/macos/AgentCLI/Sources/AgentCLI/VoiceStatusMenuItem.swift +60 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +102 -0
- agent_cli-0.95.11/macos/appcast.xml +26 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/build-macos-app.sh +41 -5
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_daemon.py +118 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_macos_app.py +76 -24
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.claude-plugin/README.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.cursorrules +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.dockerignore +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.env.example +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/logo.svg +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/release-drafter.yml +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/renovate.json +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/scripts/sync_extras.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/scripts/update_cask.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/workflows/docker.yml +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/workflows/docs.yml +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/workflows/markdown-code-runner.yml +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/workflows/pytest.yml +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/workflows/release-drafter.yml +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.gitignore +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.jscpd.json +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.pre-commit-config.yaml +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.prompts/docs-review.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/.prompts/pr-review.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/CLAUDE.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/LICENSE +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/LLAMA_SERVER_USAGE.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/README.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/__main__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_extras.json +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/diarization.txt +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/mlx-whisper.txt +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/vad.txt +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/vectordb.txt +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/whisper-transformers.txt +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_requirements/wyoming.txt +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/_tools.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/diarize_live_session.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/speakers.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/transcribe.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/transcribe_live.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/api.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/cli.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/config.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/constants.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/alignment.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/deps.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/diarization.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/process.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/speaker_identity.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/utils.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/vad.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/daemon/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/_branch_name.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/_config.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/_output.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/cleanup.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/cli.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/base.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/hooks.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/launch.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/project.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/skill/SKILL.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/registry.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/tmux.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/example-config.toml +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/install/common.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/install/extras.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/install/launchd.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/install/service_config.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/install/services.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/install/systemd.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/opts.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/py.typed +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/cli.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/common.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/proxy/api.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/tts/backends/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/tts/model_manager.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/tts/wyoming_handler.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/backends/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/backends/base.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/backends/mlx.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/backends/transformers.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/model_manager.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/services/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/services/asr.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docker/docker-compose.yml +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docker/memory-proxy.Dockerfile +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docker/rag-proxy.Dockerfile +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docker/transcribe-proxy.Dockerfile +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docker/tts.Dockerfile +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docker/whisper.Dockerfile +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/CNAME +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/architecture/index.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/architecture/memory.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/architecture/rag.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/assistant.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/chat.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/config.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/dev.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/diarize-live-session.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/index.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/install-extras.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/install-services.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/memory.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/server/index.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/server/transcribe-proxy.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/server/whisper.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/speak.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/speakers.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/start-services.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/transcribe-live.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/transcribe.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/configuration.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/getting-started.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/index.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/installation/docker.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/installation/index.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/installation/linux.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/installation/macos.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/installation/nixos.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/installation/windows.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/logo-avatar.svg +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/logo-clean.svg +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/docs/system-integration.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/justfile +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/macos/test-macos-app-e2e.sh +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/pyproject.toml +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/reddit.md +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/shell.nix +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_speak.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_speakers.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_transcribe.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_transcribe_agent.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_transcribe_live.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_transcribe_recovery.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_voice_edit.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/conftest.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/core/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/core/test_audio.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/core/test_sse.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/core/test_vad.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/core/test_watch.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_cleanup.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_cli.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_hooks.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_launch.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_project.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_terminals.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_verification.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/install/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/install/test_extras.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/install/test_launchd.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_client.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_files.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_git_integration.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_store.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/mocks/audio.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/mocks/llm.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/__init__.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_api.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_history.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_store.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_alignment.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_api.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_api_integration.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_asr.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_cli.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_config.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_diarization.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_diarize_live_session.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_env_vars.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_faster_whisper_backend.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_json_output.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_llm.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_mlx_backend.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_process_manager.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_requires_extras.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_server_tts.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_server_whisper.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_services.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_speaker_identity.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_tools.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_transformers_backend.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_tts.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_update_cask.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_utils.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_wake_word.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/uv.lock +0 -0
- {agent_cli-0.95.9 → agent_cli-0.95.11}/zensical.toml +0 -0
|
@@ -58,34 +58,76 @@ jobs:
|
|
|
58
58
|
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
|
59
59
|
APP_VERSION: ${{ github.event.release.tag_name }}
|
|
60
60
|
BUILD_VERSION: ${{ github.run_number }}
|
|
61
|
-
|
|
61
|
+
SPARKLE_PUBLIC_ED_KEY: ${{ vars.SPARKLE_PUBLIC_ED_KEY }}
|
|
62
|
+
run: |
|
|
63
|
+
if [[ -z "$SPARKLE_PUBLIC_ED_KEY" ]]; then
|
|
64
|
+
echo "SPARKLE_PUBLIC_ED_KEY repository variable is required to enable Sparkle updates." >&2
|
|
65
|
+
exit 1
|
|
66
|
+
fi
|
|
67
|
+
NOTARIZE=1 macos/build-macos-app.sh --dmg
|
|
68
|
+
ditto -c -k --keepParent dist/macos/AgentCLI.app dist/macos/AgentCLI.zip
|
|
62
69
|
- name: Upload macOS app to GitHub Release
|
|
63
70
|
env:
|
|
64
71
|
GH_TOKEN: ${{ github.token }}
|
|
65
72
|
TAG_NAME: ${{ github.event.release.tag_name }}
|
|
66
|
-
run: gh release upload "$TAG_NAME" dist/macos/AgentCLI.dmg --clobber
|
|
67
|
-
- name: Update
|
|
73
|
+
run: gh release upload "$TAG_NAME" dist/macos/AgentCLI.dmg dist/macos/AgentCLI.zip --clobber
|
|
74
|
+
- name: Update Sparkle appcast
|
|
75
|
+
env:
|
|
76
|
+
GH_TOKEN: ${{ github.token }}
|
|
77
|
+
TAG_NAME: ${{ github.event.release.tag_name }}
|
|
78
|
+
SPARKLE_PRIVATE_ED_KEY: ${{ secrets.SPARKLE_PRIVATE_ED_KEY }}
|
|
79
|
+
run: |
|
|
80
|
+
git fetch origin main
|
|
81
|
+
git switch --force-create release-metadata origin/main
|
|
82
|
+
|
|
83
|
+
if [[ -z "$SPARKLE_PRIVATE_ED_KEY" ]]; then
|
|
84
|
+
echo "SPARKLE_PRIVATE_ED_KEY is required to sign Sparkle updates." >&2
|
|
85
|
+
exit 1
|
|
86
|
+
fi
|
|
87
|
+
|
|
88
|
+
SPARKLE_GENERATE_APPCAST="macos/AgentCLI/.build/artifacts/sparkle/Sparkle/bin/generate_appcast"
|
|
89
|
+
if [[ ! -x "$SPARKLE_GENERATE_APPCAST" ]]; then
|
|
90
|
+
echo "Sparkle generate_appcast not found: $SPARKLE_GENERATE_APPCAST" >&2
|
|
91
|
+
exit 1
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
APPCAST_DIR="$RUNNER_TEMP/agentcli-appcast"
|
|
95
|
+
rm -rf "$APPCAST_DIR"
|
|
96
|
+
mkdir -p "$APPCAST_DIR"
|
|
97
|
+
cp dist/macos/AgentCLI.zip "$APPCAST_DIR/AgentCLI.zip"
|
|
98
|
+
cp macos/appcast.xml "$APPCAST_DIR/appcast.xml"
|
|
99
|
+
gh release view "$TAG_NAME" --json body --jq .body >"$APPCAST_DIR/AgentCLI.md"
|
|
100
|
+
|
|
101
|
+
printf '%s' "$SPARKLE_PRIVATE_ED_KEY" |
|
|
102
|
+
"$SPARKLE_GENERATE_APPCAST" \
|
|
103
|
+
--ed-key-file - \
|
|
104
|
+
--download-url-prefix "https://github.com/basnijholt/agent-cli/releases/download/${TAG_NAME}/" \
|
|
105
|
+
--link "https://github.com/basnijholt/agent-cli" \
|
|
106
|
+
--embed-release-notes \
|
|
107
|
+
--maximum-versions 10 \
|
|
108
|
+
-o "$APPCAST_DIR/appcast.xml" \
|
|
109
|
+
"$APPCAST_DIR"
|
|
110
|
+
|
|
111
|
+
cp "$APPCAST_DIR/appcast.xml" macos/appcast.xml
|
|
112
|
+
- name: Update Homebrew cask and Sparkle appcast
|
|
68
113
|
env:
|
|
69
114
|
TAG_NAME: ${{ github.event.release.tag_name }}
|
|
70
115
|
run: |
|
|
71
116
|
VERSION="${TAG_NAME#v}"
|
|
72
117
|
SHA256=$(shasum -a 256 dist/macos/AgentCLI.dmg | awk '{ print $1 }')
|
|
73
118
|
|
|
74
|
-
git fetch origin main
|
|
75
|
-
git switch --force-create cask-update origin/main
|
|
76
|
-
|
|
77
119
|
python3 .github/scripts/update_cask.py \
|
|
78
120
|
--version "$VERSION" \
|
|
79
121
|
--sha256 "$SHA256"
|
|
80
122
|
|
|
81
|
-
if git diff --quiet -- Casks/agent-cli.rb; then
|
|
82
|
-
echo "Casks/agent-cli.rb
|
|
123
|
+
if git diff --quiet -- Casks/agent-cli.rb macos/appcast.xml; then
|
|
124
|
+
echo "Casks/agent-cli.rb and macos/appcast.xml are already up to date."
|
|
83
125
|
exit 0
|
|
84
126
|
fi
|
|
85
127
|
|
|
86
128
|
git config user.name "github-actions[bot]"
|
|
87
129
|
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
88
|
-
git add Casks/agent-cli.rb
|
|
89
|
-
git commit -m "Update AgentCLI
|
|
130
|
+
git add Casks/agent-cli.rb macos/appcast.xml
|
|
131
|
+
git commit -m "Update AgentCLI release metadata to ${TAG_NAME}"
|
|
90
132
|
git pull --rebase origin main
|
|
91
133
|
git push origin HEAD:main
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
cask "agent-cli" do
|
|
2
|
-
version "0.95.
|
|
3
|
-
sha256 "
|
|
2
|
+
version "0.95.10"
|
|
3
|
+
sha256 "ac6924d40452ded9757ed30c4fb6a066dbb2969a99998f4b3e63ceb301173e1e"
|
|
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.95.
|
|
3
|
+
Version: 0.95.11
|
|
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>
|
|
@@ -7,6 +7,7 @@ Manage agent-cli servers as background daemons:
|
|
|
7
7
|
|
|
8
8
|
from __future__ import annotations
|
|
9
9
|
|
|
10
|
+
import json
|
|
10
11
|
import platform
|
|
11
12
|
from typing import Annotated
|
|
12
13
|
|
|
@@ -17,6 +18,7 @@ from agent_cli.cli import app as main_app
|
|
|
17
18
|
from agent_cli.core.utils import console, err_console
|
|
18
19
|
from agent_cli.install.service_config import (
|
|
19
20
|
SERVICES,
|
|
21
|
+
ServiceStatus,
|
|
20
22
|
get_default_services,
|
|
21
23
|
get_service_manager,
|
|
22
24
|
)
|
|
@@ -42,6 +44,9 @@ Install, uninstall, and monitor agent-cli servers running as system daemons
|
|
|
42
44
|
**Examples:**
|
|
43
45
|
|
|
44
46
|
```bash
|
|
47
|
+
# Ensure whisper is installed and running
|
|
48
|
+
agent-cli daemon ensure whisper
|
|
49
|
+
|
|
45
50
|
# Install whisper as a background daemon
|
|
46
51
|
agent-cli daemon install whisper
|
|
47
52
|
|
|
@@ -196,6 +201,110 @@ def _ensure_uv_installed(no_confirm: bool) -> None:
|
|
|
196
201
|
raise typer.Exit(1)
|
|
197
202
|
|
|
198
203
|
|
|
204
|
+
def _service_status_payload(
|
|
205
|
+
*,
|
|
206
|
+
service: str,
|
|
207
|
+
action: str,
|
|
208
|
+
status: ServiceStatus,
|
|
209
|
+
message: str,
|
|
210
|
+
) -> dict[str, object]:
|
|
211
|
+
installed = bool(status.installed)
|
|
212
|
+
running = bool(status.running)
|
|
213
|
+
return {
|
|
214
|
+
"service": service,
|
|
215
|
+
"action": action,
|
|
216
|
+
"installed": installed,
|
|
217
|
+
"running": running,
|
|
218
|
+
"pid": getattr(status, "pid", None) if running else None,
|
|
219
|
+
"message": message,
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
@app.command("ensure")
|
|
224
|
+
def ensure_cmd(
|
|
225
|
+
service: Annotated[
|
|
226
|
+
str,
|
|
227
|
+
typer.Argument(help="Service to ensure is installed and running"),
|
|
228
|
+
],
|
|
229
|
+
json_output: Annotated[
|
|
230
|
+
bool,
|
|
231
|
+
typer.Option("--json", help="Output machine-readable status as JSON"),
|
|
232
|
+
] = False,
|
|
233
|
+
quiet: Annotated[
|
|
234
|
+
bool,
|
|
235
|
+
typer.Option("--quiet", "-q", help="Suppress normal success output"),
|
|
236
|
+
] = False,
|
|
237
|
+
) -> None:
|
|
238
|
+
"""Ensure one daemon is installed and running.
|
|
239
|
+
|
|
240
|
+
This is intended for app integrations that need a single repair command
|
|
241
|
+
instead of parsing human-oriented `daemon status` output.
|
|
242
|
+
"""
|
|
243
|
+
if service not in SERVICES:
|
|
244
|
+
err_console.print(
|
|
245
|
+
f"[bold red]Error:[/bold red] Unknown service '{service}'. "
|
|
246
|
+
f"Available: {', '.join(SERVICES.keys())}",
|
|
247
|
+
)
|
|
248
|
+
raise typer.Exit(1)
|
|
249
|
+
|
|
250
|
+
try:
|
|
251
|
+
manager = get_service_manager()
|
|
252
|
+
except RuntimeError as e:
|
|
253
|
+
err_console.print(f"[bold red]Error:[/bold red] {e}")
|
|
254
|
+
raise typer.Exit(1) from None
|
|
255
|
+
|
|
256
|
+
status = manager.get_service_status(service)
|
|
257
|
+
if status.installed and status.running:
|
|
258
|
+
payload = _service_status_payload(
|
|
259
|
+
service=service,
|
|
260
|
+
action="already_running",
|
|
261
|
+
status=status,
|
|
262
|
+
message="Already running",
|
|
263
|
+
)
|
|
264
|
+
else:
|
|
265
|
+
action = "installed" if not status.installed else "restarted"
|
|
266
|
+
result = manager.install_service(service)
|
|
267
|
+
if not result.success:
|
|
268
|
+
payload = _service_status_payload(
|
|
269
|
+
service=service,
|
|
270
|
+
action="failed",
|
|
271
|
+
status=status,
|
|
272
|
+
message=result.message,
|
|
273
|
+
)
|
|
274
|
+
if json_output:
|
|
275
|
+
console.print(json.dumps(payload))
|
|
276
|
+
else:
|
|
277
|
+
err_console.print(f"[bold red]Error:[/bold red] {service}: {result.message}")
|
|
278
|
+
raise typer.Exit(1)
|
|
279
|
+
|
|
280
|
+
status = manager.get_service_status(service)
|
|
281
|
+
if not status.installed or not status.running:
|
|
282
|
+
message = f"{result.message}, but service is not running"
|
|
283
|
+
payload = _service_status_payload(
|
|
284
|
+
service=service,
|
|
285
|
+
action="failed",
|
|
286
|
+
status=status,
|
|
287
|
+
message=message,
|
|
288
|
+
)
|
|
289
|
+
if json_output:
|
|
290
|
+
console.print(json.dumps(payload))
|
|
291
|
+
else:
|
|
292
|
+
err_console.print(f"[bold red]Error:[/bold red] {service}: {message}")
|
|
293
|
+
raise typer.Exit(1)
|
|
294
|
+
|
|
295
|
+
payload = _service_status_payload(
|
|
296
|
+
service=service,
|
|
297
|
+
action=action,
|
|
298
|
+
status=status,
|
|
299
|
+
message=result.message,
|
|
300
|
+
)
|
|
301
|
+
|
|
302
|
+
if json_output:
|
|
303
|
+
console.print(json.dumps(payload))
|
|
304
|
+
elif not quiet:
|
|
305
|
+
console.print(f"{service}: {payload['message']}")
|
|
306
|
+
|
|
307
|
+
|
|
199
308
|
@app.command("install")
|
|
200
309
|
def install_cmd( # noqa: PLR0912, PLR0915
|
|
201
310
|
services: Annotated[
|
|
@@ -147,6 +147,9 @@ agent-cli daemon uninstall whisper
|
|
|
147
147
|
Examples:
|
|
148
148
|
|
|
149
149
|
|
|
150
|
+
# Ensure whisper is installed and running
|
|
151
|
+
agent-cli daemon ensure whisper
|
|
152
|
+
|
|
150
153
|
# Install whisper as a background daemon
|
|
151
154
|
agent-cli daemon install whisper
|
|
152
155
|
|
|
@@ -167,6 +170,7 @@ agent-cli daemon uninstall whisper
|
|
|
167
170
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
|
168
171
|
╭─ Commands ─────────────────────────────────────────────────────────────────────────────╮
|
|
169
172
|
│ status Check status of installed daemons. │
|
|
173
|
+
│ ensure Ensure one daemon is installed and running. │
|
|
170
174
|
│ install Install server daemons as background processes. │
|
|
171
175
|
│ uninstall Uninstall server daemons. │
|
|
172
176
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
|
@@ -8,6 +8,15 @@
|
|
|
8
8
|
"revision" : "70caa8dea43e2d273cd5ab78885d7eff01df550c",
|
|
9
9
|
"version" : "1.10.0"
|
|
10
10
|
}
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"identity" : "sparkle",
|
|
14
|
+
"kind" : "remoteSourceControl",
|
|
15
|
+
"location" : "https://github.com/sparkle-project/Sparkle",
|
|
16
|
+
"state" : {
|
|
17
|
+
"revision" : "6276ba2b404829d139c45ff98427cf90e2efc59b",
|
|
18
|
+
"version" : "2.9.2"
|
|
19
|
+
}
|
|
11
20
|
}
|
|
12
21
|
],
|
|
13
22
|
"version" : 2
|
|
@@ -12,12 +12,14 @@ let package = Package(
|
|
|
12
12
|
],
|
|
13
13
|
dependencies: [
|
|
14
14
|
.package(url: "https://github.com/sindresorhus/KeyboardShortcuts", exact: "1.10.0"),
|
|
15
|
+
.package(url: "https://github.com/sparkle-project/Sparkle", exact: "2.9.2"),
|
|
15
16
|
],
|
|
16
17
|
targets: [
|
|
17
18
|
.executableTarget(
|
|
18
19
|
name: "AgentCLI",
|
|
19
20
|
dependencies: [
|
|
20
21
|
.product(name: "KeyboardShortcuts", package: "KeyboardShortcuts"),
|
|
22
|
+
.product(name: "Sparkle", package: "Sparkle"),
|
|
21
23
|
],
|
|
22
24
|
path: "Sources/AgentCLI"
|
|
23
25
|
),
|
|
@@ -30,6 +30,12 @@ clipboard utility shortcuts still use `KeyboardShortcuts` global handlers. The
|
|
|
30
30
|
login option uses Apple's login item API for the main app bundle, so macOS may
|
|
31
31
|
require approval in System Settings → General → Login Items.
|
|
32
32
|
|
|
33
|
+
The app uses Sparkle for direct app updates. Release builds stamp
|
|
34
|
+
`SUPublicEDKey` into `Info.plist`, publish signed updates in `macos/appcast.xml`,
|
|
35
|
+
upload `AgentCLI.zip` for Sparkle, and expose **Check for Updates...** from the
|
|
36
|
+
menu bar and Settings. Local builds without a Sparkle public key still run, but
|
|
37
|
+
update checks are disabled.
|
|
38
|
+
|
|
33
39
|
## Build
|
|
34
40
|
|
|
35
41
|
From the repository root:
|
|
@@ -86,6 +92,7 @@ NOTARIZE=1 \
|
|
|
86
92
|
APPLE_ID="you@example.com" \
|
|
87
93
|
APPLE_APP_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx" \
|
|
88
94
|
APPLE_TEAM_ID="TEAMID" \
|
|
95
|
+
SPARKLE_PUBLIC_ED_KEY="public-ed25519-key" \
|
|
89
96
|
./macos/build-macos-app.sh --dmg
|
|
90
97
|
```
|
|
91
98
|
|
|
@@ -103,3 +110,8 @@ workflow expects these repository secrets:
|
|
|
103
110
|
- `APPLE_ID`: Apple ID email for notarization
|
|
104
111
|
- `APPLE_APP_SPECIFIC_PASSWORD`: app-specific password for `notarytool`
|
|
105
112
|
- `APPLE_TEAM_ID`: Apple Developer Team ID
|
|
113
|
+
- `SPARKLE_PRIVATE_ED_KEY`: private Sparkle EdDSA key for signing updates
|
|
114
|
+
|
|
115
|
+
The workflow also expects the repository variable `SPARKLE_PUBLIC_ED_KEY`.
|
|
116
|
+
Generate the key pair with Sparkle's `generate_keys` tool and store only the
|
|
117
|
+
private key as a GitHub secret.
|
|
@@ -28,5 +28,9 @@
|
|
|
28
28
|
<true/>
|
|
29
29
|
<key>NSMicrophoneUsageDescription</key>
|
|
30
30
|
<string>Agent CLI uses microphone access when you start transcription or voice editing from the menu bar.</string>
|
|
31
|
+
<key>SUEnableInstallerLauncherService</key>
|
|
32
|
+
<true/>
|
|
33
|
+
<key>SUFeedURL</key>
|
|
34
|
+
<string>https://raw.githubusercontent.com/basnijholt/agent-cli/main/macos/appcast.xml</string>
|
|
31
35
|
</dict>
|
|
32
36
|
</plist>
|
|
@@ -6,6 +6,7 @@ struct AgentCLIApp: App {
|
|
|
6
6
|
@NSApplicationDelegateAdaptor(AppDelegate.self) private var appDelegate
|
|
7
7
|
@Environment(\.openWindow) private var openWindow
|
|
8
8
|
@StateObject private var runner = AgentCommandRunner.shared
|
|
9
|
+
@StateObject private var appUpdater = AppUpdater.shared
|
|
9
10
|
@StateObject private var loginItemController = LoginItemController.shared
|
|
10
11
|
@StateObject private var shortcutSummary = ShortcutSummaryState.shared
|
|
11
12
|
@AppStorage(RuntimeSettings.useUserInstalledAgentCLIKey)
|
|
@@ -33,8 +34,7 @@ struct AgentCLIApp: App {
|
|
|
33
34
|
|
|
34
35
|
Divider()
|
|
35
36
|
|
|
36
|
-
|
|
37
|
-
.lineLimit(1)
|
|
37
|
+
VoiceStatusMenuItem(runner: runner)
|
|
38
38
|
|
|
39
39
|
Text(shortcutSummary.summary)
|
|
40
40
|
.lineLimit(1)
|
|
@@ -77,6 +77,13 @@ struct AgentCLIApp: App {
|
|
|
77
77
|
Label("Settings...", systemImage: "gearshape")
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
+
Button {
|
|
81
|
+
appUpdater.checkForUpdates()
|
|
82
|
+
} label: {
|
|
83
|
+
Label("Check for Updates...", systemImage: "arrow.down.circle")
|
|
84
|
+
}
|
|
85
|
+
.disabled(!appUpdater.canCheckForUpdates)
|
|
86
|
+
|
|
80
87
|
Menu {
|
|
81
88
|
Button {
|
|
82
89
|
runner.run(.voiceServiceStatus)
|
{agent_cli-0.95.9 → agent_cli-0.95.11}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift
RENAMED
|
@@ -29,8 +29,8 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
29
29
|
@Published private(set) var isRecording = false
|
|
30
30
|
@Published private(set) var bootstrapPhase: BootstrapPhase = .idle
|
|
31
31
|
@Published private var activeCommandCount = 0
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
private var bootstrapAnimationTick = 0
|
|
33
|
+
private var bootstrapElapsedSeconds = 0
|
|
34
34
|
private var recordingIndicator = RecordingIndicatorController()
|
|
35
35
|
private let pasteController: TranscriptPasteController
|
|
36
36
|
private let bootstrap: AgentBootstrap
|
|
@@ -12,6 +12,9 @@ private enum AgentCLIRuntimeMode: Equatable {
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
typealias AgentProcessRunner = (URL, [String], [String: String]) -> CommandResult
|
|
16
|
+
typealias LocalhostConnector = (UInt16) -> Bool
|
|
17
|
+
|
|
15
18
|
struct AgentRuntime {
|
|
16
19
|
static let shared = AgentRuntime()
|
|
17
20
|
|
|
@@ -37,6 +40,9 @@ struct AgentRuntime {
|
|
|
37
40
|
private let fileManager = FileManager.default
|
|
38
41
|
private let baseEnvironment: [String: String]
|
|
39
42
|
private let userDefaults: UserDefaults
|
|
43
|
+
private let processRunner: AgentProcessRunner
|
|
44
|
+
private let localhostConnector: LocalhostConnector
|
|
45
|
+
private let whisperReadyTimeout: TimeInterval
|
|
40
46
|
let appSupportURL: URL
|
|
41
47
|
let bundledUVURL: URL
|
|
42
48
|
let bundledWheelsURL: URL
|
|
@@ -56,10 +62,18 @@ struct AgentRuntime {
|
|
|
56
62
|
init(
|
|
57
63
|
environment: [String: String] = ProcessInfo.processInfo.environment,
|
|
58
64
|
bundle: Bundle = .main,
|
|
59
|
-
userDefaults: UserDefaults = .standard
|
|
65
|
+
userDefaults: UserDefaults = .standard,
|
|
66
|
+
processRunner: @escaping AgentProcessRunner = {
|
|
67
|
+
AgentRuntime.runProcess(executableURL: $0, arguments: $1, environment: $2)
|
|
68
|
+
},
|
|
69
|
+
localhostConnector: @escaping LocalhostConnector = AgentRuntime.canConnectToLocalhost,
|
|
70
|
+
whisperReadyTimeout: TimeInterval = 180
|
|
60
71
|
) {
|
|
61
72
|
self.baseEnvironment = environment
|
|
62
73
|
self.userDefaults = userDefaults
|
|
74
|
+
self.processRunner = processRunner
|
|
75
|
+
self.localhostConnector = localhostConnector
|
|
76
|
+
self.whisperReadyTimeout = whisperReadyTimeout
|
|
63
77
|
|
|
64
78
|
if let override = environment["AGENTCLI_APP_SUPPORT_DIR"], !override.isEmpty {
|
|
65
79
|
appSupportURL = URL(fileURLWithPath: override, isDirectory: true)
|
|
@@ -201,9 +215,9 @@ struct AgentRuntime {
|
|
|
201
215
|
}
|
|
202
216
|
|
|
203
217
|
let installDescription = "uv tool install agent-cli[audio,llm]"
|
|
204
|
-
let result =
|
|
205
|
-
|
|
206
|
-
|
|
218
|
+
let result = processRunner(
|
|
219
|
+
bundledUVURL,
|
|
220
|
+
[
|
|
207
221
|
"tool",
|
|
208
222
|
"install",
|
|
209
223
|
"--managed-python",
|
|
@@ -212,7 +226,7 @@ struct AgentRuntime {
|
|
|
212
226
|
"--force",
|
|
213
227
|
agentCLIInstallRequirement
|
|
214
228
|
],
|
|
215
|
-
|
|
229
|
+
commandEnvironment()
|
|
216
230
|
)
|
|
217
231
|
if result.exitCode != 0, result.output.isEmpty {
|
|
218
232
|
return CommandResult(exitCode: result.exitCode, output: "\(installDescription) failed")
|
|
@@ -228,10 +242,10 @@ struct AgentRuntime {
|
|
|
228
242
|
}
|
|
229
243
|
|
|
230
244
|
private func ensureUserInstalledCLIAvailable() -> CommandResult {
|
|
231
|
-
let result =
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
245
|
+
let result = processRunner(
|
|
246
|
+
agentCLIExecutableURL,
|
|
247
|
+
agentCLIProcessArguments(["--version"]),
|
|
248
|
+
commandEnvironment()
|
|
235
249
|
)
|
|
236
250
|
guard result.exitCode != 127 else {
|
|
237
251
|
return CommandResult(
|
|
@@ -292,11 +306,17 @@ struct AgentRuntime {
|
|
|
292
306
|
) -> CommandResult {
|
|
293
307
|
if !force, (try? String(contentsOf: whisperDaemonMarkerURL)) == whisperDaemonMarkerContents {
|
|
294
308
|
progress(.waitingForVoiceService)
|
|
295
|
-
|
|
309
|
+
if localhostConnector(10300) {
|
|
310
|
+
return CommandResult(exitCode: 0, output: "")
|
|
311
|
+
}
|
|
296
312
|
}
|
|
297
313
|
|
|
314
|
+
return installWhisperDaemon(progress: progress)
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
private func installWhisperDaemon(progress: AgentBootstrapProgress) -> CommandResult {
|
|
298
318
|
progress(.installingVoiceService)
|
|
299
|
-
let result = runAgentCLI(arguments: ["daemon", "
|
|
319
|
+
let result = runAgentCLI(arguments: ["daemon", "ensure", "whisper", "--quiet"])
|
|
300
320
|
guard result.exitCode == 0 else {
|
|
301
321
|
return result
|
|
302
322
|
}
|
|
@@ -395,10 +415,14 @@ struct AgentRuntime {
|
|
|
395
415
|
}
|
|
396
416
|
}
|
|
397
417
|
|
|
398
|
-
private func waitForWhisperDaemonReady(
|
|
418
|
+
private func waitForWhisperDaemonReady() -> CommandResult {
|
|
419
|
+
waitForWhisperDaemonReady(timeout: whisperReadyTimeout)
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
private func waitForWhisperDaemonReady(timeout: TimeInterval) -> CommandResult {
|
|
399
423
|
let deadline = Date().addingTimeInterval(timeout)
|
|
400
424
|
while Date() < deadline {
|
|
401
|
-
if
|
|
425
|
+
if localhostConnector(10300) {
|
|
402
426
|
return CommandResult(exitCode: 0, output: "")
|
|
403
427
|
}
|
|
404
428
|
Thread.sleep(forTimeInterval: 0.5)
|
|
@@ -555,18 +579,18 @@ struct AgentRuntime {
|
|
|
555
579
|
}
|
|
556
580
|
|
|
557
581
|
func runShell(_ shell: String) -> CommandResult {
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
582
|
+
processRunner(
|
|
583
|
+
URL(fileURLWithPath: "/bin/zsh"),
|
|
584
|
+
["-lc", shell],
|
|
585
|
+
commandEnvironment()
|
|
562
586
|
)
|
|
563
587
|
}
|
|
564
588
|
|
|
565
589
|
func runAgentCLI(arguments: [String]) -> CommandResult {
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
590
|
+
processRunner(
|
|
591
|
+
agentCLIExecutableURL,
|
|
592
|
+
agentCLIProcessArguments(arguments),
|
|
593
|
+
commandEnvironment()
|
|
570
594
|
)
|
|
571
595
|
}
|
|
572
596
|
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
|
|
3
|
+
struct SparkleConfiguration: Equatable {
|
|
4
|
+
let feedURL: String
|
|
5
|
+
let publicEDKey: String
|
|
6
|
+
|
|
7
|
+
var isConfigured: Bool {
|
|
8
|
+
!feedURL.isEmpty && !publicEDKey.isEmpty
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
enum AppMetadata {
|
|
13
|
+
static var versionDisplayString: String {
|
|
14
|
+
versionDisplayString(infoDictionary: Bundle.main.infoDictionary ?? [:])
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
static var sparkleConfiguration: SparkleConfiguration {
|
|
18
|
+
sparkleConfiguration(infoDictionary: Bundle.main.infoDictionary ?? [:])
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
static func versionDisplayString(infoDictionary: [String: Any]) -> String {
|
|
22
|
+
let shortVersion = stringValue(
|
|
23
|
+
infoDictionary["CFBundleShortVersionString"],
|
|
24
|
+
fallback: "Unknown"
|
|
25
|
+
)
|
|
26
|
+
let buildVersion = stringValue(infoDictionary["CFBundleVersion"])
|
|
27
|
+
|
|
28
|
+
guard !buildVersion.isEmpty, buildVersion != shortVersion else {
|
|
29
|
+
return shortVersion
|
|
30
|
+
}
|
|
31
|
+
return "\(shortVersion) (\(buildVersion))"
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
static func sparkleConfiguration(infoDictionary: [String: Any]) -> SparkleConfiguration {
|
|
35
|
+
SparkleConfiguration(
|
|
36
|
+
feedURL: stringValue(infoDictionary["SUFeedURL"]),
|
|
37
|
+
publicEDKey: stringValue(infoDictionary["SUPublicEDKey"])
|
|
38
|
+
)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
private static func stringValue(_ value: Any?, fallback: String = "") -> String {
|
|
42
|
+
guard let string = value as? String else { return fallback }
|
|
43
|
+
let trimmed = string.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
44
|
+
return trimmed.isEmpty ? fallback : trimmed
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import Sparkle
|
|
3
|
+
|
|
4
|
+
@MainActor
|
|
5
|
+
final class AppUpdater: ObservableObject {
|
|
6
|
+
static let shared = AppUpdater()
|
|
7
|
+
|
|
8
|
+
private let updaterController: SPUStandardUpdaterController?
|
|
9
|
+
|
|
10
|
+
var canCheckForUpdates: Bool {
|
|
11
|
+
updaterController != nil
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
private init(configuration: SparkleConfiguration = AppMetadata.sparkleConfiguration) {
|
|
15
|
+
guard configuration.isConfigured else {
|
|
16
|
+
updaterController = nil
|
|
17
|
+
return
|
|
18
|
+
}
|
|
19
|
+
updaterController = SPUStandardUpdaterController(
|
|
20
|
+
startingUpdater: true,
|
|
21
|
+
updaterDelegate: nil,
|
|
22
|
+
userDriverDelegate: nil
|
|
23
|
+
)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
func checkForUpdates() {
|
|
27
|
+
guard let updaterController else {
|
|
28
|
+
AgentCommandRunner.shared.statusMessage = "App updates are not configured for this build"
|
|
29
|
+
return
|
|
30
|
+
}
|
|
31
|
+
updaterController.checkForUpdates(nil)
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -276,6 +276,7 @@ enum ShortcutDefaultsMigrator {
|
|
|
276
276
|
|
|
277
277
|
struct SettingsView: View {
|
|
278
278
|
@ObservedObject private var loginItemController = LoginItemController.shared
|
|
279
|
+
@ObservedObject private var appUpdater = AppUpdater.shared
|
|
279
280
|
@AppStorage(RuntimeSettings.useUserInstalledAgentCLIKey)
|
|
280
281
|
private var useUserInstalledAgentCLI = false
|
|
281
282
|
@AppStorage(RecordingSoundSettings.enabledKey)
|
|
@@ -321,6 +322,28 @@ struct SettingsView: View {
|
|
|
321
322
|
Text("Names, vocabulary, and guidance to pass as initial transcription context.")
|
|
322
323
|
}
|
|
323
324
|
|
|
325
|
+
Section {
|
|
326
|
+
HStack {
|
|
327
|
+
Text("Version")
|
|
328
|
+
Spacer()
|
|
329
|
+
Text(AppMetadata.versionDisplayString)
|
|
330
|
+
.foregroundStyle(.secondary)
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
Button("Check for Updates...") {
|
|
334
|
+
appUpdater.checkForUpdates()
|
|
335
|
+
}
|
|
336
|
+
.disabled(!appUpdater.canCheckForUpdates)
|
|
337
|
+
} header: {
|
|
338
|
+
Text("Updates")
|
|
339
|
+
} footer: {
|
|
340
|
+
Text(
|
|
341
|
+
appUpdater.canCheckForUpdates
|
|
342
|
+
? "Uses Sparkle to install signed Agent CLI app updates."
|
|
343
|
+
: "App updates are not configured for this build."
|
|
344
|
+
)
|
|
345
|
+
}
|
|
346
|
+
|
|
324
347
|
Section {
|
|
325
348
|
ShortcutRecorderRow(
|
|
326
349
|
title: "Toggle Transcription",
|