{
  "properties": {
    "config": {
      "description": "Full or partial configuration object. Any missing fields use defaults. If both configUrl and config are set, configUrl takes precedence.",
      "properties": {
        "contentGuard": {
          "properties": {
            "enableLTBEEFDetection": {
              "description": "Enable LTBEEF exploit GUI detection (default: true)",
              "type": "boolean"
            },
            "enabled": {
              "description": "Enable content guard protection (default: true)",
              "type": "boolean"
            },
            "maxHistoryPushesPerSecond": {
              "description": "History pushState threshold per second before triggering flood detection (default: 50)",
              "type": "integer"
            }
          },
          "type": "object"
        },
        "domains": {
          "properties": {
            "additionalBlacklist": {
              "description": "Additional domains to block via dynamic rules",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "additionalWhitelist": {
              "description": "Additional domains to whitelist (added to built-in educational whitelist)",
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          "type": "object"
        },
        "googleSitesInspector": {
          "properties": {
            "enableBase64Detection": {
              "description": "Detect Base64-encoded game content in scripts (default: true)",
              "type": "boolean"
            },
            "enableBlobBlocking": {
              "description": "Block blob URL iframes on Google Sites (default: true)",
              "type": "boolean"
            },
            "enableGameDetection": {
              "description": "Detect and block game engine signatures in iframes (default: true)",
              "type": "boolean"
            },
            "enableWorkerDetection": {
              "description": "Detect Cloudflare Worker proxy iframes (default: true)",
              "type": "boolean"
            },
            "minSuspiciousFrameSize": {
              "description": "Minimum iframe pixel size to be considered suspicious (default: 400)",
              "type": "integer"
            },
            "scanInterval": {
              "description": "Iframe scan interval in ms (default: 2000)",
              "type": "integer"
            }
          },
          "type": "object"
        },
        "heartbeat": {
          "properties": {
            "enabled": {
              "description": "Enable heartbeat monitoring (default: true)",
              "type": "boolean"
            },
            "interval": {
              "description": "Heartbeat check interval in ms (default: 5000)",
              "type": "integer"
            }
          },
          "type": "object"
        },
        "rules": {
          "description": "Toggle individual blocking rules by ID. Keys are rule IDs (e.g. '1002'). Each value is an object with an 'enabled' boolean.",
          "patternProperties": {
            "^[0-9]+$": {
              "properties": {
                "enabled": {
                  "type": "boolean"
                }
              },
              "type": "object"
            }
          },
          "type": "object"
        },
        "tabLimits": {
          "properties": {
            "maxTabs": {
              "description": "Maximum total tabs allowed (default: 15)",
              "type": "integer"
            },
            "maxTabsInWindow": {
              "description": "Max tabs created within the time window before triggering spam detection (default: 5)",
              "type": "integer"
            },
            "tabCreationWindow": {
              "description": "Time window in ms for spam detection (default: 2000)",
              "type": "integer"
            }
          },
          "type": "object"
        },
        "version": {
          "description": "Schema version number",
          "type": "integer"
        }
      },
      "title": "Inline Configuration",
      "type": "object"
    },
    "configUrl": {
      "description": "URL to a hosted JSON configuration file. The extension will fetch this on startup and periodically refresh it.",
      "title": "Configuration URL",
      "type": "string"
    }
  },
  "type": "object"
}