Voice call assistant for GitHub Copilot CLI - enables voice conversations between coding agents and users using Eleven Labs conversational AI.
- Voice Calls: Receive incoming call notifications from coding agents
- Call Queue: Manage multiple incoming calls when busy
- Call History: View past calls with transcripts and summaries
- Eleven Labs Integration: Natural voice conversations powered by Eleven Labs
- CLI Hooks Integration: Automatically intercept
ask_usercalls and offer voice alternative
- Node.js 18+
- Electron
- Eleven Labs API key with Conversational AI access
-
Install dependencies:
npm install
-
Create
.envfile from example:cp .env.example .env
-
Edit
.envwith your Eleven Labs credentials:ELEVEN_LABS_API_KEY=your_api_key ELEVEN_LABS_AGENT_ID=your_agent_id -
Run in development:
npm run dev
⚠️ Limitation: The hooks system is designed for permission control (allow/deny), not for replacing tool results with answers. When a hook deniesask_user, the agent sees it as a blocked action and may retry. For reliable voice call integration, use the built-invoice_calltool in Copilot CLI instead.
The hooks in this repository demonstrate how to intercept ask_user calls, but due to the limitation above, the recommended approach is to use the voice_call tool directly. The Copilot Tasks app provides the HTTP API that the voice_call tool communicates with.
-
Copy the hooks folder to your repository's
.github/hooks/directory:# From your repository root mkdir -p .github/hooks cp /path/to/copilot-tasks/hooks/voice-call-hook.json .github/hooks/ cp /path/to/copilot-tasks/hooks/voice-call.js .github/hooks/ -
Make the script executable:
chmod +x .github/hooks/voice-call.js
-
Commit the hooks to your repository's default branch:
git add .github/hooks/ git commit -m "Add voice call hook for Copilot CLI" git push
Note: Hooks must be present on the repository's default branch to be used by Copilot coding agent. For local CLI usage, hooks are loaded from your current working directory.
- When Copilot CLI's agent calls
ask_user, the hook intercepts it - If Copilot Tasks app is running, it triggers a voice call
- You can accept the call and answer via voice
- You can deny the call - falls back to normal text-based
ask_user - If the app isn't running, it falls back to normal
ask_user
When the voice call completes, the hook returns the answer as a "denial reason". However, the agent interprets this as a permission denial rather than a successful answer, which may cause it to retry the question. For production use, the voice_call tool provides proper integration.
Your Eleven Labs agent should be configured with a system prompt that uses these dynamic variables:
{call_context}- Context about the coding task{call_questions}- Questions to answer{response_format}- Instructions for formatting the summary
Example agent prompt:
You are a voice assistant helping gather information for a coding task.
Context:
{call_context}
Questions to answer:
{call_questions}
{response_format}
The app runs an HTTP server on localhost:19741 for communication with the CLI.
| Variable | Description |
|---|---|
ELEVEN_LABS_API_KEY |
Your Eleven Labs API key |
ELEVEN_LABS_AGENT_ID |
Your Eleven Labs Conversational AI agent ID |
| Endpoint | Method | Description |
|---|---|---|
/api/status |
GET | Health check and current status |
/api/call |
POST | Initiate a new voice call |
/api/queue |
GET | Get queued calls |
/api/history |
GET | Get call history |
Build installers for distribution:
# macOS
npm run build:installer:mac
# Windows
npm run build:installer:winMIT