{
  "contract_version": 1,
  "manifest": {
    "schema_version": 1,
    "protocol_version": 1,
    "maximum_bytes": 65536,
    "namespace_pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*/[a-z][a-z0-9]*(?:-[a-z0-9]+)*$",
    "semantic_version_pattern": "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(?:-((?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$",
    "allowed_fields": [
      "schema_version",
      "protocol_version",
      "namespace",
      "version",
      "name",
      "description",
      "entrypoint",
      "capabilities",
      "properties"
    ],
    "maximum_capabilities": 32,
    "maximum_properties": 64,
    "property_types": [
      "boolean",
      "color",
      "image",
      "number",
      "select",
      "text",
      "textarea",
      "url"
    ],
    "property_value_maximum_bytes": {
      "boolean": null,
      "color": 9,
      "image": 2048,
      "number": null,
      "select": 500,
      "text": 500,
      "textarea": 4096,
      "url": 2048
    },
    "maximum_settings_bytes": 16384
  },
  "artifact": {
    "format": "zip",
    "maximum_compressed_bytes": 5242880,
    "maximum_expanded_bytes": 20971520,
    "maximum_file_bytes": 5242880,
    "maximum_files": 200,
    "maximum_compression_ratio": 100,
    "allowed_extensions": [
      "avif",
      "css",
      "gif",
      "html",
      "jpeg",
      "jpg",
      "js",
      "mjs",
      "png",
      "webp",
      "woff",
      "woff2"
    ],
    "html_file_count": 1,
    "javascript": "external-local-modules-only",
    "remote_resources": false,
    "symlinks": false,
    "canonical_path": "extensions/{namespace}/{version}/bundle.zip"
  },
  "runtime": {
    "global": "window.BRT",
    "request_timeout_milliseconds": 10000,
    "initialization_timeout_milliseconds": 10000,
    "maximum_pending_requests": 64,
    "maximum_message_bytes": 65536,
    "maximum_payload_depth": 12,
    "maximum_payload_nodes": 2000,
    "maximum_collection_entries": 500,
    "maximum_object_entries": 200,
    "network_access": false,
    "application_session_access": false,
    "parent_dom_access": false,
    "storage_access": false
  },
  "capabilities": {
    "analytics.events.write": {
      "risk": "low",
      "api": "BRT.analytics.track(event, properties)",
      "actions": ["track"],
      "request": {
        "event": "non-empty string, maximum 120 characters",
        "properties.label": "optional string, maximum 160 characters",
        "properties.value": "optional finite number"
      },
      "response": {"tracked": "boolean"}
    },
    "booking.availability.read": {
      "risk": "low",
      "api": "BRT.booking.availability(query)",
      "actions": ["list"],
      "request": {
        "laneId": "positive integer",
        "date": "YYYY-MM-DD",
        "durationMinutes": "integer from 5 through 720"
      },
      "response": "public BRT range-availability response"
    },
    "booking.create": {
      "risk": "medium",
      "api": "BRT.booking.start(details)",
      "actions": ["start"],
      "request": {
        "laneId": "optional positive integer",
        "startsAt": "optional string, maximum 40 characters",
        "endsAt": "optional string, maximum 40 characters"
      },
      "response": {"opened": true, "url": "string"}
    },
    "cart.manage": {
      "risk": "medium",
      "api": "BRT.cart.manage(action, details)",
      "actions": ["add", "remove", "update"],
      "request": {
        "productId": "positive integer",
        "quantity": "optional integer from 1 through 999; defaults to 1"
      },
      "response": {"ok": "boolean", "itemCount": "number", "total": "string"}
    },
    "catalog.products.read": {
      "risk": "low",
      "api": "BRT.catalog.products(query)",
      "actions": ["list"],
      "request": {
        "search": "optional string, maximum 200 characters",
        "page": "optional integer from 1 through 1000; defaults to 1",
        "limit": "12 or 24; defaults to 12",
        "includeOutOfStock": "optional boolean; defaults to true"
      },
      "response": {
        "products": [{"id": "integer", "name": "string", "url": "string", "image": "string", "price": "string", "inStock": "boolean"}],
        "total": "number",
        "page": "number",
        "lastPage": "number"
      }
    },
    "communications.sms.open": {
      "risk": "low",
      "api": "BRT.communications.text(message)",
      "actions": ["open"],
      "request": {"message": "optional string, maximum 500 characters"},
      "response": {"opened": true}
    },
    "forms.submit": {
      "risk": "medium",
      "api": "BRT.forms.submit(form, fields)",
      "actions": ["submit"],
      "request": {
        "form": ["contact", "newsletter"],
        "newsletter_fields": {"email": "string, maximum 255 characters"},
        "contact_fields": {
          "questionType": "optional integer from 1 through 9; defaults to 9",
          "name": "string, maximum 255 characters",
          "email": "string, maximum 255 characters",
          "phone": "string, maximum 50 characters",
          "subject": "string, maximum 255 characters",
          "message": "string, maximum 5000 characters"
        }
      },
      "response": {"ok": "boolean"}
    },
    "site.theme.read": {
      "risk": "low",
      "api": "BRT.theme.read()",
      "actions": ["read"],
      "request": {},
      "response": {
        "primary": "string",
        "secondary": "string",
        "background": "string",
        "surface": "string",
        "text": "string",
        "mutedText": "string",
        "link": "string",
        "button": "string",
        "headingFont": "string",
        "bodyFont": "string",
        "sectionGap": "string",
        "buttonRadius": "string"
      }
    },
    "waivers.start": {
      "risk": "medium",
      "api": "BRT.waivers.start(waiver)",
      "actions": ["start"],
      "request": {"waiver": ["range", "rental", "class", null]},
      "response": {"opened": true, "url": "string"}
    }
  },
  "submission": {
    "format": "brt-extension-submission-v1",
    "files": [
      "bundle.zip",
      "manifest.json",
      "publisher-public-key.txt",
      "signature.txt",
      "submission.json"
    ],
    "signature_algorithm": "Ed25519",
    "hash_algorithm": "SHA-256",
    "signing_payload_lines": [
      "brt-extension-release-v1",
      "namespace={namespace}",
      "version={version}",
      "manifest-sha256={sha256-of-exact-manifest-bytes}",
      "artifact-sha256={sha256-of-exact-bundle-bytes}",
      ""
    ]
  }
}
