agent-cli 0.95.8__tar.gz → 0.95.10__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.10/.github/scripts/update_cask.py +87 -0
- agent_cli-0.95.10/.github/workflows/release.yml +133 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/Casks/agent-cli.rb +2 -2
- {agent_cli-0.95.8 → agent_cli-0.95.10}/PKG-INFO +1 -1
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/daemon/cli.py +109 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/daemon.md +4 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Package.resolved +9 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Package.swift +2 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/README.md +12 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Resources/Info.plist +4 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +9 -2
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +3 -3
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +45 -21
- agent_cli-0.95.10/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +46 -0
- agent_cli-0.95.10/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +33 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +24 -3
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +102 -43
- agent_cli-0.95.10/macos/AgentCLI/Sources/AgentCLI/VoiceStatusMenuItem.swift +27 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +120 -6
- agent_cli-0.95.10/macos/appcast.xml +8 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/build-macos-app.sh +41 -5
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_daemon.py +118 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_macos_app.py +93 -40
- agent_cli-0.95.10/tests/test_update_cask.py +51 -0
- agent_cli-0.95.8/.github/workflows/release.yml +0 -66
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.claude-plugin/README.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.cursorrules +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.dockerignore +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.env.example +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/logo.svg +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/release-drafter.yml +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/renovate.json +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/scripts/sync_extras.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/workflows/docker.yml +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/workflows/docs.yml +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/workflows/markdown-code-runner.yml +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/workflows/pytest.yml +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/workflows/release-drafter.yml +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.gitignore +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.jscpd.json +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.pre-commit-config.yaml +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.prompts/docs-review.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/.prompts/pr-review.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/CLAUDE.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/LICENSE +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/LLAMA_SERVER_USAGE.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/README.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/__main__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_extras.json +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/diarization.txt +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/mlx-whisper.txt +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/vad.txt +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/vectordb.txt +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/whisper-transformers.txt +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_requirements/wyoming.txt +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/_tools.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/diarize_live_session.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/speakers.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/transcribe.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/transcribe_live.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/api.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/cli.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/config.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/constants.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/alignment.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/deps.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/diarization.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/process.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/speaker_identity.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/utils.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/vad.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/daemon/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/_branch_name.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/_config.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/_output.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/cleanup.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/cli.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/base.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/hooks.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/launch.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/project.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/skill/SKILL.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/registry.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/tmux.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/example-config.toml +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/install/common.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/install/extras.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/install/launchd.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/install/service_config.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/install/services.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/install/systemd.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/opts.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/py.typed +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/cli.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/common.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/proxy/api.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/tts/backends/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/tts/model_manager.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/tts/wyoming_handler.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/backends/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/backends/base.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/backends/mlx.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/backends/transformers.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/model_manager.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/services/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/services/asr.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docker/docker-compose.yml +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docker/memory-proxy.Dockerfile +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docker/rag-proxy.Dockerfile +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docker/transcribe-proxy.Dockerfile +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docker/tts.Dockerfile +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docker/whisper.Dockerfile +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/CNAME +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/architecture/index.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/architecture/memory.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/architecture/rag.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/assistant.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/chat.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/config.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/dev.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/diarize-live-session.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/index.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/install-extras.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/install-services.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/memory.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/server/index.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/server/transcribe-proxy.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/server/whisper.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/speak.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/speakers.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/start-services.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/transcribe-live.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/transcribe.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/configuration.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/getting-started.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/index.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/installation/docker.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/installation/index.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/installation/linux.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/installation/macos.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/installation/nixos.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/installation/windows.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/logo-avatar.svg +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/logo-clean.svg +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/docs/system-integration.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/justfile +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/macos/test-macos-app-e2e.sh +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/pyproject.toml +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/reddit.md +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/shell.nix +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_speak.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_speakers.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_transcribe.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_transcribe_agent.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_transcribe_live.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_transcribe_recovery.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_voice_edit.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/conftest.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/core/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/core/test_audio.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/core/test_sse.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/core/test_vad.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/core/test_watch.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_cleanup.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_cli.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_hooks.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_launch.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_project.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_terminals.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_verification.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/install/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/install/test_extras.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/install/test_launchd.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_client.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_files.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_git_integration.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_store.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/mocks/audio.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/mocks/llm.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/__init__.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_api.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_history.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_store.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_alignment.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_api.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_api_integration.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_asr.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_cli.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_config.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_diarization.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_diarize_live_session.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_env_vars.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_faster_whisper_backend.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_json_output.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_llm.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_mlx_backend.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_process_manager.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_requires_extras.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_server_tts.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_server_whisper.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_services.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_speaker_identity.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_tools.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_transformers_backend.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_tts.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_utils.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_wake_word.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/uv.lock +0 -0
- {agent_cli-0.95.8 → agent_cli-0.95.10}/zensical.toml +0 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"""Update the Agent CLI Homebrew cask version and checksum."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import argparse
|
|
6
|
+
import re
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
VERSION_RE = re.compile(r'^(?P<indent>\s*)version "[^"]+"$')
|
|
10
|
+
SHA256_RE = re.compile(r'^(?P<indent>\s*)sha256 "[0-9a-f]{64}"$')
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _validate_sha256(value: str) -> str:
|
|
14
|
+
if not re.fullmatch(r"[0-9a-f]{64}", value):
|
|
15
|
+
msg = "sha256 must be 64 lowercase hexadecimal characters"
|
|
16
|
+
raise ValueError(msg)
|
|
17
|
+
return value
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _validate_version(value: str) -> str:
|
|
21
|
+
value = value.removeprefix("v")
|
|
22
|
+
if not re.fullmatch(r"\d+(?:\.\d+)*(?:[-,._A-Za-z0-9]+)?", value):
|
|
23
|
+
msg = f"unsupported cask version: {value}"
|
|
24
|
+
raise ValueError(msg)
|
|
25
|
+
return value
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def update_cask_text(text: str, *, version: str, sha256: str) -> str:
|
|
29
|
+
"""Replace the single version and sha256 stanzas in a cask."""
|
|
30
|
+
version = _validate_version(version)
|
|
31
|
+
sha256 = _validate_sha256(sha256)
|
|
32
|
+
|
|
33
|
+
version_count = 0
|
|
34
|
+
sha256_count = 0
|
|
35
|
+
lines: list[str] = []
|
|
36
|
+
for source_line in text.splitlines(keepends=True):
|
|
37
|
+
newline = "\n" if source_line.endswith("\n") else ""
|
|
38
|
+
content = source_line.removesuffix("\n")
|
|
39
|
+
|
|
40
|
+
if match := VERSION_RE.match(content):
|
|
41
|
+
output_line = f'{match.group("indent")}version "{version}"{newline}'
|
|
42
|
+
version_count += 1
|
|
43
|
+
elif match := SHA256_RE.match(content):
|
|
44
|
+
output_line = f'{match.group("indent")}sha256 "{sha256}"{newline}'
|
|
45
|
+
sha256_count += 1
|
|
46
|
+
else:
|
|
47
|
+
output_line = source_line
|
|
48
|
+
lines.append(output_line)
|
|
49
|
+
|
|
50
|
+
if version_count != 1:
|
|
51
|
+
msg = f"expected exactly one version stanza, found {version_count}"
|
|
52
|
+
raise ValueError(msg)
|
|
53
|
+
if sha256_count != 1:
|
|
54
|
+
msg = f"expected exactly one sha256 stanza, found {sha256_count}"
|
|
55
|
+
raise ValueError(msg)
|
|
56
|
+
|
|
57
|
+
return "".join(lines)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def update_cask_file(path: Path, *, version: str, sha256: str) -> None:
|
|
61
|
+
"""Update a cask file in place."""
|
|
62
|
+
path.write_text(
|
|
63
|
+
update_cask_text(path.read_text(), version=version, sha256=sha256),
|
|
64
|
+
encoding="utf-8",
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def main() -> None:
|
|
69
|
+
"""Run the command-line cask updater."""
|
|
70
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
71
|
+
parser.add_argument(
|
|
72
|
+
"--cask",
|
|
73
|
+
type=Path,
|
|
74
|
+
default=Path("Casks/agent-cli.rb"),
|
|
75
|
+
help="Path to the cask file to update.",
|
|
76
|
+
)
|
|
77
|
+
parser.add_argument(
|
|
78
|
+
"--version", required=True, help="Release version, with or without v prefix."
|
|
79
|
+
)
|
|
80
|
+
parser.add_argument("--sha256", required=True, help="SHA-256 checksum for the release DMG.")
|
|
81
|
+
args = parser.parse_args()
|
|
82
|
+
|
|
83
|
+
update_cask_file(args.cask, version=args.version, sha256=args.sha256)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
if __name__ == "__main__":
|
|
87
|
+
main()
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
name: Publish Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
deploy:
|
|
9
|
+
name: Publish Python package
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
environment:
|
|
12
|
+
name: pypi
|
|
13
|
+
url: https://pypi.org/p/${{ github.repository }}
|
|
14
|
+
permissions:
|
|
15
|
+
id-token: write
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v6
|
|
18
|
+
- name: Install uv
|
|
19
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
20
|
+
- name: Build
|
|
21
|
+
run: uv build
|
|
22
|
+
- name: Publish package distributions to PyPI
|
|
23
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
24
|
+
|
|
25
|
+
build_macos_app:
|
|
26
|
+
name: Build and publish macOS app
|
|
27
|
+
runs-on: macos-latest
|
|
28
|
+
timeout-minutes: 45
|
|
29
|
+
permissions:
|
|
30
|
+
contents: write
|
|
31
|
+
steps:
|
|
32
|
+
- uses: actions/checkout@v6
|
|
33
|
+
- name: Install uv
|
|
34
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
35
|
+
- name: Import Developer ID certificate
|
|
36
|
+
uses: apple-actions/import-codesign-certs@v7
|
|
37
|
+
with:
|
|
38
|
+
p12-file-base64: ${{ secrets.MACOS_CODESIGN_CERTIFICATE_BASE64 }}
|
|
39
|
+
p12-password: ${{ secrets.MACOS_CODESIGN_CERTIFICATE_PASSWORD }}
|
|
40
|
+
keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }}
|
|
41
|
+
- name: Resolve Developer ID identity
|
|
42
|
+
id: codesign
|
|
43
|
+
run: |
|
|
44
|
+
IDENTITY=$(
|
|
45
|
+
security find-identity -v -p codesigning |
|
|
46
|
+
awk -F '"' '/Developer ID Application/ { print $2; exit }'
|
|
47
|
+
)
|
|
48
|
+
if [[ -z "$IDENTITY" ]]; then
|
|
49
|
+
echo "Developer ID Application signing identity not found." >&2
|
|
50
|
+
exit 1
|
|
51
|
+
fi
|
|
52
|
+
echo "identity=$IDENTITY" >> "$GITHUB_OUTPUT"
|
|
53
|
+
- name: Build notarized macOS DMG
|
|
54
|
+
env:
|
|
55
|
+
CODESIGN_IDENTITY: ${{ steps.codesign.outputs.identity }}
|
|
56
|
+
APPLE_ID: ${{ secrets.APPLE_ID }}
|
|
57
|
+
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
|
|
58
|
+
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
|
59
|
+
APP_VERSION: ${{ github.event.release.tag_name }}
|
|
60
|
+
BUILD_VERSION: ${{ github.run_number }}
|
|
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
|
|
69
|
+
- name: Upload macOS app to GitHub Release
|
|
70
|
+
env:
|
|
71
|
+
GH_TOKEN: ${{ github.token }}
|
|
72
|
+
TAG_NAME: ${{ github.event.release.tag_name }}
|
|
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
|
|
113
|
+
env:
|
|
114
|
+
TAG_NAME: ${{ github.event.release.tag_name }}
|
|
115
|
+
run: |
|
|
116
|
+
VERSION="${TAG_NAME#v}"
|
|
117
|
+
SHA256=$(shasum -a 256 dist/macos/AgentCLI.dmg | awk '{ print $1 }')
|
|
118
|
+
|
|
119
|
+
python3 .github/scripts/update_cask.py \
|
|
120
|
+
--version "$VERSION" \
|
|
121
|
+
--sha256 "$SHA256"
|
|
122
|
+
|
|
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."
|
|
125
|
+
exit 0
|
|
126
|
+
fi
|
|
127
|
+
|
|
128
|
+
git config user.name "github-actions[bot]"
|
|
129
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
130
|
+
git add Casks/agent-cli.rb macos/appcast.xml
|
|
131
|
+
git commit -m "Update AgentCLI release metadata to ${TAG_NAME}"
|
|
132
|
+
git pull --rebase origin main
|
|
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.9"
|
|
3
|
+
sha256 "b2d7dd26b67fceb32db31d5506c0890f9c879f56d049e6fd051fac151b68a300"
|
|
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.10
|
|
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.8 → agent_cli-0.95.10}/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
|
|
@@ -161,7 +161,7 @@ final class AgentCommandRunner: ObservableObject {
|
|
|
161
161
|
self.stopBootstrapAnimationTimer()
|
|
162
162
|
return
|
|
163
163
|
}
|
|
164
|
-
self.bootstrapAnimationTick = (self.bootstrapAnimationTick + 1) %
|
|
164
|
+
self.bootstrapAnimationTick = (self.bootstrapAnimationTick + 1) % 4
|
|
165
165
|
if let startedAt = self.bootstrapPhaseStartedAt {
|
|
166
166
|
self.bootstrapElapsedSeconds = max(0, Int(Date().timeIntervalSince(startedAt)))
|
|
167
167
|
}
|
|
@@ -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
|
|