agent-cli 0.94.2__tar.gz → 0.95.0__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.0/.github/workflows/release.yml +61 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.gitignore +1 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.pre-commit-config.yaml +1 -1
- {agent_cli-0.94.2 → agent_cli-0.95.0}/PKG-INFO +1 -1
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/process.py +175 -25
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/daemon/cli.py +4 -2
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/install/launchd.py +23 -1
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/install/service_config.py +8 -1
- agent_cli-0.95.0/docs/logo-avatar.svg +51 -0
- agent_cli-0.95.0/macos/AgentCLI/Package.resolved +14 -0
- agent_cli-0.95.0/macos/AgentCLI/Package.swift +25 -0
- agent_cli-0.95.0/macos/AgentCLI/README.md +97 -0
- agent_cli-0.95.0/macos/AgentCLI/Resources/Info.plist +32 -0
- agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +145 -0
- agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +82 -0
- agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +579 -0
- agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +322 -0
- agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +85 -0
- agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +6 -0
- agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +32 -0
- agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +40 -0
- agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +67 -0
- agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +309 -0
- agent_cli-0.95.0/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +180 -0
- agent_cli-0.95.0/macos/build-macos-app.sh +333 -0
- agent_cli-0.95.0/macos/test-macos-app-e2e.sh +168 -0
- agent_cli-0.95.0/tests/install/test_launchd.py +85 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_daemon.py +69 -0
- agent_cli-0.95.0/tests/test_macos_app.py +803 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_process_manager.py +63 -4
- agent_cli-0.94.2/.github/workflows/release.yml +0 -22
- agent_cli-0.94.2/tests/install/test_launchd.py +0 -23
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.claude-plugin/README.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.cursorrules +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.dockerignore +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.env.example +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/logo.svg +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/release-drafter.yml +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/renovate.json +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/scripts/sync_extras.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/workflows/docker.yml +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/workflows/docs.yml +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/workflows/markdown-code-runner.yml +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/workflows/pytest.yml +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/workflows/release-drafter.yml +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.jscpd.json +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.prompts/docs-review.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/.prompts/pr-review.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/CLAUDE.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/LICENSE +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/LLAMA_SERVER_USAGE.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/README.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/__main__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_extras.json +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/diarization.txt +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/mlx-whisper.txt +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/vad.txt +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/vectordb.txt +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/whisper-transformers.txt +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_requirements/wyoming.txt +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/_tools.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/diarize_live_session.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/speakers.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/transcribe.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/transcribe_live.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/api.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/cli.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/config.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/constants.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/alignment.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/deps.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/diarization.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/speaker_identity.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/utils.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/vad.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/daemon/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/_branch_name.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/_config.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/_output.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/cleanup.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/cli.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/base.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/hooks.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/launch.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/project.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/skill/SKILL.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/registry.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/tmux.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/example-config.toml +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/install/common.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/install/extras.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/install/services.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/install/systemd.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/opts.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/py.typed +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/cli.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/common.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/proxy/api.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/tts/backends/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/tts/model_manager.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/tts/wyoming_handler.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/backends/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/backends/base.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/backends/mlx.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/backends/transformers.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/model_manager.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/services/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/services/asr.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docker/docker-compose.yml +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docker/memory-proxy.Dockerfile +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docker/rag-proxy.Dockerfile +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docker/transcribe-proxy.Dockerfile +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docker/tts.Dockerfile +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docker/whisper.Dockerfile +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/CNAME +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/architecture/index.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/architecture/memory.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/architecture/rag.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/assistant.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/chat.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/config.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/daemon.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/dev.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/diarize-live-session.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/index.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/install-extras.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/install-services.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/memory.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/server/index.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/server/transcribe-proxy.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/server/whisper.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/speak.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/speakers.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/start-services.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/transcribe-live.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/transcribe.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/configuration.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/getting-started.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/index.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/installation/docker.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/installation/index.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/installation/linux.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/installation/macos.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/installation/nixos.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/installation/windows.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/logo-clean.svg +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/docs/system-integration.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/justfile +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/pyproject.toml +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/reddit.md +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/shell.nix +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_speak.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_speakers.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_transcribe.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_transcribe_agent.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_transcribe_live.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_transcribe_recovery.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_voice_edit.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/conftest.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/core/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/core/test_audio.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/core/test_sse.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/core/test_vad.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/core/test_watch.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_cleanup.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_cli.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_hooks.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_launch.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_project.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_terminals.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_verification.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/install/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/install/test_extras.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_client.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_files.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_git_integration.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_store.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/mocks/audio.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/mocks/llm.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/__init__.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_api.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_history.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_store.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_alignment.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_api.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_api_integration.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_asr.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_cli.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_config.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_diarization.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_diarize_live_session.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_env_vars.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_faster_whisper_backend.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_json_output.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_llm.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_mlx_backend.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_requires_extras.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_server_tts.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_server_whisper.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_services.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_speaker_identity.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_tools.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_transformers_backend.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_tts.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_utils.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_wake_word.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/uv.lock +0 -0
- {agent_cli-0.94.2 → agent_cli-0.95.0}/zensical.toml +0 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
name: Upload Python Package
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
deploy:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
environment:
|
|
11
|
+
name: pypi
|
|
12
|
+
url: https://pypi.org/p/${{ github.repository }}
|
|
13
|
+
permissions:
|
|
14
|
+
id-token: write
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v6
|
|
17
|
+
- name: Install uv
|
|
18
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
19
|
+
- name: Build
|
|
20
|
+
run: uv build
|
|
21
|
+
- name: Publish package distributions to PyPI
|
|
22
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
23
|
+
|
|
24
|
+
build_macos_app:
|
|
25
|
+
runs-on: macos-latest
|
|
26
|
+
permissions:
|
|
27
|
+
contents: write
|
|
28
|
+
steps:
|
|
29
|
+
- uses: actions/checkout@v6
|
|
30
|
+
- name: Install uv
|
|
31
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
32
|
+
- name: Import Developer ID certificate
|
|
33
|
+
uses: apple-actions/import-codesign-certs@v7
|
|
34
|
+
with:
|
|
35
|
+
p12-file-base64: ${{ secrets.MACOS_CODESIGN_CERTIFICATE_BASE64 }}
|
|
36
|
+
p12-password: ${{ secrets.MACOS_CODESIGN_CERTIFICATE_PASSWORD }}
|
|
37
|
+
keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }}
|
|
38
|
+
- name: Resolve Developer ID identity
|
|
39
|
+
id: codesign
|
|
40
|
+
run: |
|
|
41
|
+
IDENTITY=$(
|
|
42
|
+
security find-identity -v -p codesigning |
|
|
43
|
+
awk -F '"' '/Developer ID Application/ { print $2; exit }'
|
|
44
|
+
)
|
|
45
|
+
if [[ -z "$IDENTITY" ]]; then
|
|
46
|
+
echo "Developer ID Application signing identity not found." >&2
|
|
47
|
+
exit 1
|
|
48
|
+
fi
|
|
49
|
+
echo "identity=$IDENTITY" >> "$GITHUB_OUTPUT"
|
|
50
|
+
- name: Build notarized macOS DMG
|
|
51
|
+
env:
|
|
52
|
+
CODESIGN_IDENTITY: ${{ steps.codesign.outputs.identity }}
|
|
53
|
+
APPLE_ID: ${{ secrets.APPLE_ID }}
|
|
54
|
+
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
|
|
55
|
+
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
|
56
|
+
run: NOTARIZE=1 macos/build-macos-app.sh --dmg
|
|
57
|
+
- name: Upload macOS app to GitHub Release
|
|
58
|
+
env:
|
|
59
|
+
GH_TOKEN: ${{ github.token }}
|
|
60
|
+
TAG_NAME: ${{ github.event.release.tag_name }}
|
|
61
|
+
run: gh release upload "$TAG_NAME" dist/macos/AgentCLI.dmg --clobber
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.95.0
|
|
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>
|
|
@@ -2,24 +2,49 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import json
|
|
5
6
|
import os
|
|
6
7
|
import signal
|
|
7
8
|
import sys
|
|
9
|
+
import tempfile
|
|
8
10
|
import time
|
|
9
11
|
from contextlib import contextmanager
|
|
10
12
|
from pathlib import Path
|
|
11
|
-
from typing import TYPE_CHECKING
|
|
13
|
+
from typing import TYPE_CHECKING, NamedTuple
|
|
12
14
|
|
|
13
15
|
if TYPE_CHECKING:
|
|
14
16
|
from collections.abc import Generator
|
|
15
17
|
|
|
16
|
-
# Default location for PID files
|
|
17
|
-
PID_DIR = Path.home() / ".cache" / "agent-cli"
|
|
18
|
-
|
|
19
18
|
# Store the original process title before any modifications
|
|
20
19
|
_original_proctitle: str | None = None
|
|
21
20
|
|
|
22
21
|
|
|
22
|
+
class _PidInfo(NamedTuple):
|
|
23
|
+
pid: int
|
|
24
|
+
uses_lock: bool
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _default_pid_dir() -> Path:
|
|
28
|
+
"""Return local runtime dir for process control files."""
|
|
29
|
+
if runtime_dir := os.environ.get("AGENTCLI_RUNTIME_DIR"):
|
|
30
|
+
return Path(runtime_dir)
|
|
31
|
+
|
|
32
|
+
if xdg_runtime_dir := os.environ.get("XDG_RUNTIME_DIR"):
|
|
33
|
+
return Path(xdg_runtime_dir) / "agent-cli"
|
|
34
|
+
|
|
35
|
+
if os.name == "posix":
|
|
36
|
+
return Path(tempfile.gettempdir()) / f"agent-cli-{os.getuid()}"
|
|
37
|
+
|
|
38
|
+
if local_app_data := os.environ.get("LOCALAPPDATA"):
|
|
39
|
+
return Path(local_app_data) / "agent-cli" / "runtime"
|
|
40
|
+
|
|
41
|
+
return Path(tempfile.gettempdir()) / "agent-cli-runtime"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# Default location for PID files and process locks.
|
|
45
|
+
PID_DIR = _default_pid_dir()
|
|
46
|
+
|
|
47
|
+
|
|
23
48
|
def set_process_title(process_name: str) -> None:
|
|
24
49
|
"""Set the process title and thread name for identification in ps/htop/btop.
|
|
25
50
|
|
|
@@ -57,6 +82,12 @@ def _get_pid_file(process_name: str) -> Path:
|
|
|
57
82
|
return PID_DIR / f"{process_name}.pid"
|
|
58
83
|
|
|
59
84
|
|
|
85
|
+
def _get_lock_file(process_name: str) -> Path:
|
|
86
|
+
"""Get the path to the process lock file for a given process name."""
|
|
87
|
+
PID_DIR.mkdir(parents=True, exist_ok=True)
|
|
88
|
+
return PID_DIR / f"{process_name}.lock"
|
|
89
|
+
|
|
90
|
+
|
|
60
91
|
def _get_stop_file(process_name: str) -> Path:
|
|
61
92
|
"""Get the path to the stop file for a given process name."""
|
|
62
93
|
PID_DIR.mkdir(parents=True, exist_ok=True)
|
|
@@ -89,28 +120,137 @@ def _is_pid_running(pid: int) -> bool:
|
|
|
89
120
|
return False
|
|
90
121
|
|
|
91
122
|
|
|
92
|
-
def
|
|
93
|
-
"""
|
|
94
|
-
|
|
123
|
+
def _supports_process_locks() -> bool:
|
|
124
|
+
"""Return whether this platform supports POSIX advisory locks."""
|
|
125
|
+
return sys.platform != "win32"
|
|
95
126
|
|
|
96
|
-
|
|
127
|
+
|
|
128
|
+
def _acquire_process_lock(process_name: str) -> int | None:
|
|
129
|
+
"""Try to acquire the per-process lock. Return fd when held."""
|
|
130
|
+
if not _supports_process_locks():
|
|
131
|
+
return None
|
|
132
|
+
|
|
133
|
+
import fcntl # noqa: PLC0415
|
|
134
|
+
|
|
135
|
+
lock_file = _get_lock_file(process_name)
|
|
136
|
+
fd = os.open(lock_file, os.O_CREAT | os.O_RDWR, 0o600)
|
|
137
|
+
try:
|
|
138
|
+
fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
|
|
139
|
+
except BlockingIOError:
|
|
140
|
+
os.close(fd)
|
|
141
|
+
return None
|
|
142
|
+
except OSError:
|
|
143
|
+
os.close(fd)
|
|
144
|
+
raise
|
|
145
|
+
return fd
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def _release_process_lock(lock_fd: int | None) -> None:
|
|
149
|
+
"""Release a lock fd returned by _acquire_process_lock."""
|
|
150
|
+
if lock_fd is None:
|
|
151
|
+
return
|
|
152
|
+
|
|
153
|
+
import fcntl # noqa: PLC0415
|
|
154
|
+
|
|
155
|
+
fcntl.flock(lock_fd, fcntl.LOCK_UN)
|
|
156
|
+
os.close(lock_fd)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _is_process_lock_held(process_name: str) -> bool:
|
|
160
|
+
"""Return True when another process still owns the lock."""
|
|
161
|
+
if not _supports_process_locks():
|
|
162
|
+
return True
|
|
163
|
+
|
|
164
|
+
lock_fd = _acquire_process_lock(process_name)
|
|
165
|
+
if lock_fd is None:
|
|
166
|
+
return True
|
|
167
|
+
|
|
168
|
+
_release_process_lock(lock_fd)
|
|
169
|
+
return False
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def _legacy_pid_info(raw: str) -> _PidInfo | None:
|
|
173
|
+
"""Parse a legacy numeric PID file."""
|
|
174
|
+
try:
|
|
175
|
+
return _PidInfo(pid=int(raw), uses_lock=False)
|
|
176
|
+
except ValueError:
|
|
177
|
+
return None
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def _pid_info_from_payload(process_name: str, payload: object) -> _PidInfo | None:
|
|
181
|
+
"""Parse JSON PID metadata."""
|
|
182
|
+
if isinstance(payload, int):
|
|
183
|
+
return _PidInfo(pid=payload, uses_lock=False)
|
|
184
|
+
|
|
185
|
+
if (
|
|
186
|
+
not isinstance(payload, dict)
|
|
187
|
+
or payload.get("version") != 1
|
|
188
|
+
or payload.get("process_name") != process_name
|
|
189
|
+
):
|
|
190
|
+
return None
|
|
191
|
+
|
|
192
|
+
try:
|
|
193
|
+
pid = int(payload["pid"])
|
|
194
|
+
except (KeyError, TypeError, ValueError):
|
|
195
|
+
return None
|
|
196
|
+
|
|
197
|
+
return _PidInfo(pid=pid, uses_lock=True)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def _read_pid_info(process_name: str) -> _PidInfo | None:
|
|
201
|
+
"""Read either current JSON PID metadata or a legacy numeric PID file."""
|
|
202
|
+
pid_file = _get_pid_file(process_name)
|
|
203
|
+
try:
|
|
204
|
+
raw = pid_file.read_text().strip()
|
|
205
|
+
except FileNotFoundError:
|
|
97
206
|
return None
|
|
98
207
|
|
|
99
208
|
try:
|
|
100
|
-
|
|
101
|
-
|
|
209
|
+
payload = json.loads(raw)
|
|
210
|
+
except json.JSONDecodeError:
|
|
211
|
+
return _legacy_pid_info(raw)
|
|
102
212
|
|
|
103
|
-
|
|
104
|
-
if _is_pid_running(pid):
|
|
105
|
-
return pid
|
|
213
|
+
return _pid_info_from_payload(process_name, payload)
|
|
106
214
|
|
|
107
|
-
except (FileNotFoundError, ValueError):
|
|
108
|
-
pass
|
|
109
215
|
|
|
110
|
-
|
|
216
|
+
def _write_pid_info(process_name: str) -> None:
|
|
217
|
+
"""Write PID metadata for the current process."""
|
|
218
|
+
pid_file = _get_pid_file(process_name)
|
|
219
|
+
payload = {
|
|
220
|
+
"version": 1,
|
|
221
|
+
"process_name": process_name,
|
|
222
|
+
"pid": os.getpid(),
|
|
223
|
+
"created_at": time.time(),
|
|
224
|
+
}
|
|
225
|
+
pid_file.write_text(json.dumps(payload, sort_keys=True))
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def _cleanup_process_files(process_name: str) -> None:
|
|
229
|
+
"""Remove stale process control files."""
|
|
230
|
+
pid_file = _get_pid_file(process_name)
|
|
111
231
|
if pid_file.exists():
|
|
112
232
|
pid_file.unlink()
|
|
113
233
|
clear_stop_file(process_name)
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def _get_running_pid(process_name: str) -> int | None:
|
|
237
|
+
"""Get PID if process is running, None otherwise. Cleans up stale files."""
|
|
238
|
+
if not _get_pid_file(process_name).exists():
|
|
239
|
+
return None
|
|
240
|
+
|
|
241
|
+
pid_info = _read_pid_info(process_name)
|
|
242
|
+
if pid_info is None:
|
|
243
|
+
_cleanup_process_files(process_name)
|
|
244
|
+
return None
|
|
245
|
+
|
|
246
|
+
if pid_info.uses_lock and _supports_process_locks() and not _is_process_lock_held(process_name):
|
|
247
|
+
_cleanup_process_files(process_name)
|
|
248
|
+
return None
|
|
249
|
+
|
|
250
|
+
if _is_pid_running(pid_info.pid):
|
|
251
|
+
return pid_info.pid
|
|
252
|
+
|
|
253
|
+
_cleanup_process_files(process_name)
|
|
114
254
|
return None
|
|
115
255
|
|
|
116
256
|
|
|
@@ -173,9 +313,7 @@ def kill_process(process_name: str) -> bool:
|
|
|
173
313
|
# Keep PID file if process is still alive so subsequent --status/--toggle
|
|
174
314
|
# calls continue targeting the same process.
|
|
175
315
|
if process_stopped:
|
|
176
|
-
|
|
177
|
-
if pid_file.exists():
|
|
178
|
-
pid_file.unlink()
|
|
316
|
+
_cleanup_process_files(process_name)
|
|
179
317
|
elif not should_force_kill:
|
|
180
318
|
stop_file.touch()
|
|
181
319
|
|
|
@@ -189,21 +327,33 @@ def pid_file_context(process_name: str) -> Generator[Path, None, None]:
|
|
|
189
327
|
Creates PID file on entry, cleans up on exit.
|
|
190
328
|
Exits with error if process already running.
|
|
191
329
|
"""
|
|
192
|
-
|
|
330
|
+
lock_fd = _acquire_process_lock(process_name)
|
|
331
|
+
if _supports_process_locks() and lock_fd is None:
|
|
193
332
|
existing_pid = _get_running_pid(process_name)
|
|
194
333
|
print(f"Process {process_name} is already running (PID: {existing_pid})")
|
|
195
334
|
sys.exit(1)
|
|
196
335
|
|
|
336
|
+
if not _supports_process_locks() and is_process_running(process_name):
|
|
337
|
+
existing_pid = _get_running_pid(process_name)
|
|
338
|
+
print(f"Process {process_name} is already running (PID: {existing_pid})")
|
|
339
|
+
sys.exit(1)
|
|
340
|
+
|
|
341
|
+
if _supports_process_locks():
|
|
342
|
+
pid_info = _read_pid_info(process_name)
|
|
343
|
+
if pid_info and not pid_info.uses_lock and _is_pid_running(pid_info.pid):
|
|
344
|
+
_release_process_lock(lock_fd)
|
|
345
|
+
print(f"Process {process_name} is already running (PID: {pid_info.pid})")
|
|
346
|
+
sys.exit(1)
|
|
347
|
+
_cleanup_process_files(process_name)
|
|
348
|
+
|
|
197
349
|
# Clear stale stop markers from previous runs.
|
|
198
350
|
clear_stop_file(process_name)
|
|
199
351
|
|
|
200
352
|
pid_file = _get_pid_file(process_name)
|
|
201
|
-
|
|
202
|
-
f.write(str(os.getpid()))
|
|
353
|
+
_write_pid_info(process_name)
|
|
203
354
|
|
|
204
355
|
try:
|
|
205
356
|
yield pid_file
|
|
206
357
|
finally:
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
clear_stop_file(process_name)
|
|
358
|
+
_cleanup_process_files(process_name)
|
|
359
|
+
_release_process_lock(lock_fd)
|
|
@@ -146,9 +146,11 @@ def status_cmd(
|
|
|
146
146
|
console.print()
|
|
147
147
|
system = platform.system()
|
|
148
148
|
if system == "Darwin":
|
|
149
|
-
|
|
149
|
+
log_service = service or "<service>"
|
|
150
|
+
console.print(f"[dim]Full logs: ~/Library/Logs/agent-cli-{log_service}/[/dim]")
|
|
150
151
|
else:
|
|
151
|
-
|
|
152
|
+
log_service = service or "<service>"
|
|
153
|
+
console.print(f"[dim]Full logs: journalctl --user -u agent-cli-{log_service} -f[/dim]")
|
|
152
154
|
|
|
153
155
|
|
|
154
156
|
def _confirm_action(message: str) -> bool:
|
|
@@ -41,6 +41,22 @@ _MACOS_DAEMON_PATH = (
|
|
|
41
41
|
"/sbin"
|
|
42
42
|
)
|
|
43
43
|
|
|
44
|
+
_PRESERVED_APP_ENV_KEYS = (
|
|
45
|
+
"AGENTCLI_APP_SUPPORT_DIR",
|
|
46
|
+
"AGENTCLI_BUNDLED_UV",
|
|
47
|
+
"AGENTCLI_PACKAGE_SOURCE",
|
|
48
|
+
"AGENTCLI_RUNTIME_DIR",
|
|
49
|
+
"AGENT_CLI_CONFIG_HOME",
|
|
50
|
+
"UV_CACHE_DIR",
|
|
51
|
+
"UV_PYTHON_INSTALL_DIR",
|
|
52
|
+
"UV_PYTHON_BIN_DIR",
|
|
53
|
+
"UV_TOOL_DIR",
|
|
54
|
+
"UV_TOOL_BIN_DIR",
|
|
55
|
+
"UV_NO_PROGRESS",
|
|
56
|
+
"NO_COLOR",
|
|
57
|
+
"TERM",
|
|
58
|
+
)
|
|
59
|
+
|
|
44
60
|
|
|
45
61
|
def _get_label(service_name: str) -> str:
|
|
46
62
|
"""Get launchd label for a service."""
|
|
@@ -95,13 +111,19 @@ def _generate_plist(
|
|
|
95
111
|
log_dir: Path,
|
|
96
112
|
) -> dict:
|
|
97
113
|
"""Generate plist dictionary for a launchd service."""
|
|
114
|
+
environment = {"PATH": _MACOS_DAEMON_PATH}
|
|
115
|
+
for key in _PRESERVED_APP_ENV_KEYS:
|
|
116
|
+
value = os.environ.get(key)
|
|
117
|
+
if value:
|
|
118
|
+
environment[key] = value
|
|
119
|
+
|
|
98
120
|
return {
|
|
99
121
|
"Label": _get_label(service.name),
|
|
100
122
|
"ProgramArguments": build_service_command(service, uv_path, use_macos_extra=True),
|
|
101
123
|
"RunAtLoad": True,
|
|
102
124
|
"KeepAlive": True,
|
|
103
125
|
"WorkingDirectory": str(home_dir),
|
|
104
|
-
"EnvironmentVariables":
|
|
126
|
+
"EnvironmentVariables": environment,
|
|
105
127
|
"StandardOutPath": str(log_dir / "stdout.log"),
|
|
106
128
|
"StandardErrorPath": str(log_dir / "stderr.log"),
|
|
107
129
|
}
|
|
@@ -126,6 +126,7 @@ def build_service_command(
|
|
|
126
126
|
) -> list[str]:
|
|
127
127
|
"""Build the command args for running a service via uv tool run."""
|
|
128
128
|
extra = (service.macos_extra or service.extra) if use_macos_extra else service.extra
|
|
129
|
+
package_source = os.environ.get("AGENTCLI_PACKAGE_SOURCE", "agent-cli")
|
|
129
130
|
|
|
130
131
|
args = [str(uv_path), "tool", "run"]
|
|
131
132
|
|
|
@@ -140,7 +141,7 @@ def build_service_command(
|
|
|
140
141
|
args.extend(
|
|
141
142
|
[
|
|
142
143
|
"--from",
|
|
143
|
-
f"
|
|
144
|
+
f"{package_source}[{extra}]",
|
|
144
145
|
"agent-cli",
|
|
145
146
|
*cmd_path,
|
|
146
147
|
*service.command_args,
|
|
@@ -151,6 +152,12 @@ def build_service_command(
|
|
|
151
152
|
|
|
152
153
|
def find_uv(extra_paths: list[Path] | None = None) -> Path | None:
|
|
153
154
|
"""Find uv executable, preferring system paths over virtualenv."""
|
|
155
|
+
bundled_uv = os.environ.get("AGENTCLI_BUNDLED_UV")
|
|
156
|
+
if bundled_uv:
|
|
157
|
+
bundled_uv_path = Path(bundled_uv).expanduser()
|
|
158
|
+
if bundled_uv_path.is_file() and os.access(bundled_uv_path, os.X_OK):
|
|
159
|
+
return bundled_uv_path
|
|
160
|
+
|
|
154
161
|
paths = [
|
|
155
162
|
Path.home() / ".local" / "bin" / "uv",
|
|
156
163
|
Path.home() / ".cargo" / "bin" / "uv",
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg
|
|
3
|
+
version="1.1"
|
|
4
|
+
width="790"
|
|
5
|
+
height="850"
|
|
6
|
+
viewBox="560 140 790 850"
|
|
7
|
+
xmlns="http://www.w3.org/2000/svg">
|
|
8
|
+
<title>AgentCLI avatar logo</title>
|
|
9
|
+
<path
|
|
10
|
+
fill="#000000"
|
|
11
|
+
opacity="1"
|
|
12
|
+
stroke="none"
|
|
13
|
+
d="m 1209.8213,729.78601 c -7.9569,6.79279 -15.6414,13.35761 -24.1472,20.62415 2.4815,0.82159 4.0852,1.40344 5.7182,1.88562 27.5103,8.12365 53.4462,19.46124 76.1413,37.37982 22.0362,17.39838 37.714,39.23993 45.8825,66.23254 2.2857,7.55261 1.4493,8.7218 -5.6893,11.61774 -30.7659,12.48059 -63.024,19.94079 -94.9846,28.41571 -46.2448,12.26251 -92.4716,24.59228 -138.709,36.88257 -47.6999,12.67908 -95.39959,25.35937 -143.11419,37.98364 -3.03717,0.80353 -6.18586,1.2497 -9.31031,1.64197 -3.49304,0.43854 -4.9248,-1.21564 -5.40039,-4.7956 -1.48095,-11.14703 3.90241,-19.78723 10.24933,-27.76794 20.61048,-25.91571 41.63898,-51.49847 62.33527,-77.3465 26.10899,-32.60809 52.35859,-65.11145 77.95039,-98.12286 16.1009,-20.76886 31.6269,-42.03064 46.4675,-63.71686 17.0558,-24.92303 30.0562,-52.13397 41.9342,-79.8595 3.9229,-9.15649 7.5886,-18.43768 11.8917,-27.41272 4.7139,-9.83203 11.151,-11.95098 20.148,-5.74469 13.6746,9.43311 26.9023,19.54426 39.9952,29.7826 16.5074,12.90838 32.8511,26.03937 48.9367,39.46814 7.3025,6.09649 7.2936,9.74573 0.068,16.27643 -13.8256,12.49688 -28.0118,24.59881 -42.1773,36.71392 -7.8365,6.70221 -15.9341,13.09925 -24.1865,19.86182 z"
|
|
14
|
+
id="path3" />
|
|
15
|
+
<path
|
|
16
|
+
fill="#000000"
|
|
17
|
+
opacity="1"
|
|
18
|
+
stroke="none"
|
|
19
|
+
d="m 919.20166,914.198 c -8.34613,9.74634 -16.54401,19.15252 -24.56738,28.7052 -3.1305,3.72729 -6.66651,4.19189 -11.1416,2.99115 -31.12769,-8.35242 -62.30451,-16.52124 -93.44202,-24.83698 -54.37109,-14.52063 -108.74457,-29.03308 -163.07025,-43.72229 -10.90027,-2.94732 -21.62348,-6.57 -32.36756,-10.06799 -6.63604,-2.16052 -7.72589,-4.2674 -5.47186,-11.24902 4.96222,-15.3703 12.83722,-29.18225 22.99591,-41.72339 21.67182,-26.75434 50.24958,-43.17896 82.03174,-54.73816 7.96643,-2.8974 16.13458,-5.23908 24.20068,-7.86469 1.20649,-0.39264 2.36176,-0.94238 3.89765,-1.56384 -8.9422,-7.60107 -17.4596,-14.91577 -26.05805,-22.13379 -16.05511,-13.47766 -32.18499,-26.86639 -48.22418,-40.36291 -5.21435,-4.38788 -10.51117,-8.7323 -15.28278,-13.57685 -5.00396,-5.08038 -5.14495,-9.46136 0.15265,-14.20929 9.76905,-8.75549 19.85767,-17.19793 30.24573,-25.2099 20.02075,-15.44146 40.26221,-30.60095 60.57636,-45.65582 9.14526,-6.77759 14.12945,-5.98553 19.99621,3.84906 3.79395,6.35986 6.33795,13.5354 8.91535,20.53931 16.68872,45.35052 39.8966,87.14245 69.03344,125.59143 35.77009,47.20227 71.89661,94.13476 107.96442,141.11065 6.99518,9.11078 7.1795,11.85956 -0.0228,20.87726 -3.42492,4.28821 -6.76507,8.64411 -10.36169,13.25086 z"
|
|
20
|
+
id="path4" />
|
|
21
|
+
<path
|
|
22
|
+
fill="#000000"
|
|
23
|
+
opacity="1"
|
|
24
|
+
stroke="none"
|
|
25
|
+
d="m 767.73248,321.60425 c 12.22571,-38.65079 25.76428,-76.81659 43.87549,-113.15615 4.40894,-8.84637 10.00739,-17.25793 16.07678,-25.07946 7.92694,-10.21523 20.30701,-13.11473 32.78595,-7.45446 22.24073,10.08811 44.2439,20.72582 66.07392,31.67688 6.16131,3.09084 11.12243,2.94316 17.26513,0.23487 25.19458,-11.10825 50.32831,-22.45487 76.05375,-32.21324 11.5618,-4.38572 24.3671,-6.31911 36.7803,-7.41323 13.678,-1.20563 24.5903,5.39716 32.5616,16.71669 10.3904,14.75437 16.1661,31.58501 21.9972,48.38257 10.1316,29.18511 20.127,58.41744 30.0826,88.44579 0.5645,5.70669 -1.6925,8.66787 -5.7422,11.3908 -11.8971,7.99949 -24.9334,13.10071 -38.6563,16.84739 -33.4929,9.14441 -67.85,12.13235 -102.29912,13.76477 -21.05755,0.99786 -42.22357,0.93478 -63.29321,0.11816 -23.01959,-0.89218 -46.00232,-2.99112 -68.96747,-4.95709 -22.06115,-1.88855 -43.73883,-6.12631 -64.45574,-14.02503 -12.19141,-4.64816 -25.73176,-8.25018 -30.13868,-23.27926 z"
|
|
26
|
+
id="path5" />
|
|
27
|
+
<path
|
|
28
|
+
fill="#000000"
|
|
29
|
+
opacity="1"
|
|
30
|
+
stroke="none"
|
|
31
|
+
d="m 780.65991,591.28064 c -8.93969,-15.16431 -16.72259,-30.4505 -17.67706,-48.07752 -0.70624,-13.04443 1.43805,-25.83831 5.35516,-38.28729 1.83551,-5.83356 6.9112,-7.84854 12.18225,-7.87164 21.81403,-0.0957 43.63489,0.0438 65.44336,0.53665 12.11969,0.2739 24.23218,1.25513 36.3252,2.20691 13.40527,1.05502 26.5636,2.92807 39.41986,7.64346 6.53088,2.39536 14.24194,1.77881 21.43842,2.10099 8.76715,0.39251 17.55474,0.45828 26.33245,0.42224 3.53882,-0.0145 7.53003,0.26034 10.53217,-1.20313 11.93207,-5.81671 24.67548,-8.24005 37.61398,-8.80978 32.7459,-1.44199 65.518,-2.39148 98.2891,-3.11643 19.5583,-0.43261 21.89,2.60971 25.7073,21.76041 5.997,30.0871 -2.0799,56.40057 -20.2144,79.97858 -12.831,16.68255 -30.8633,24.56946 -51.4877,27.30462 -15.1449,2.00855 -29.8342,0.52857 -44.1062,-4.67456 -19.6779,-7.17413 -33.22988,-21.24896 -42.25514,-39.64483 -4.74561,-9.67267 -8.42908,-19.90833 -12.01215,-30.09381 -2.16852,-6.16437 -5.79596,-10.39124 -12.19409,-10.88709 -6.02869,-0.46735 -12.21552,-0.13769 -18.21436,0.69476 -3.93243,0.54572 -5.50775,4.15528 -6.65497,7.92743 -4.79638,15.77075 -9.63128,31.5492 -19.29608,45.26361 -12.99487,18.43982 -30.43359,29.05353 -53.08533,31.4917 -20.75683,2.23407 -39.99859,-1.72113 -57.96875,-12.1109 -9.53326,-5.51202 -17.07849,-13.20111 -23.47302,-22.55438 z"
|
|
32
|
+
id="path6" />
|
|
33
|
+
<path
|
|
34
|
+
fill="#000000"
|
|
35
|
+
opacity="1"
|
|
36
|
+
stroke="none"
|
|
37
|
+
d="m 1159.632,371.56082 c 12.5134,3.14069 25.1529,5.85529 37.5131,9.51379 23.2758,6.88944 46.2019,14.83405 67.7437,26.22648 4.0902,2.16308 8.0398,4.76977 11.6025,7.71753 8.7958,7.2774 8.166,16.75509 -1.8728,22.27093 -7.3927,4.06195 -15.2646,7.42978 -23.2291,10.23914 -21.7618,7.67627 -44.3198,12.1369 -67.1284,15.30517 -17.561,2.43933 -35.1225,4.98065 -52.7559,6.76279 -15.7038,1.58716 -31.4925,2.6395 -47.2688,3.147 -39.765,1.27924 -79.5401,2.66821 -119.31906,2.96442 -33.63099,0.25049 -67.27674,-0.81052 -100.90845,-1.60629 -16.63135,-0.39356 -33.26984,-1.16748 -49.86127,-2.37241 -16.88403,-1.2262 -33.7948,-2.61972 -50.54907,-4.97131 -24.90418,-3.49546 -49.86377,-7.03119 -74.4491,-12.21338 -16.93774,-3.57022 -33.25689,-10.03961 -49.90124,-15.05127 -9.87769,-2.97418 -12.04297,-13.11038 -3.88971,-20.81195 5.95215,-5.62244 13.18188,-10.17703 20.45257,-14.0665 23.44312,-12.54092 49.02954,-19.36401 74.3703,-26.75723 6.52088,-1.9025 13.1167,-3.54807 20.19037,-4.91825 0.89575,11.49323 6.89569,18.84281 16.09723,24.26529 15.76062,9.28769 32.68183,15.9429 50.46521,19.48853 20.0882,4.00512 40.44812,6.97424 60.8241,9.11712 20.76452,2.18369 41.677,3.26627 62.55371,3.9726 14.59778,0.4939 29.25604,-0.18872 43.86584,-0.83258 15.90307,-0.70081 31.78017,-1.98303 47.67067,-2.9773 21.5552,-1.34872 42.7762,-4.8475 63.6947,-10.12576 17.1178,-4.31921 33.8824,-9.5249 48.8558,-19.40967 8.0796,-5.3338 14.2476,-11.44665 13.6571,-22.03387 -0.051,-0.91553 1.0241,-1.89386 1.576,-2.84302 z"
|
|
38
|
+
id="path8" />
|
|
39
|
+
<path
|
|
40
|
+
fill="#000000"
|
|
41
|
+
opacity="1"
|
|
42
|
+
stroke="none"
|
|
43
|
+
d="m 1159.4102,371.29181 c -0.3301,1.21817 -1.4052,2.1965 -1.3542,3.11203 0.5905,10.58722 -5.5775,16.70007 -13.6571,22.03387 -14.9734,9.88477 -31.738,15.09046 -48.8558,19.40967 -20.9185,5.27826 -42.1395,8.77704 -63.6947,10.12576 -15.8905,0.99427 -31.7676,2.27649 -47.67067,2.9773 -14.6098,0.64386 -29.26806,1.32648 -43.86584,0.83258 -20.87671,-0.70633 -41.78919,-1.78891 -62.55371,-3.9726 -20.37598,-2.14288 -40.7359,-5.112 -60.8241,-9.11712 -17.78338,-3.54563 -34.70459,-10.20084 -50.46521,-19.48853 -9.20154,-5.42248 -15.20148,-12.77206 -15.70459,-24.32397 5.31256,-16.82395 10.74469,-33.1958 16.58295,-49.95899 0.56903,-0.66574 0.53674,-0.91558 0.3092,-1.14087 0,0 0.007,-0.10058 0.0417,-0.13864 4.44128,14.99103 17.98163,18.59305 30.17304,23.24121 20.71691,7.89872 42.39459,12.13648 64.45574,14.02503 22.96515,1.96597 45.94788,4.06491 68.96747,4.95709 21.06964,0.81662 42.23566,0.8797 63.29321,-0.11816 34.44911,-1.63242 68.80621,-4.62036 102.29911,-13.76477 13.7229,-3.74668 26.7592,-8.8479 38.6563,-16.84739 4.0497,-2.72293 6.3067,-5.68411 5.7093,-11.01348 3.7533,9.88632 7.4177,20.22006 11.1411,30.53247 2.217,6.14016 4.5268,12.24679 7.0168,18.63751 z"
|
|
44
|
+
id="path13" />
|
|
45
|
+
<path
|
|
46
|
+
fill="#000000"
|
|
47
|
+
opacity="1"
|
|
48
|
+
stroke="none"
|
|
49
|
+
d="m 767.49426,321.87805 c 0.38971,0.12818 0.422,0.37802 0.0761,0.72339 -0.37011,-0.14789 -0.38855,-0.38028 -0.0761,-0.72339 z"
|
|
50
|
+
id="path17" />
|
|
51
|
+
</svg>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"pins" : [
|
|
3
|
+
{
|
|
4
|
+
"identity" : "keyboardshortcuts",
|
|
5
|
+
"kind" : "remoteSourceControl",
|
|
6
|
+
"location" : "https://github.com/sindresorhus/KeyboardShortcuts",
|
|
7
|
+
"state" : {
|
|
8
|
+
"revision" : "70caa8dea43e2d273cd5ab78885d7eff01df550c",
|
|
9
|
+
"version" : "1.10.0"
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"version" : 2
|
|
14
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// swift-tools-version: 5.9
|
|
2
|
+
|
|
3
|
+
import PackageDescription
|
|
4
|
+
|
|
5
|
+
let package = Package(
|
|
6
|
+
name: "AgentCLI",
|
|
7
|
+
platforms: [
|
|
8
|
+
.macOS(.v13),
|
|
9
|
+
],
|
|
10
|
+
products: [
|
|
11
|
+
.executable(name: "AgentCLI", targets: ["AgentCLI"]),
|
|
12
|
+
],
|
|
13
|
+
dependencies: [
|
|
14
|
+
.package(url: "https://github.com/sindresorhus/KeyboardShortcuts", exact: "1.10.0"),
|
|
15
|
+
],
|
|
16
|
+
targets: [
|
|
17
|
+
.executableTarget(
|
|
18
|
+
name: "AgentCLI",
|
|
19
|
+
dependencies: [
|
|
20
|
+
.product(name: "KeyboardShortcuts", package: "KeyboardShortcuts"),
|
|
21
|
+
],
|
|
22
|
+
path: "Sources/AgentCLI"
|
|
23
|
+
),
|
|
24
|
+
]
|
|
25
|
+
)
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Agent CLI macOS app
|
|
2
|
+
|
|
3
|
+
This directory contains a native SwiftUI menu bar wrapper for `agent-cli`.
|
|
4
|
+
The app does not reimplement any agent behavior. It bundles `uv`, installs a
|
|
5
|
+
private `agent-cli[audio,llm]` tool into the user's Application Support
|
|
6
|
+
directory on first use, and shells out to that private executable.
|
|
7
|
+
|
|
8
|
+
Transcription is the default zero-config path. The first transcription action
|
|
9
|
+
installs and starts the local Whisper launchd daemon with
|
|
10
|
+
`agent-cli daemon install whisper -y`; the model is downloaded lazily by the
|
|
11
|
+
server on first transcription request. No existing `agent-cli` config file is
|
|
12
|
+
required.
|
|
13
|
+
|
|
14
|
+
The packaged app registers native macOS global hotkeys itself:
|
|
15
|
+
|
|
16
|
+
- `Fn+Space` toggles transcription
|
|
17
|
+
- `Fn` records while held and inserts the transcript
|
|
18
|
+
- `Cmd+Shift+A` autocorrects clipboard text
|
|
19
|
+
- `Cmd+Shift+V` starts voice edit
|
|
20
|
+
|
|
21
|
+
Choose **Keyboard Shortcuts...** from the menu bar app to change these
|
|
22
|
+
shortcuts. The settings UI uses the `KeyboardShortcuts` Swift package for
|
|
23
|
+
shortcut parsing, `UserDefaults` storage, and global key-up handlers.
|
|
24
|
+
|
|
25
|
+
## Build
|
|
26
|
+
|
|
27
|
+
From the repository root:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
./macos/build-macos-app.sh
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The app bundle is written to `dist/macos/AgentCLI.app`.
|
|
34
|
+
|
|
35
|
+
## Install locally
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
./macos/build-macos-app.sh --install
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
This builds the app, copies it to `/Applications/AgentCLI.app`, and opens it.
|
|
42
|
+
|
|
43
|
+
## Build a DMG
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
./macos/build-macos-app.sh --dmg
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
The DMG is written to `dist/macos/AgentCLI.dmg`.
|
|
50
|
+
|
|
51
|
+
## End-to-end packaging check
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
./macos/test-macos-app-e2e.sh
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
The E2E test builds the app and DMG, verifies code signing and the image, then
|
|
58
|
+
uses a fake bundled `uv` to prove the app bootstraps its private CLI, installs
|
|
59
|
+
the Whisper daemon, and runs the default transcription command without network
|
|
60
|
+
downloads.
|
|
61
|
+
|
|
62
|
+
## Signing
|
|
63
|
+
|
|
64
|
+
By default the script ad-hoc signs the local app bundle. For public
|
|
65
|
+
distribution, pass a Developer ID identity and then notarize the resulting app
|
|
66
|
+
or DMG:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
CODESIGN_IDENTITY="Developer ID Application: Your Name (TEAMID)" ./macos/build-macos-app.sh --dmg
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
To notarize during the build, set `NOTARIZE=1` and provide Apple notary
|
|
73
|
+
credentials:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
CODESIGN_IDENTITY="Developer ID Application: Your Name (TEAMID)" \
|
|
77
|
+
NOTARIZE=1 \
|
|
78
|
+
APPLE_ID="you@example.com" \
|
|
79
|
+
APPLE_APP_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx" \
|
|
80
|
+
APPLE_TEAM_ID="TEAMID" \
|
|
81
|
+
./macos/build-macos-app.sh --dmg
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Release CI
|
|
85
|
+
|
|
86
|
+
Publishing a GitHub release runs `.github/workflows/release.yml`, which imports
|
|
87
|
+
the Developer ID certificate with `apple-actions/import-codesign-certs`, builds,
|
|
88
|
+
notarizes, staples, and uploads `dist/macos/AgentCLI.dmg` to the release. The
|
|
89
|
+
workflow expects these repository secrets:
|
|
90
|
+
|
|
91
|
+
- `MACOS_CODESIGN_CERTIFICATE_BASE64`: base64-encoded Developer ID Application
|
|
92
|
+
`.p12` certificate export
|
|
93
|
+
- `MACOS_CODESIGN_CERTIFICATE_PASSWORD`: password for that `.p12`
|
|
94
|
+
- `MACOS_KEYCHAIN_PASSWORD`: temporary CI keychain password
|
|
95
|
+
- `APPLE_ID`: Apple ID email for notarization
|
|
96
|
+
- `APPLE_APP_SPECIFIC_PASSWORD`: app-specific password for `notarytool`
|
|
97
|
+
- `APPLE_TEAM_ID`: Apple Developer Team ID
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
+
<plist version="1.0">
|
|
4
|
+
<dict>
|
|
5
|
+
<key>CFBundleDevelopmentRegion</key>
|
|
6
|
+
<string>en</string>
|
|
7
|
+
<key>CFBundleDisplayName</key>
|
|
8
|
+
<string>Agent CLI</string>
|
|
9
|
+
<key>CFBundleExecutable</key>
|
|
10
|
+
<string>AgentCLI</string>
|
|
11
|
+
<key>CFBundleIdentifier</key>
|
|
12
|
+
<string>lt.nijho.agent-cli.menubar</string>
|
|
13
|
+
<key>CFBundleIconFile</key>
|
|
14
|
+
<string>AgentCLI</string>
|
|
15
|
+
<key>CFBundleInfoDictionaryVersion</key>
|
|
16
|
+
<string>6.0</string>
|
|
17
|
+
<key>CFBundleName</key>
|
|
18
|
+
<string>Agent CLI</string>
|
|
19
|
+
<key>CFBundlePackageType</key>
|
|
20
|
+
<string>APPL</string>
|
|
21
|
+
<key>CFBundleShortVersionString</key>
|
|
22
|
+
<string>0.1.0</string>
|
|
23
|
+
<key>CFBundleVersion</key>
|
|
24
|
+
<string>1</string>
|
|
25
|
+
<key>LSMinimumSystemVersion</key>
|
|
26
|
+
<string>13.0</string>
|
|
27
|
+
<key>LSUIElement</key>
|
|
28
|
+
<true/>
|
|
29
|
+
<key>NSMicrophoneUsageDescription</key>
|
|
30
|
+
<string>Agent CLI uses microphone access when you start transcription or voice editing from the menu bar.</string>
|
|
31
|
+
</dict>
|
|
32
|
+
</plist>
|