> ## Documentation Index
> Fetch the complete documentation index at: https://docs.evox.wraithesports.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Plugin manifest

> Define the schema v1 plugin identity, runtime, compatibility, permission, setting and action fields.

The manifest is a strict JSON document; unrecognized fields are rejected.

```json theme={}
{
  "schemaVersion": 1,
  "pluginId": "c6d3ccf8-c96c-46b6-a254-8fce86337c37",
  "sdkVersion": "0.1.0",
  "name": "Yerel Sayaç Örneği",
  "version": "1.0.0",
  "runtime": { "kind": "trusted-node", "entry": "runtime.mjs" },
  "hostCompatibility": { "minimumVersion": "0.2.0" },
  "permissions": [{ "name": "key.display" }],
  "settingsSchema": [],
  "actions": [{ "id": "counter", "name": "Sayaç", "controllers": ["Keypad"], "settingsSchema": [] }]
}
```

## Identity

* `pluginId` is the immutable identity.
* The runtime action identity is the combination `pluginId + local action id`.
* Action IDs are unique within the same manifest.
* The runtime cannot change identity through a request payload.

## Runtime

| `runtime.kind` | Entry                                     |
| -------------- | ----------------------------------------- |
| `trusted-node` | `.js`, `.mjs` or `.cjs`                   |
| `sandbox-js`   | Browser-compatible `.js` or `.mjs`        |
| `wasm`         | `.wasm`; the next language-neutral target |

Setting keys use lower camelCase. `secret` and `oauth` fields cannot carry a default value; raw credentials are not written into normal settings or the manifest.

The manifest should declare only the permission descriptors it needs. The runtime grant set is computed as declared ∩ user-granted.

## Icon (`glyph`)

The plugin and each action can choose their own icon. If none is declared, both show
the default code icon; an action without a `glyph` falls back to the plugin `glyph`.

```json theme={}
{
  "glyph": "CommandLineIcon",
  "actions": [
    { "id": "prompt", "name": "Prompt gönder", "glyph": "AiChat01Icon" },
    { "id": "abort", "name": "Durdur", "glyph": "StopCircleIcon" }
  ]
}
```

The value is a **Hugeicons** name and is chosen from a fixed list. Free-form names are not
accepted: the host statically imports glyphs one by one in both the desktop rasterizer and the
interface, and bundling the whole icon set would exceed the renderer budget.
A name that is not on the list gets the manifest rejected.

<Info>The full list of valid names is in `PLUGIN_GLYPH_NAMES` (`@evox/plugin-protocol`). Adding a name to the list is a host-side change; if the glyph you need is missing, open a request.</Info>

## Conditional setting visibility (`visibleWhen`)

A setting can be shown only while another setting has a certain value.

```json theme={}
{
  "settingsSchema": [
    {
      "key": "preset",
      "type": "select",
      "label": "Preset",
      "default": "tests",
      "options": [
        { "value": "tests", "label": "Testleri çalıştır" },
        { "value": "custom", "label": "Özel prompt" }
      ]
    },
    {
      "key": "prompt",
      "type": "text",
      "label": "Özel prompt",
      "visibleWhen": { "key": "preset", "in": ["custom"] }
    }
  ]
}
```

* `key` must point to another setting in the same `settingsSchema`. A reference to a key that does not exist, or to the field itself, gets the manifest rejected — both would silently hide the field forever.
* The comparison is case-insensitive.
* If the referenced setting's value is empty, that setting's `default` is used; in the example above, on a key that was never touched `preset` defaults to `tests`, so the `prompt` field starts hidden.
* The saved value of a hidden field is not deleted; when the user switches back to the option that satisfies the condition, they find the old value.
