{
  "abi": "0.3.0",
  "capabilities": [
    {
      "doc": "Allowed hosts: `api.stripe.com`, `*.example.com`, `$server`, `$setting:<key>`.",
      "name": "http",
      "optional": true,
      "ty": "Vec<String>"
    },
    {
      "doc": "",
      "name": "secrets",
      "optional": true,
      "ty": "Vec<String>"
    },
    {
      "doc": "",
      "name": "kv",
      "optional": true,
      "ty": "bool"
    },
    {
      "doc": "",
      "name": "events",
      "optional": true,
      "ty": "Vec<String>"
    },
    {
      "doc": "Synchronous pre-action hooks (`invoice.before_create`, …).",
      "name": "hooks",
      "optional": true,
      "ty": "Vec<Hook>"
    },
    {
      "doc": "HTTP routes served under `/api/v1/addons/<id>/…`.",
      "name": "routes",
      "optional": true,
      "ty": "Vec<Route>"
    },
    {
      "doc": "UI powers beyond the declarative schema: `iframe` = sandboxed pages and widgets served from the addon's `assets/` (admin-approved).",
      "name": "ui",
      "optional": true,
      "ty": "Vec<String>"
    },
    {
      "doc": "Core `GET /api/v1/…` prefixes an iframe may read through the postMessage bridge (with the viewer's own permissions).",
      "name": "bridge",
      "optional": true,
      "ty": "Vec<String>"
    },
    {
      "doc": "`http: [\"*\"]` may also reach loopback/private/LAN addresses. Link-local and cloud metadata stay refused.",
      "name": "http_private",
      "optional": true,
      "ty": "bool"
    },
    {
      "doc": "Change money amounts in pre-event payloads (audited, exact Decimal).",
      "name": "money",
      "optional": true,
      "ty": "MoneyCaps"
    },
    {
      "doc": "Core data access through the host (`power` interface).",
      "name": "db",
      "optional": true,
      "ty": "DbCaps"
    },
    {
      "doc": "Private data directory, mounted at `/data` (WASI preopen).",
      "name": "fs",
      "optional": true,
      "ty": "bool"
    },
    {
      "doc": "Absolute program paths the addon may run (no shell). Off in Docker.",
      "name": "exec",
      "optional": true,
      "ty": "Vec<String>"
    },
    {
      "doc": "Optional per-program argument allowlist: each argument must equal a pattern or match a `prefix*` pattern. Programs not listed only get the baseline checks in [`validate_exec_args`].",
      "name": "exec_args",
      "optional": true,
      "ty": "HashMap<String, Vec<String>>"
    },
    {
      "doc": "Size cap for the `/data` directory in MiB (default 64, max 1024). Over quota the directory is mounted read-only.",
      "name": "fs_quota_mb",
      "optional": true,
      "ty": "Option<u32>"
    },
    {
      "doc": "Background jobs: ops the addon may queue, and cron schedules.",
      "name": "jobs",
      "optional": true,
      "ty": "Vec<Job>"
    },
    {
      "doc": "Custom login: the host asks the addon to verify credentials (op `auth.verify`). It never sees stored password hashes.",
      "name": "auth_provider",
      "optional": true,
      "ty": "bool"
    },
    {
      "doc": "Custom events this addon may emit (`<id>:<name>`, `*` suffix allowed).",
      "name": "emits",
      "optional": true,
      "ty": "Vec<String>"
    },
    {
      "doc": "Host-enforced wrappers around approved host operations.",
      "name": "mixins",
      "optional": true,
      "ty": "Vec<Mixin>"
    }
  ],
  "hook": [
    {
      "doc": "",
      "name": "event",
      "optional": false,
      "ty": "String"
    },
    {
      "doc": "Lower runs first; ties ordered by addon id. Accepts an integer or a Bukkit-style name: `lowest` (0), `low` (50), `normal` (100), `high` (150), `highest` (200), `monitor` (1000, observe only).",
      "name": "priority",
      "optional": true,
      "ty": "i32"
    },
    {
      "doc": "Also receive the event when an earlier listener cancelled it.",
      "name": "ignore_cancelled",
      "optional": true,
      "ty": "bool"
    },
    {
      "doc": "On error/timeout: `true` lets the action continue, `false` blocks it.",
      "name": "fail_open",
      "optional": true,
      "ty": "bool"
    },
    {
      "doc": "Hook budget in milliseconds (capped by the sandbox timeout).",
      "name": "timeout_ms",
      "optional": true,
      "ty": "u64"
    }
  ],
  "manifest": [
    {
      "doc": "",
      "name": "id",
      "optional": false,
      "ty": "String"
    },
    {
      "doc": "",
      "name": "name",
      "optional": false,
      "ty": "String"
    },
    {
      "doc": "",
      "name": "version",
      "optional": false,
      "ty": "String"
    },
    {
      "doc": "",
      "name": "kind",
      "optional": false,
      "ty": "String"
    },
    {
      "doc": "",
      "name": "engine",
      "optional": false,
      "ty": "String"
    },
    {
      "doc": "",
      "name": "description",
      "optional": true,
      "ty": "String"
    },
    {
      "doc": "",
      "name": "author",
      "optional": true,
      "ty": "String"
    },
    {
      "doc": "",
      "name": "permissions",
      "optional": true,
      "ty": "Vec<String>"
    },
    {
      "doc": "",
      "name": "settings",
      "optional": true,
      "ty": "Vec<SettingSpec>"
    },
    {
      "doc": "",
      "name": "migrations",
      "optional": true,
      "ty": "Vec<String>"
    },
    {
      "doc": "",
      "name": "files",
      "optional": true,
      "ty": "BTreeMap<String, String>"
    },
    {
      "doc": "WASM addons (`engine: \"wasm\"`): the engine id this addon provides (`stripe`, `pterodactyl`, ...), the WIT ABI and the component path.",
      "name": "provides",
      "optional": true,
      "ty": "Option<String>"
    },
    {
      "doc": "",
      "name": "abi",
      "optional": true,
      "ty": "Option<String>"
    },
    {
      "doc": "",
      "name": "wasm",
      "optional": true,
      "ty": "Option<String>"
    },
    {
      "doc": "Sandbox capabilities approved at install (http allowlist, secrets, kv, events).",
      "name": "capabilities",
      "optional": true,
      "ty": "Option<Value>"
    },
    {
      "doc": "Declarative admin/client pages and widgets (see `addon_ext::validate_ui`).",
      "name": "ui",
      "optional": true,
      "ty": "Option<Value>"
    },
    {
      "doc": "Strings for `ui`, served as `plugin.<id>.<key>`: `{ \"en\": {...}, \"ro\": {...} }`.",
      "name": "i18n",
      "optional": true,
      "ty": "Option<Value>"
    },
    {
      "doc": "Per-addon sandbox limits (`memory_mib`, `timeout_secs`, `fuel`), at most the admin maxima (`pelty_wasm::limit_maxima`).",
      "name": "limits",
      "optional": true,
      "ty": "Option<Value>"
    }
  ],
  "mixin": [
    {
      "doc": "",
      "name": "target",
      "optional": false,
      "ty": "String"
    },
    {
      "doc": "",
      "name": "at",
      "optional": false,
      "ty": "String"
    },
    {
      "doc": "",
      "name": "priority",
      "optional": true,
      "ty": "i32"
    },
    {
      "doc": "",
      "name": "timeout_ms",
      "optional": true,
      "ty": "u64"
    }
  ],
  "mixin_at": [
    "before",
    "after",
    "around",
    "return"
  ],
  "permissions": [
    "payments.process",
    "provisioning.manage",
    "domains.manage",
    "network.outbound",
    "db.migrate",
    "ui.extend"
  ],
  "phases": [
    "before",
    "during",
    "after",
    "finished"
  ],
  "ui_node_types": [
    "stack",
    "row",
    "grid",
    "card",
    "section",
    "separator",
    "tabs",
    "tab",
    "accordion",
    "accordion_item",
    "dialog",
    "heading",
    "text",
    "badge",
    "alert",
    "stat",
    "kv",
    "code",
    "image",
    "avatar",
    "icon",
    "progress",
    "skeleton",
    "empty",
    "tooltip",
    "money",
    "date",
    "link",
    "table",
    "list",
    "each",
    "if",
    "chart",
    "button",
    "form",
    "input",
    "textarea",
    "select",
    "switch",
    "checkbox",
    "radio",
    "collapsible",
    "popover",
    "sheet",
    "dropdown",
    "breadcrumb",
    "pagination",
    "scroll_area",
    "label",
    "kbd",
    "blockquote",
    "list_item",
    "frame",
    "embed"
  ],
  "ui_slots": [
    [
      "admin.dashboard",
      []
    ],
    [
      "client.dashboard",
      []
    ],
    [
      "admin.service.detail",
      [
        "service_id"
      ]
    ],
    [
      "admin.customer.detail",
      [
        "customer_id"
      ]
    ],
    [
      "admin.order.detail",
      [
        "order_id"
      ]
    ],
    [
      "admin.invoice.detail",
      [
        "invoice_id"
      ]
    ],
    [
      "client.home",
      []
    ]
  ]
}