# at.happyproto.plugin.releaseExtension

> Published by [happyproto.at](https://lexicon.garden/identity/did:plc:mo7vq4jbioxwafy5zkcc3eux)

✓ This is the authoritative definition for this NSID.

## Links

- [View on Lexicon Garden](https://lexicon.garden/lexicon/did:plc:mo7vq4jbioxwafy5zkcc3eux/at.happyproto.plugin.releaseExtension)
- [Documentation](https://lexicon.garden/lexicon/did:plc:mo7vq4jbioxwafy5zkcc3eux/at.happyproto.plugin.releaseExtension/docs)
- [Examples](https://lexicon.garden/lexicon/did:plc:mo7vq4jbioxwafy5zkcc3eux/at.happyproto.plugin.releaseExtension/examples)

## Definitions

### `at.happyproto.plugin.releaseExtension`

**Type**: `object`

The HappyView-specific half of a release, carried at extensions['at.happyproto.plugin.releaseExtension']. It is the plugin manifest, moved into the signed record so a consent screen renders without downloading the module. It is not trusted: the loader checks it against the module's plugin_info export and its import section, so a release that misstates what its WASM does is refused exactly as a checksum mismatch is.

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `allowedHosts` | `array` | No | Hosts an outbound request may reach, as in today's manifest. The one constraint the capability model already has. |
| `apiVersion` | `string` | Yes | '2' or later, as validate_manifest already requires. |
| `capabilities` | `array` | Yes | The trust contract. The loader cross-checks it against the module's actual imports, so a plugin cannot import what this does not cover. |
| `fileExtensions` | `array` | No | Interpreters only: the file extensions a project's scripts in this language use, without the dot, as in the manifest's `extensions`. A project maps `getArtifact.lua` to the interpreter claiming `lua`, so a client that installs from the registry needs this to build that map without downloading the module. Optional, because releases published before it existed carry none. |
| `languageId` | `string` | No | Interpreters only: what scripts.script_type holds. Lowercase alphanumerics plus '-' and '_', starting with a letter, because the value has to survive a column, a URL and an editor mode name. |
| `namespace` | `string` | No | Libraries only: the require() name, which is unique across installed plugins. |
| `pluginType` | `string` | Yes | Every type requires an api_version of '2' or later and must declare its capabilities; there is no lower-version fallback for any of them. |

## Raw Schema

```json
{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "main": {
      "description": "The HappyView-specific half of a release, carried at extensions['at.happyproto.plugin.releaseExtension']. It is the plugin manifest, moved into the signed record so a consent screen renders without downloading the module. It is not trusted: the loader checks it against the module's plugin_info export and its import section, so a release that misstates what its WASM does is refused exactly as a checksum mismatch is.",
      "properties": {
        "allowedHosts": {
          "description": "Hosts an outbound request may reach, as in today's manifest. The one constraint the capability model already has.",
          "items": {
            "maxLength": 256,
            "type": "string"
          },
          "type": "array"
        },
        "apiVersion": {
          "description": "'2' or later, as validate_manifest already requires.",
          "maxLength": 16,
          "type": "string"
        },
        "capabilities": {
          "description": "The trust contract. The loader cross-checks it against the module's actual imports, so a plugin cannot import what this does not cover.",
          "items": {
            "maxLength": 128,
            "type": "string"
          },
          "type": "array"
        },
        "fileExtensions": {
          "description": "Interpreters only: the file extensions a project's scripts in this language use, without the dot, as in the manifest's `extensions`. A project maps `getArtifact.lua` to the interpreter claiming `lua`, so a client that installs from the registry needs this to build that map without downloading the module. Optional, because releases published before it existed carry none.",
          "items": {
            "maxLength": 16,
            "minLength": 1,
            "type": "string"
          },
          "maxLength": 8,
          "type": "array"
        },
        "languageId": {
          "description": "Interpreters only: what scripts.script_type holds. Lowercase alphanumerics plus '-' and '_', starting with a letter, because the value has to survive a column, a URL and an editor mode name.",
          "maxLength": 64,
          "type": "string"
        },
        "namespace": {
          "description": "Libraries only: the require() name, which is unique across installed plugins.",
          "maxLength": 256,
          "type": "string"
        },
        "pluginType": {
          "description": "Every type requires an api_version of '2' or later and must declare its capabilities; there is no lower-version fallback for any of them.",
          "knownValues": [
            "auth",
            "library",
            "interpreter"
          ],
          "type": "string"
        }
      },
      "required": [
        "pluginType",
        "apiVersion",
        "capabilities"
      ],
      "type": "object"
    }
  },
  "id": "at.happyproto.plugin.releaseExtension",
  "lexicon": 1
}
```
