{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "$schema": {
      "default": "https://raw.githubusercontent.com/nikbrunner/pi-speak/main/src/config/v1/schema.json",
      "type": "string",
      "format": "uri"
    },
    "version": {
      "default": 1,
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "shortcut": {
      "default": "alt+r",
      "type": "string",
      "description": "Keyboard shortcut for replay/stop"
    },
    "readback": {
      "default": {},
      "type": "object",
      "properties": {
        "voiceId": {
          "default": "Sierra",
          "type": "string",
          "enum": [
            "Autumn",
            "Melody",
            "Hannah",
            "Emily",
            "Ivy",
            "Kaitlyn",
            "Luna",
            "Willow",
            "Lauren",
            "Sierra",
            "Noah",
            "Jasper",
            "Caleb",
            "Ronan",
            "Ethan",
            "Daniel",
            "Zane",
            "Mei",
            "Lian",
            "Ting",
            "Jing",
            "Wei",
            "Jian",
            "Hao",
            "Sheng",
            "Lucía",
            "Mateo",
            "Javier",
            "Élodie",
            "Ananya",
            "Priya",
            "Arjun",
            "Rohan",
            "Giulia",
            "Luca",
            "Camila",
            "Thiago",
            "Rafael"
          ],
          "description": "Unreal Speech voice name"
        },
        "bitrate": {
          "default": "192k",
          "type": "string",
          "enum": [
            "16k",
            "32k",
            "48k",
            "64k",
            "128k",
            "192k",
            "256k",
            "320k"
          ],
          "description": "Audio bitrate — lower saves bandwidth, higher improves fidelity"
        },
        "speed": {
          "default": 0,
          "type": "number",
          "minimum": -1,
          "maximum": 1,
          "description": "Speech speed adjustment (-1 to 1)"
        },
        "pitch": {
          "default": 1,
          "type": "number",
          "minimum": 0.5,
          "maximum": 1.5,
          "description": "Speech pitch adjustment (0.5 to 1.5)"
        },
        "maxChunkChars": {
          "default": 900,
          "type": "integer",
          "minimum": 1,
          "maximum": 1000,
          "description": "Max characters per TTS chunk (Unreal Speech limit is 1000)"
        }
      }
    },
    "summarizer": {
      "default": {},
      "type": "object",
      "properties": {
        "enabled": {
          "default": true,
          "type": "boolean",
          "description": "Use LLM to summarize agent output for voice notification"
        },
        "model": {
          "default": "google/gemini-2.5-flash-lite",
          "type": "string",
          "description": "OpenRouter model ID for summarization"
        },
        "maxTokens": {
          "default": 150,
          "type": "integer",
          "minimum": 1,
          "maximum": 500,
          "description": "Max tokens for summarizer response"
        },
        "timeoutMs": {
          "default": 5000,
          "type": "integer",
          "minimum": 1000,
          "maximum": 60000,
          "description": "Summarizer request timeout in milliseconds"
        },
        "prompt": {
          "default": "You caveman voice assistant. Summarize what code-agent did. Few word, max 2 sentence. Say session name if given. Be specific — what changed, what fixed, what built. No filler. No fluff. Grunt truth only.",
          "type": "string",
          "description": "System prompt for the summarizer LLM"
        },
        "fallbackText": {
          "default": "Work done. Code better now.",
          "type": "string",
          "description": "Fallback text when summarizer is disabled or fails"
        }
      }
    },
    "greeting": {
      "default": {},
      "type": "object",
      "properties": {
        "enabled": {
          "default": false,
          "type": "boolean",
          "description": "Speak a greeting on session start"
        },
        "prompt": {
          "default": "You caveman voice assistant. Developer start new code session. Greet them — short, fun, one sentence. Say session name if given. Vary tone: sometimes wise elder, sometimes excited cave-friend, sometimes deadpan. Never generic. Never boring.",
          "type": "string",
          "description": "LLM prompt for generating a greeting on startup or new session"
        },
        "resumePrompt": {
          "default": "You caveman voice assistant. Developer come back to session they leave earlier. Welcome back — short, fun, one sentence. Say session name if given. Like friend who guard fire while they gone. Never generic.",
          "type": "string",
          "description": "LLM prompt for generating a greeting when resuming an existing session"
        }
      }
    },
    "debug": {
      "default": {},
      "type": "object",
      "properties": {
        "enabled": {
          "default": true,
          "type": "boolean",
          "description": "Enable debug logging to file"
        },
        "logPath": {
          "default": "~/.pi-speak-debug.log",
          "type": "string",
          "description": "Path to the debug log file"
        },
        "logMaxBytes": {
          "default": 2097152,
          "type": "integer",
          "minimum": 1024,
          "maximum": 10485760,
          "description": "Max log file size in bytes before rotation"
        }
      }
    },
    "api": {
      "default": {},
      "type": "object",
      "properties": {
        "unrealSpeechKey": {
          "default": null,
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Unreal Speech API key (env var takes precedence)"
        },
        "openRouterKey": {
          "default": null,
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "OpenRouter API key (env var takes precedence)"
        }
      }
    }
  }
}
