agent-cli 0.98.5__tar.gz → 0.100.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.98.5 → agent_cli-0.100.0}/.github/workflows/pytest.yml +1 -1
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.pre-commit-config.yaml +1 -1
- {agent_cli-0.98.5 → agent_cli-0.100.0}/PKG-INFO +16 -1
- {agent_cli-0.98.5 → agent_cli-0.100.0}/README.md +15 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/agents/transcribe.py +44 -7
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/cli.py +5 -3
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/launch.py +34 -0
- agent_cli-0.100.0/agent_cli/dev/terminals/cmux.py +247 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/terminals/registry.py +2 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/opts.py +25 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/services/asr.py +206 -2
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/dev.md +1 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/transcribe.md +22 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/installation/macos-app.md +6 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Package.resolved +2 -2
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Package.swift +1 -1
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/AgentCommand.swift +21 -3
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/AgentRuntime.swift +78 -0
- agent_cli-0.100.0/macos/AgentCLI/Sources/AgentCLI/LiveTranscriptionPreview.swift +110 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/RecordingIndicatorController.swift +9 -1
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/Shortcuts.swift +4 -1
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/TranscriptionSettings.swift +5 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/VoiceLevelOverlay.swift +86 -9
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Tests/AgentCLITests/AgentCommandTests.swift +40 -3
- agent_cli-0.100.0/macos/AgentCLI/Tests/AgentCLITests/LivePreviewSwiftTestingTests.swift +62 -0
- agent_cli-0.100.0/macos/AgentCLI/Tests/AgentCLITests/LiveTranscriptionPreviewTests.swift +24 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Tests/AgentCLITests/VoiceLevelMeterTests.swift +13 -1
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/appcast.xml +31 -40
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/agents/test_transcribe.py +156 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/agents/test_transcribe_recovery.py +14 -6
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/dev/test_launch.py +30 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/dev/test_terminals.py +295 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_asr.py +211 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.claude-plugin/README.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.cursorrules +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.dockerignore +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.env.example +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.github/logo.svg +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.github/release-drafter.yml +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.github/renovate.json +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.github/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.github/scripts/normalize_appcast.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.github/scripts/sync_extras.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.github/workflows/docker.yml +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.github/workflows/docs.yml +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.github/workflows/markdown-code-runner.yml +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.github/workflows/release-drafter.yml +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.github/workflows/release.yml +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.gitignore +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.jscpd.json +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.prompts/docs-review.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/.prompts/pr-review.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/CLAUDE.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/LICENSE +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/LLAMA_SERVER_USAGE.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/__main__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_extras.json +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_overrides/nemo-whisper.txt +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_requirements/diarization.txt +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_requirements/mlx-whisper.txt +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_requirements/nemo-whisper.txt +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_requirements/vad.txt +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_requirements/vectordb.txt +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_requirements/whisper-transformers.txt +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_requirements/wyoming.txt +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/_tools.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/agents/diarize_live_session.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/agents/speakers.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/agents/transcribe_live.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/api.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/cli.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/config.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/constants.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/core/alignment.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/core/deps.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/core/diarization.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/core/process.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/core/speaker_identity.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/core/utils.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/core/vad.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/daemon/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/daemon/cli.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/_branch_name.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/_config.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/_output.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/cleanup.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/coding_agents/base.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/hooks.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/project.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/skill/SKILL.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/terminals/tmux.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/example-config.toml +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/install/common.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/install/extras.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/install/launchd.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/install/service_config.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/install/services.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/install/systemd.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/py.typed +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/cli.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/common.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/proxy/api.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/tts/backends/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/tts/model_manager.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/tts/wyoming_handler.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/whisper/backends/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/whisper/backends/base.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/whisper/backends/mlx.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/whisper/backends/nemo.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/whisper/backends/transformers.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/whisper/model_manager.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/services/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docker/docker-compose.yml +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docker/memory-proxy.Dockerfile +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docker/rag-proxy.Dockerfile +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docker/transcribe-proxy.Dockerfile +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docker/tts.Dockerfile +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docker/whisper.Dockerfile +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/CNAME +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/architecture/index.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/architecture/memory.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/architecture/rag.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/assistant.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/chat.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/config.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/daemon.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/diarize-live-session.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/index.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/install-extras.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/install-services.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/memory.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/server/index.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/server/transcribe-proxy.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/server/whisper.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/speak.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/speakers.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/start-services.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/transcribe-live.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/configuration.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/getting-started.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/index.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/installation/docker.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/installation/index.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/installation/linux.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/installation/macos.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/installation/nixos.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/installation/windows.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/logo-avatar.svg +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/logo-clean.svg +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/docs/system-integration.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/justfile +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/README.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Resources/AgentCLI.entitlements +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Resources/Info.plist +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Resources/dmg-background.svg +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/AgentCLIApp.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/AgentCommandRunner.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/AppDelegate.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/AppMetadata.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/AppUpdater.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/BootstrapState.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/CommandResult.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/ConfigurableHotkeyController.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/FocusedTextTarget.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/LoginItemController.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatus.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/MenuActivityStatusRow.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/MenuActivityTracker.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/MenuBarIcon.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/RecentTranscriptionReader.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/RecordingSoundSettings.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/RuntimeSettings.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/SettingsWindowController.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/StatusMenuController.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Sources/AgentCLI/TranscriptPasteController.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Tests/AgentCLITests/ConfigurableHotkeyControllerTests.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Tests/AgentCLITests/LoginItemControllerTests.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Tests/AgentCLITests/RecentTranscriptionReaderTests.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Tests/AgentCLITests/RecordingIndicatorControllerTests.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/AgentCLI/Tests/AgentCLITests/ShortcutDefaultsTests.swift +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/build-macos-app.sh +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/macos/test-macos-app-e2e.sh +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/pyproject.toml +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/reddit.md +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/shell.nix +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/agents/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/agents/test_speak.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/agents/test_speakers.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/agents/test_transcribe_agent.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/agents/test_transcribe_live.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/agents/test_voice_edit.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/conftest.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/core/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/core/test_audio.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/core/test_audio_levels.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/core/test_sse.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/core/test_vad.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/core/test_watch.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/dev/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/dev/test_cleanup.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/dev/test_cli.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/dev/test_hooks.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/dev/test_project.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/dev/test_verification.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/install/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/install/test_extras.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/install/test_launchd.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/memory/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/memory/test_client.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/memory/test_files.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/memory/test_git_integration.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/memory/test_store.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/mocks/audio.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/mocks/llm.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/rag/__init__.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/rag/test_api.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/rag/test_history.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/rag/test_store.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_alignment.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_api.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_api_integration.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_cli.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_config.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_daemon.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_diarization.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_diarize_live_session.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_env_vars.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_faster_whisper_backend.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_json_output.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_llm.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_macos_app.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_mlx_backend.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_nemo_backend.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_normalize_appcast.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_process_manager.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_requires_extras.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_server_tts.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_server_whisper.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_services.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_speaker_identity.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_tools.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_transformers_backend.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_tts.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_utils.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_wake_word.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/uv.lock +0 -0
- {agent_cli-0.98.5 → agent_cli-0.100.0}/zensical.toml +0 -0
|
@@ -43,6 +43,6 @@ jobs:
|
|
|
43
43
|
run: uv run --extra audio --extra diarization --extra llm --extra rag --extra memory --extra vad --extra faster-whisper --extra piper --extra kokoro --extra server --extra speed --extra test pytest -vvv
|
|
44
44
|
- name: Upload coverage reports to Codecov
|
|
45
45
|
if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.13'
|
|
46
|
-
uses: codecov/codecov-action@
|
|
46
|
+
uses: codecov/codecov-action@v7.0.0
|
|
47
47
|
env:
|
|
48
48
|
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.100.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>
|
|
@@ -1031,6 +1031,21 @@ the `[defaults]` section of your configuration file.
|
|
|
1031
1031
|
│ provide context for │
|
|
1032
1032
|
│ LLM cleanup. │
|
|
1033
1033
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
|
1034
|
+
╭─ Live Preview ─────────────────────────────────────────────────────────────────────────╮
|
|
1035
|
+
│ --live-preview-log PATH Write rolling live transcription │
|
|
1036
|
+
│ preview events to JSONL while │
|
|
1037
|
+
│ recording. │
|
|
1038
|
+
│ --live-preview-interval FLOAT Seconds between live preview │
|
|
1039
|
+
│ retranscriptions. │
|
|
1040
|
+
│ [default: 2.0] │
|
|
1041
|
+
│ --live-preview-window FLOAT Seconds of recent audio to include │
|
|
1042
|
+
│ in each live preview │
|
|
1043
|
+
│ retranscription. │
|
|
1044
|
+
│ [default: 15.0] │
|
|
1045
|
+
│ --live-preview-console,--live-previ… Print rolling live transcription │
|
|
1046
|
+
│ preview updates to the terminal │
|
|
1047
|
+
│ while recording. │
|
|
1048
|
+
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
|
1034
1049
|
╭─ Diarization ──────────────────────────────────────────────────────────────────────────╮
|
|
1035
1050
|
│ --diarize --no-diarize Enable speaker │
|
|
1036
1051
|
│ diarization │
|
|
@@ -923,6 +923,21 @@ the `[defaults]` section of your configuration file.
|
|
|
923
923
|
│ provide context for │
|
|
924
924
|
│ LLM cleanup. │
|
|
925
925
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
|
926
|
+
╭─ Live Preview ─────────────────────────────────────────────────────────────────────────╮
|
|
927
|
+
│ --live-preview-log PATH Write rolling live transcription │
|
|
928
|
+
│ preview events to JSONL while │
|
|
929
|
+
│ recording. │
|
|
930
|
+
│ --live-preview-interval FLOAT Seconds between live preview │
|
|
931
|
+
│ retranscriptions. │
|
|
932
|
+
│ [default: 2.0] │
|
|
933
|
+
│ --live-preview-window FLOAT Seconds of recent audio to include │
|
|
934
|
+
│ in each live preview │
|
|
935
|
+
│ retranscription. │
|
|
936
|
+
│ [default: 15.0] │
|
|
937
|
+
│ --live-preview-console,--live-previ… Print rolling live transcription │
|
|
938
|
+
│ preview updates to the terminal │
|
|
939
|
+
│ while recording. │
|
|
940
|
+
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
|
926
941
|
╭─ Diarization ──────────────────────────────────────────────────────────────────────────╮
|
|
927
942
|
│ --diarize --no-diarize Enable speaker │
|
|
928
943
|
│ diarization │
|
|
@@ -365,13 +365,20 @@ async def _async_main( # noqa: PLR0912, PLR0915, C901
|
|
|
365
365
|
emit_output: bool = True,
|
|
366
366
|
raise_diarization_errors: bool = False,
|
|
367
367
|
audio_level_callback: Callable[[bytes], None] | None = None,
|
|
368
|
+
live_preview_log: Path | None = None,
|
|
369
|
+
live_preview_interval: float = 2.0,
|
|
370
|
+
live_preview_window: float = 15.0,
|
|
371
|
+
live_preview_console: bool = False,
|
|
368
372
|
) -> TranscriptResult:
|
|
369
373
|
"""Unified async entry point for both live and file-based transcription."""
|
|
370
374
|
start_time = time.monotonic()
|
|
371
375
|
transcript: str | None
|
|
372
376
|
saved_recording_path: Path | None = None
|
|
377
|
+
live_preview_console_active = (
|
|
378
|
+
live_preview_console and audio_file_path is None and provider_cfg.asr_provider == "wyoming"
|
|
379
|
+
)
|
|
373
380
|
|
|
374
|
-
with maybe_live(not general_cfg.quiet) as live:
|
|
381
|
+
with maybe_live(not general_cfg.quiet and not live_preview_console_active) as live:
|
|
375
382
|
if audio_file_path:
|
|
376
383
|
# File-based transcription
|
|
377
384
|
# Determine if we can use native format support (skip PCM conversion)
|
|
@@ -447,6 +454,17 @@ async def _async_main( # noqa: PLR0912, PLR0915, C901
|
|
|
447
454
|
openai_asr_cfg,
|
|
448
455
|
gemini_asr_cfg,
|
|
449
456
|
)
|
|
457
|
+
live_preview_config = (
|
|
458
|
+
asr.LivePreviewConfig(
|
|
459
|
+
log_file=live_preview_log,
|
|
460
|
+
interval_seconds=live_preview_interval,
|
|
461
|
+
window_seconds=live_preview_window,
|
|
462
|
+
console=live_preview_console,
|
|
463
|
+
)
|
|
464
|
+
if (live_preview_log or live_preview_console)
|
|
465
|
+
and provider_cfg.asr_provider == "wyoming"
|
|
466
|
+
else None
|
|
467
|
+
)
|
|
450
468
|
transcript = await live_transcriber(
|
|
451
469
|
logger=LOGGER,
|
|
452
470
|
stop_event=stop_event,
|
|
@@ -456,6 +474,7 @@ async def _async_main( # noqa: PLR0912, PLR0915, C901
|
|
|
456
474
|
extra_instructions=extra_instructions,
|
|
457
475
|
recording_path_callback=_set_saved_recording_path,
|
|
458
476
|
audio_level_callback=audio_level_callback,
|
|
477
|
+
live_preview_config=live_preview_config,
|
|
459
478
|
)
|
|
460
479
|
|
|
461
480
|
elapsed = time.monotonic() - start_time
|
|
@@ -650,6 +669,10 @@ def transcribe( # noqa: PLR0912, PLR0911, PLR0915, C901
|
|
|
650
669
|
print_args: bool = opts.PRINT_ARGS,
|
|
651
670
|
transcription_log: Path | None = opts.TRANSCRIPTION_LOG,
|
|
652
671
|
voice_level_log: Path | None = opts.VOICE_LEVEL_LOG,
|
|
672
|
+
live_preview_log: Path | None = opts.LIVE_PREVIEW_LOG,
|
|
673
|
+
live_preview_interval: float = opts.LIVE_PREVIEW_INTERVAL,
|
|
674
|
+
live_preview_window: float = opts.LIVE_PREVIEW_WINDOW,
|
|
675
|
+
live_preview_console: bool = opts.LIVE_PREVIEW_CONSOLE,
|
|
653
676
|
# --- Diarization Options ---
|
|
654
677
|
diarize: bool = opts.DIARIZE,
|
|
655
678
|
diarize_format: opts.DiarizeFormat = opts.DIARIZE_FORMAT,
|
|
@@ -697,18 +720,24 @@ def transcribe( # noqa: PLR0912, PLR0911, PLR0915, C901
|
|
|
697
720
|
|
|
698
721
|
setup_logging(log_level, log_file, quiet=effective_quiet)
|
|
699
722
|
|
|
723
|
+
enroll_speakers = _option_default(enroll_speakers)
|
|
724
|
+
identify_speakers = _option_default(identify_speakers)
|
|
725
|
+
remember_unknown_speakers = _option_default(remember_unknown_speakers)
|
|
726
|
+
speaker_profiles_file = _option_default(speaker_profiles_file)
|
|
727
|
+
speaker_match_threshold = _option_default(speaker_match_threshold)
|
|
728
|
+
live_preview_log = _option_default(live_preview_log)
|
|
729
|
+
live_preview_interval = _option_default(live_preview_interval)
|
|
730
|
+
live_preview_window = _option_default(live_preview_window)
|
|
731
|
+
live_preview_console = _option_default(live_preview_console)
|
|
732
|
+
|
|
700
733
|
# Expand user path for transcription log
|
|
701
734
|
if transcription_log:
|
|
702
735
|
transcription_log = transcription_log.expanduser()
|
|
703
736
|
voice_level_log = _option_default(voice_level_log)
|
|
704
737
|
if voice_level_log:
|
|
705
738
|
voice_level_log = voice_level_log.expanduser()
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
identify_speakers = _option_default(identify_speakers)
|
|
709
|
-
remember_unknown_speakers = _option_default(remember_unknown_speakers)
|
|
710
|
-
speaker_profiles_file = _option_default(speaker_profiles_file)
|
|
711
|
-
speaker_match_threshold = _option_default(speaker_match_threshold)
|
|
739
|
+
if live_preview_log:
|
|
740
|
+
live_preview_log = live_preview_log.expanduser()
|
|
712
741
|
|
|
713
742
|
# Validate diarization options
|
|
714
743
|
if not diarize and (enroll_speakers or remember_unknown_speakers):
|
|
@@ -850,6 +879,10 @@ def transcribe( # noqa: PLR0912, PLR0911, PLR0915, C901
|
|
|
850
879
|
diarization_cfg=diarization_cfg,
|
|
851
880
|
emit_output=not json_output,
|
|
852
881
|
raise_diarization_errors=diarize,
|
|
882
|
+
live_preview_log=live_preview_log,
|
|
883
|
+
live_preview_interval=live_preview_interval,
|
|
884
|
+
live_preview_window=live_preview_window,
|
|
885
|
+
live_preview_console=live_preview_console,
|
|
853
886
|
),
|
|
854
887
|
)
|
|
855
888
|
except ImportError as exc:
|
|
@@ -942,6 +975,10 @@ def transcribe( # noqa: PLR0912, PLR0911, PLR0915, C901
|
|
|
942
975
|
audio_level_callback=audio_level_writer.write_chunk
|
|
943
976
|
if audio_level_writer
|
|
944
977
|
else None,
|
|
978
|
+
live_preview_log=live_preview_log,
|
|
979
|
+
live_preview_interval=live_preview_interval,
|
|
980
|
+
live_preview_window=live_preview_window,
|
|
981
|
+
live_preview_console=live_preview_console,
|
|
945
982
|
),
|
|
946
983
|
)
|
|
947
984
|
except ImportError as exc:
|
|
@@ -618,11 +618,13 @@ def new(
|
|
|
618
618
|
summary_lines.append(
|
|
619
619
|
f"[bold]Agent Handle:[/bold] {agent_handle.handle} ({agent_handle.terminal_name})",
|
|
620
620
|
)
|
|
621
|
-
if agent_handle.session_name:
|
|
621
|
+
if agent_handle.session_name and agent_handle.terminal_name == "tmux":
|
|
622
622
|
summary_lines.append(f"[bold]tmux Session:[/bold] {agent_handle.session_name}")
|
|
623
623
|
summary_lines.append(
|
|
624
624
|
f"[bold]Attach:[/bold] tmux attach -t {shlex.quote(agent_handle.session_name)}",
|
|
625
625
|
)
|
|
626
|
+
elif agent_handle.session_name and agent_handle.terminal_name == "cmux":
|
|
627
|
+
summary_lines.append(f"[bold]cmux Workspace:[/bold] {agent_handle.session_name}")
|
|
626
628
|
|
|
627
629
|
console.print()
|
|
628
630
|
console.print(
|
|
@@ -1146,7 +1148,7 @@ def start_agent(
|
|
|
1146
1148
|
f"{handle.terminal_name} handle: {handle.handle}"
|
|
1147
1149
|
+ (
|
|
1148
1150
|
f" (attach with: tmux attach -t {shlex.quote(handle.session_name)})"
|
|
1149
|
-
if handle.session_name
|
|
1151
|
+
if handle.session_name and handle.terminal_name == "tmux"
|
|
1150
1152
|
else ""
|
|
1151
1153
|
),
|
|
1152
1154
|
)
|
|
@@ -1280,7 +1282,7 @@ def list_terminals_cmd(
|
|
|
1280
1282
|
) -> None:
|
|
1281
1283
|
"""List available terminal multiplexers and their status.
|
|
1282
1284
|
|
|
1283
|
-
Shows supported terminals: tmux, zellij, kitty, iTerm2, Terminal.app,
|
|
1285
|
+
Shows supported terminals: tmux, zellij, cmux, kitty, iTerm2, Terminal.app,
|
|
1284
1286
|
Warp, GNOME Terminal.
|
|
1285
1287
|
|
|
1286
1288
|
These are used to open new tabs when launching AI agents with `dev new --start-agent`.
|
|
@@ -321,6 +321,36 @@ def _launch_in_tmux(
|
|
|
321
321
|
return handle
|
|
322
322
|
|
|
323
323
|
|
|
324
|
+
def _launch_in_cmux(
|
|
325
|
+
path: Path,
|
|
326
|
+
agent: CodingAgent,
|
|
327
|
+
terminal: terminals.Terminal,
|
|
328
|
+
full_cmd: str,
|
|
329
|
+
tab_name: str,
|
|
330
|
+
repo_root: Path | None,
|
|
331
|
+
) -> TerminalHandle | None:
|
|
332
|
+
"""Launch an agent in a cmux tab inside a workspace named after the repo."""
|
|
333
|
+
from .terminals.cmux import Cmux # noqa: PLC0415
|
|
334
|
+
|
|
335
|
+
if not isinstance(terminal, Cmux):
|
|
336
|
+
warn("Could not open new tab in cmux")
|
|
337
|
+
return None
|
|
338
|
+
|
|
339
|
+
workspace_name = (repo_root or path).name
|
|
340
|
+
handle = terminal.open_in_workspace(
|
|
341
|
+
path,
|
|
342
|
+
full_cmd,
|
|
343
|
+
tab_name=tab_name,
|
|
344
|
+
workspace_name=workspace_name,
|
|
345
|
+
)
|
|
346
|
+
if handle is None:
|
|
347
|
+
warn("Could not open new tab in cmux")
|
|
348
|
+
return None
|
|
349
|
+
|
|
350
|
+
success(f"Started {agent.name} in cmux workspace {workspace_name!r}")
|
|
351
|
+
return handle
|
|
352
|
+
|
|
353
|
+
|
|
324
354
|
def _launch_in_terminal(
|
|
325
355
|
path: Path,
|
|
326
356
|
agent: CodingAgent,
|
|
@@ -332,6 +362,10 @@ def _launch_in_terminal(
|
|
|
332
362
|
tmux_session: str | None,
|
|
333
363
|
) -> tuple[bool, TerminalHandle | None]:
|
|
334
364
|
"""Launch an agent in the resolved terminal."""
|
|
365
|
+
if terminal.name == "cmux":
|
|
366
|
+
handle = _launch_in_cmux(path, agent, terminal, full_cmd, tab_name, repo_root)
|
|
367
|
+
return handle is not None, handle
|
|
368
|
+
|
|
335
369
|
if terminal.name == "tmux":
|
|
336
370
|
handle = _launch_in_tmux(
|
|
337
371
|
path,
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
"""cmux terminal adapter.
|
|
2
|
+
|
|
3
|
+
cmux (https://cmux.dev) is a Ghostty-based macOS terminal organized as
|
|
4
|
+
windows > workspaces > panes > surfaces (tabs), controlled via a Unix
|
|
5
|
+
socket through the bundled ``cmux`` CLI.
|
|
6
|
+
|
|
7
|
+
agent-cli maps repos to workspaces: each repo gets a workspace named after
|
|
8
|
+
it, and each worktree launch opens a new tab inside that workspace.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import hashlib
|
|
14
|
+
import json
|
|
15
|
+
import os
|
|
16
|
+
import shlex
|
|
17
|
+
import shutil
|
|
18
|
+
import subprocess
|
|
19
|
+
from typing import TYPE_CHECKING
|
|
20
|
+
|
|
21
|
+
from agent_cli.dev.worktree import get_main_repo_root
|
|
22
|
+
|
|
23
|
+
from .base import Terminal, TerminalHandle
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
|
|
28
|
+
# Named colors accepted by `cmux workspace-action --action set-color`.
|
|
29
|
+
_WORKSPACE_COLORS = (
|
|
30
|
+
"Red",
|
|
31
|
+
"Crimson",
|
|
32
|
+
"Orange",
|
|
33
|
+
"Amber",
|
|
34
|
+
"Olive",
|
|
35
|
+
"Green",
|
|
36
|
+
"Teal",
|
|
37
|
+
"Aqua",
|
|
38
|
+
"Blue",
|
|
39
|
+
"Navy",
|
|
40
|
+
"Indigo",
|
|
41
|
+
"Purple",
|
|
42
|
+
"Magenta",
|
|
43
|
+
"Rose",
|
|
44
|
+
"Brown",
|
|
45
|
+
"Charcoal",
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class Cmux(Terminal):
|
|
50
|
+
"""cmux - Ghostty-based terminal with workspaces for AI coding agents."""
|
|
51
|
+
|
|
52
|
+
name = "cmux"
|
|
53
|
+
|
|
54
|
+
def detect(self) -> bool:
|
|
55
|
+
"""Detect if running inside cmux via its auto-set environment variables."""
|
|
56
|
+
return bool(
|
|
57
|
+
os.environ.get("CMUX_WORKSPACE_ID") or os.environ.get("CMUX_SURFACE_ID"),
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
def is_available(self) -> bool:
|
|
61
|
+
"""Check if the cmux CLI is available."""
|
|
62
|
+
return shutil.which("cmux") is not None
|
|
63
|
+
|
|
64
|
+
def open_new_tab(
|
|
65
|
+
self,
|
|
66
|
+
path: Path,
|
|
67
|
+
command: str | None = None,
|
|
68
|
+
tab_name: str | None = None,
|
|
69
|
+
) -> bool:
|
|
70
|
+
"""Open a new tab in a workspace named after the repo containing ``path``."""
|
|
71
|
+
repo_root = get_main_repo_root(path)
|
|
72
|
+
workspace_name = (repo_root or path).name
|
|
73
|
+
handle = self.open_in_workspace(path, command, tab_name, workspace_name=workspace_name)
|
|
74
|
+
return handle is not None
|
|
75
|
+
|
|
76
|
+
def open_in_workspace(
|
|
77
|
+
self,
|
|
78
|
+
path: Path,
|
|
79
|
+
command: str | None = None,
|
|
80
|
+
tab_name: str | None = None,
|
|
81
|
+
*,
|
|
82
|
+
workspace_name: str,
|
|
83
|
+
) -> TerminalHandle | None:
|
|
84
|
+
"""Open a tab in the named cmux workspace, creating the workspace if needed.
|
|
85
|
+
|
|
86
|
+
Workspace targets are always passed explicitly because the cmux CLI
|
|
87
|
+
otherwise defaults to the caller's workspace (``CMUX_WORKSPACE_ID``).
|
|
88
|
+
"""
|
|
89
|
+
if not self.is_available():
|
|
90
|
+
return None
|
|
91
|
+
workspaces = self._list_workspaces()
|
|
92
|
+
if workspaces is None:
|
|
93
|
+
# The cmux CLI itself failed (e.g. app not running); creating a
|
|
94
|
+
# workspace would fail too, or duplicate one we could not see.
|
|
95
|
+
return None
|
|
96
|
+
workspace_ref = next(
|
|
97
|
+
(w.get("ref") for w in workspaces if w.get("title") == workspace_name),
|
|
98
|
+
None,
|
|
99
|
+
)
|
|
100
|
+
if workspace_ref is None:
|
|
101
|
+
return self._create_workspace(path, command, tab_name, workspace_name=workspace_name)
|
|
102
|
+
return self._open_tab(
|
|
103
|
+
path,
|
|
104
|
+
command,
|
|
105
|
+
tab_name,
|
|
106
|
+
workspace_ref=workspace_ref,
|
|
107
|
+
workspace_name=workspace_name,
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
def _list_workspaces(self) -> list[dict] | None:
|
|
111
|
+
"""List workspace dicts via the cmux CLI, or None when the CLI call fails."""
|
|
112
|
+
stdout = self._run(["workspace", "list", "--json"])
|
|
113
|
+
if stdout is None:
|
|
114
|
+
return None
|
|
115
|
+
try:
|
|
116
|
+
data = json.loads(stdout)
|
|
117
|
+
except json.JSONDecodeError:
|
|
118
|
+
return None
|
|
119
|
+
workspaces = data.get("workspaces", [])
|
|
120
|
+
return workspaces if isinstance(workspaces, list) else None
|
|
121
|
+
|
|
122
|
+
def _create_workspace(
|
|
123
|
+
self,
|
|
124
|
+
path: Path,
|
|
125
|
+
command: str | None,
|
|
126
|
+
tab_name: str | None,
|
|
127
|
+
*,
|
|
128
|
+
workspace_name: str,
|
|
129
|
+
) -> TerminalHandle | None:
|
|
130
|
+
"""Create a workspace whose initial tab starts in ``path`` running ``command``."""
|
|
131
|
+
cmd = ["workspace", "create", "--name", workspace_name, "--cwd", str(path)]
|
|
132
|
+
if command:
|
|
133
|
+
cmd.extend(["--command", command])
|
|
134
|
+
workspace_ref = self._parse_ok_ref(self._run(cmd), "workspace:")
|
|
135
|
+
if workspace_ref is None:
|
|
136
|
+
return None
|
|
137
|
+
self._run(
|
|
138
|
+
[
|
|
139
|
+
"workspace-action",
|
|
140
|
+
"--action",
|
|
141
|
+
"set-color",
|
|
142
|
+
"--workspace",
|
|
143
|
+
workspace_ref,
|
|
144
|
+
"--color",
|
|
145
|
+
self._workspace_color(workspace_name),
|
|
146
|
+
],
|
|
147
|
+
)
|
|
148
|
+
if tab_name:
|
|
149
|
+
# The freshly created workspace has a single tab, which is its
|
|
150
|
+
# focused tab, so rename-tab needs no explicit surface target.
|
|
151
|
+
self._run(["rename-tab", "--workspace", workspace_ref, "--title", tab_name])
|
|
152
|
+
return TerminalHandle(
|
|
153
|
+
terminal_name=self.name,
|
|
154
|
+
handle=workspace_ref,
|
|
155
|
+
session_name=workspace_name,
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
def _open_tab(
|
|
159
|
+
self,
|
|
160
|
+
path: Path,
|
|
161
|
+
command: str | None,
|
|
162
|
+
tab_name: str | None,
|
|
163
|
+
*,
|
|
164
|
+
workspace_ref: str,
|
|
165
|
+
workspace_name: str,
|
|
166
|
+
) -> TerminalHandle | None:
|
|
167
|
+
"""Open a new tab in an existing workspace and run ``command`` in ``path``."""
|
|
168
|
+
surface_ref = self._parse_ok_ref(
|
|
169
|
+
self._run(["new-surface", "--workspace", workspace_ref]),
|
|
170
|
+
"surface:",
|
|
171
|
+
)
|
|
172
|
+
if surface_ref is None:
|
|
173
|
+
return None
|
|
174
|
+
if tab_name:
|
|
175
|
+
self._run(
|
|
176
|
+
[
|
|
177
|
+
"rename-tab",
|
|
178
|
+
"--workspace",
|
|
179
|
+
workspace_ref,
|
|
180
|
+
"--surface",
|
|
181
|
+
surface_ref,
|
|
182
|
+
"--title",
|
|
183
|
+
tab_name,
|
|
184
|
+
],
|
|
185
|
+
)
|
|
186
|
+
# New surfaces don't accept a cwd/command, so type it into the shell.
|
|
187
|
+
# The terminal buffers the input until the shell is ready, and cmux
|
|
188
|
+
# turns the literal \n escape sequence into Enter.
|
|
189
|
+
shell_cmd = f"cd {shlex.quote(str(path))}"
|
|
190
|
+
if command:
|
|
191
|
+
shell_cmd += f" && {command}"
|
|
192
|
+
sent = self._run(
|
|
193
|
+
[
|
|
194
|
+
"send",
|
|
195
|
+
"--workspace",
|
|
196
|
+
workspace_ref,
|
|
197
|
+
"--surface",
|
|
198
|
+
surface_ref,
|
|
199
|
+
"--",
|
|
200
|
+
shell_cmd + "\\n",
|
|
201
|
+
],
|
|
202
|
+
)
|
|
203
|
+
if sent is None:
|
|
204
|
+
# The command never reached the tab, so the agent is not running;
|
|
205
|
+
# remove the idle tab and report failure instead of a dead handle.
|
|
206
|
+
self._run(["close-surface", "--workspace", workspace_ref, "--surface", surface_ref])
|
|
207
|
+
return None
|
|
208
|
+
return TerminalHandle(
|
|
209
|
+
terminal_name=self.name,
|
|
210
|
+
handle=surface_ref,
|
|
211
|
+
session_name=workspace_name,
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
@staticmethod
|
|
215
|
+
def _workspace_color(workspace_name: str) -> str:
|
|
216
|
+
"""Pick a deterministic cmux named color for a workspace."""
|
|
217
|
+
digest = hashlib.sha256(workspace_name.encode()).hexdigest()
|
|
218
|
+
return _WORKSPACE_COLORS[int(digest[:8], 16) % len(_WORKSPACE_COLORS)]
|
|
219
|
+
|
|
220
|
+
@staticmethod
|
|
221
|
+
def _run(args: list[str]) -> str | None:
|
|
222
|
+
"""Run a cmux CLI command and return its stdout, or None on failure."""
|
|
223
|
+
env = {**os.environ, "CMUX_QUIET": "1"}
|
|
224
|
+
try:
|
|
225
|
+
result = subprocess.run(
|
|
226
|
+
["cmux", *args], # noqa: S607
|
|
227
|
+
check=True,
|
|
228
|
+
capture_output=True,
|
|
229
|
+
text=True,
|
|
230
|
+
env=env,
|
|
231
|
+
)
|
|
232
|
+
except (subprocess.CalledProcessError, OSError):
|
|
233
|
+
return None
|
|
234
|
+
return result.stdout
|
|
235
|
+
|
|
236
|
+
@staticmethod
|
|
237
|
+
def _parse_ok_ref(stdout: str | None, prefix: str) -> str | None:
|
|
238
|
+
"""Extract the first ``<prefix>N`` ref from an ``OK ...`` response line."""
|
|
239
|
+
if not stdout:
|
|
240
|
+
return None
|
|
241
|
+
for line in stdout.splitlines():
|
|
242
|
+
if not line.startswith("OK"):
|
|
243
|
+
continue
|
|
244
|
+
for token in line.split():
|
|
245
|
+
if token.startswith(prefix):
|
|
246
|
+
return token
|
|
247
|
+
return None
|
|
@@ -6,6 +6,7 @@ from agent_cli.dev.registry import Registry
|
|
|
6
6
|
|
|
7
7
|
from .apple_terminal import AppleTerminal
|
|
8
8
|
from .base import Terminal # noqa: TC001
|
|
9
|
+
from .cmux import Cmux
|
|
9
10
|
from .gnome import GnomeTerminal
|
|
10
11
|
from .iterm2 import ITerm2
|
|
11
12
|
from .kitty import Kitty
|
|
@@ -18,6 +19,7 @@ from .zellij import Zellij
|
|
|
18
19
|
_TERMINALS: list[type[Terminal]] = [
|
|
19
20
|
Tmux,
|
|
20
21
|
Zellij,
|
|
22
|
+
Cmux,
|
|
21
23
|
ITerm2,
|
|
22
24
|
Kitty,
|
|
23
25
|
Warp,
|
|
@@ -436,6 +436,31 @@ VOICE_LEVEL_LOG: Path | None = typer.Option(
|
|
|
436
436
|
hidden=True,
|
|
437
437
|
rich_help_panel="General Options",
|
|
438
438
|
)
|
|
439
|
+
LIVE_PREVIEW_LOG: Path | None = typer.Option(
|
|
440
|
+
None,
|
|
441
|
+
"--live-preview-log",
|
|
442
|
+
help="Write rolling live transcription preview events to JSONL while recording.",
|
|
443
|
+
rich_help_panel="Live Preview",
|
|
444
|
+
)
|
|
445
|
+
LIVE_PREVIEW_INTERVAL: float = typer.Option(
|
|
446
|
+
2.0,
|
|
447
|
+
"--live-preview-interval",
|
|
448
|
+
help="Seconds between live preview retranscriptions.",
|
|
449
|
+
rich_help_panel="Live Preview",
|
|
450
|
+
)
|
|
451
|
+
LIVE_PREVIEW_WINDOW: float = typer.Option(
|
|
452
|
+
15.0,
|
|
453
|
+
"--live-preview-window",
|
|
454
|
+
help="Seconds of recent audio to include in each live preview retranscription.",
|
|
455
|
+
rich_help_panel="Live Preview",
|
|
456
|
+
)
|
|
457
|
+
LIVE_PREVIEW_CONSOLE: bool = typer.Option(
|
|
458
|
+
False, # noqa: FBT003
|
|
459
|
+
"--live-preview-console",
|
|
460
|
+
"--live-preview-stdout",
|
|
461
|
+
help="Print rolling live transcription preview updates to the terminal while recording.",
|
|
462
|
+
rich_help_panel="Live Preview",
|
|
463
|
+
)
|
|
439
464
|
|
|
440
465
|
# --- Server Options ---
|
|
441
466
|
SERVER_HOST: str = typer.Option(
|