{
  "id": "google-meet",
  "name": "Google Meet",
  "description": "Join Google Meet calls through Chrome or Twilio transports.",
  "enabledByDefault": false,
  "commandAliases": [{ "name": "googlemeet" }],
  "activation": {
    "onStartup": true,
    "onCommands": ["googlemeet"],
    "onCapabilities": ["tool"]
  },
  "contracts": {
    "tools": ["google_meet"]
  },
  "uiHints": {
    "defaults.meeting": {
      "label": "Default Meeting",
      "help": "Meet URL, meeting code, or spaces/{id} used when commands omit a meeting."
    },
    "preview.enrollmentAcknowledged": {
      "label": "Preview Acknowledged",
      "help": "Confirms you understand the Google Meet Media API is still Developer Preview.",
      "advanced": true
    },
    "defaultTransport": {
      "label": "Default Transport",
      "help": "Chrome uses a signed-in browser profile. Chrome-node runs Chrome on a paired node. Twilio uses Meet dial-in numbers."
    },
    "defaultMode": {
      "label": "Default Mode",
      "help": "Realtime voice is the default."
    },
    "chrome.audioBackend": {
      "label": "Chrome Audio Backend",
      "help": "BlackHole 2ch is required for local duplex audio routing."
    },
    "chrome.launch": {
      "label": "Launch Chrome"
    },
    "chrome.browserProfile": {
      "label": "Chrome Profile",
      "advanced": true
    },
    "chrome.guestName": {
      "label": "Guest Name",
      "help": "Used when Chrome lands on the signed-out Meet guest-name screen."
    },
    "chrome.reuseExistingTab": {
      "label": "Reuse Existing Meet Tab",
      "help": "Avoids opening duplicate tabs for the same Meet URL."
    },
    "chrome.autoJoin": {
      "label": "Auto Join Guest Screen",
      "help": "Best-effort guest-name fill and Join Now click through OpenClaw browser automation."
    },
    "chrome.waitForInCallMs": {
      "label": "Wait For In-Call (ms)",
      "help": "Waits for Chrome to report that the Meet tab is in-call before the realtime intro speaks.",
      "advanced": true
    },
    "chrome.audioInputCommand": {
      "label": "Audio Input Command",
      "help": "Command that writes meeting audio to stdout in chrome.audioFormat.",
      "advanced": true
    },
    "chrome.audioOutputCommand": {
      "label": "Audio Output Command",
      "help": "Command that reads assistant audio from stdin in chrome.audioFormat.",
      "advanced": true
    },
    "chrome.bargeInInputCommand": {
      "label": "Barge-In Input Command",
      "help": "Optional Gateway-hosted microphone command that writes signed 16-bit little-endian mono PCM for human interruption detection while assistant playback is active.",
      "advanced": true
    },
    "chrome.bargeInRmsThreshold": {
      "label": "Barge-In RMS Threshold",
      "help": "RMS level on chrome.bargeInInputCommand that counts as a human interruption.",
      "advanced": true
    },
    "chrome.bargeInPeakThreshold": {
      "label": "Barge-In Peak Threshold",
      "help": "Peak level on chrome.bargeInInputCommand that counts as a human interruption.",
      "advanced": true
    },
    "chrome.bargeInCooldownMs": {
      "label": "Barge-In Cooldown (ms)",
      "help": "Minimum delay between repeated barge-in clears.",
      "advanced": true
    },
    "chrome.audioFormat": {
      "label": "Audio Format",
      "help": "Command-pair audio format. PCM16 24 kHz is the default Chrome/Meet path; G.711 mu-law 8 kHz remains available for legacy command pairs.",
      "advanced": true
    },
    "chrome.audioBridgeCommand": {
      "label": "Audio Bridge Command",
      "advanced": true
    },
    "chrome.audioBridgeHealthCommand": {
      "label": "Audio Bridge Health Command",
      "advanced": true
    },
    "chromeNode.node": {
      "label": "Chrome Node",
      "help": "Node id/name/IP that owns Chrome, BlackHole, and SoX for chrome-node transport.",
      "advanced": true
    },
    "twilio.defaultDialInNumber": {
      "label": "Default Dial-In Number",
      "placeholder": "+15551234567"
    },
    "twilio.defaultPin": {
      "label": "Default PIN",
      "advanced": true
    },
    "twilio.defaultDtmfSequence": {
      "label": "Default DTMF Sequence",
      "advanced": true
    },
    "voiceCall.enabled": {
      "label": "Delegate To Voice Call"
    },
    "voiceCall.gatewayUrl": {
      "label": "Voice Call Gateway URL",
      "advanced": true
    },
    "voiceCall.token": {
      "label": "Voice Call Gateway Token",
      "sensitive": true,
      "advanced": true
    },
    "voiceCall.requestTimeoutMs": {
      "label": "Voice Call Request Timeout (ms)",
      "advanced": true
    },
    "voiceCall.dtmfDelayMs": {
      "label": "Legacy DTMF Delay (ms)",
      "help": "Compatibility setting from the old post-connect DTMF flow. Twilio Meet joins now play DTMF before realtime connect.",
      "advanced": true
    },
    "voiceCall.introMessage": {
      "label": "Voice Call Intro Message",
      "advanced": true
    },
    "realtime.provider": {
      "label": "Realtime Provider",
      "help": "Defaults to OpenAI; uses OPENAI_API_KEY when no provider config is set."
    },
    "realtime.model": {
      "label": "Realtime Model",
      "advanced": true
    },
    "realtime.instructions": {
      "label": "Realtime Instructions",
      "advanced": true
    },
    "realtime.introMessage": {
      "label": "Realtime Intro Message",
      "help": "Spoken once when the realtime bridge is ready. Set to an empty string to join silently."
    },
    "realtime.agentId": {
      "label": "Realtime Consult Agent",
      "help": "OpenClaw agent id used by openclaw_agent_consult. Defaults to \"main\".",
      "advanced": true
    },
    "realtime.toolPolicy": {
      "label": "Realtime Tool Policy",
      "help": "Safe read-only tools are available by default; owner requests can unlock broader tools.",
      "advanced": true
    },
    "oauth.clientId": {
      "label": "OAuth Client ID"
    },
    "oauth.clientSecret": {
      "label": "OAuth Client Secret",
      "sensitive": true
    },
    "oauth.refreshToken": {
      "label": "OAuth Refresh Token",
      "sensitive": true
    },
    "oauth.accessToken": {
      "label": "Cached Access Token",
      "sensitive": true,
      "advanced": true
    },
    "oauth.expiresAt": {
      "label": "Cached Access Token Expiry",
      "help": "Unix epoch milliseconds used only for the cached access-token fast path.",
      "advanced": true
    }
  },
  "configSchema": {
    "type": "object",
    "additionalProperties": false,
    "properties": {
      "enabled": {
        "type": "boolean"
      },
      "defaults": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "meeting": {
            "type": "string"
          }
        }
      },
      "preview": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "enrollmentAcknowledged": {
            "type": "boolean"
          }
        }
      },
      "defaultTransport": {
        "type": "string",
        "enum": ["chrome", "chrome-node", "twilio"],
        "default": "chrome"
      },
      "defaultMode": {
        "type": "string",
        "enum": ["realtime", "transcribe"],
        "default": "realtime"
      },
      "chrome": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "audioBackend": {
            "type": "string",
            "enum": ["blackhole-2ch"],
            "default": "blackhole-2ch"
          },
          "launch": {
            "type": "boolean",
            "default": true
          },
          "browserProfile": {
            "type": "string"
          },
          "guestName": {
            "type": "string",
            "default": "OpenClaw Agent"
          },
          "reuseExistingTab": {
            "type": "boolean",
            "default": true
          },
          "autoJoin": {
            "type": "boolean",
            "default": true
          },
          "joinTimeoutMs": {
            "type": "number",
            "default": 30000
          },
          "waitForInCallMs": {
            "type": "number",
            "default": 20000
          },
          "audioFormat": {
            "type": "string",
            "enum": ["pcm16-24khz", "g711-ulaw-8khz"],
            "default": "pcm16-24khz"
          },
          "audioInputCommand": {
            "type": "array",
            "default": [
              "sox",
              "-q",
              "-t",
              "coreaudio",
              "BlackHole 2ch",
              "-t",
              "raw",
              "-r",
              "24000",
              "-c",
              "1",
              "-e",
              "signed-integer",
              "-b",
              "16",
              "-L",
              "-"
            ],
            "items": {
              "type": "string"
            }
          },
          "audioOutputCommand": {
            "type": "array",
            "default": [
              "sox",
              "-q",
              "-t",
              "raw",
              "-r",
              "24000",
              "-c",
              "1",
              "-e",
              "signed-integer",
              "-b",
              "16",
              "-L",
              "-",
              "-t",
              "coreaudio",
              "BlackHole 2ch"
            ],
            "items": {
              "type": "string"
            }
          },
          "bargeInInputCommand": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "bargeInRmsThreshold": {
            "type": "number",
            "default": 650
          },
          "bargeInPeakThreshold": {
            "type": "number",
            "default": 2500
          },
          "bargeInCooldownMs": {
            "type": "number",
            "default": 900
          },
          "audioBridgeCommand": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "audioBridgeHealthCommand": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "chromeNode": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "node": {
            "type": "string"
          }
        }
      },
      "twilio": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "defaultDialInNumber": {
            "type": "string"
          },
          "defaultPin": {
            "type": "string"
          },
          "defaultDtmfSequence": {
            "type": "string"
          }
        }
      },
      "voiceCall": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "enabled": {
            "type": "boolean",
            "default": true
          },
          "gatewayUrl": {
            "type": "string"
          },
          "token": {
            "type": "string"
          },
          "requestTimeoutMs": {
            "type": "number",
            "default": 30000
          },
          "dtmfDelayMs": {
            "type": "number",
            "default": 2500
          },
          "introMessage": {
            "type": "string"
          }
        }
      },
      "realtime": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "provider": {
            "type": "string",
            "default": "openai"
          },
          "model": {
            "type": "string"
          },
          "instructions": {
            "type": "string",
            "default": "You are joining a private Google Meet as an OpenClaw agent. Keep spoken replies brief and natural. When a question needs deeper reasoning, current information, or tools, call openclaw_agent_consult before answering."
          },
          "introMessage": {
            "type": "string",
            "default": "Say exactly: I'm here and listening."
          },
          "agentId": {
            "type": "string",
            "description": "OpenClaw agent id used by openclaw_agent_consult. Defaults to \"main\"."
          },
          "toolPolicy": {
            "type": "string",
            "enum": ["safe-read-only", "owner", "none"],
            "default": "safe-read-only"
          },
          "providers": {
            "type": "object",
            "additionalProperties": {
              "type": "object",
              "additionalProperties": true
            }
          }
        }
      },
      "oauth": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "clientId": {
            "type": "string"
          },
          "clientSecret": {
            "type": "string"
          },
          "refreshToken": {
            "type": "string"
          },
          "accessToken": {
            "type": "string"
          },
          "expiresAt": {
            "type": "number"
          }
        }
      },
      "auth": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "provider": {
            "type": "string",
            "enum": ["google-oauth"]
          },
          "clientId": {
            "type": "string"
          },
          "clientSecret": {
            "type": "string"
          },
          "tokenPath": {
            "type": "string"
          }
        }
      }
    }
  }
}
