Files
openclaw/extensions/reef/openclaw.plugin.json
Peter Steinberger 882b2fe900 feat(channels): bundle Reef guarded claw-to-claw channel (#106232)
* feat(channels): bundle Reef guarded claw-to-claw channel

Moves the Reef channel extension from openclaw/reef into the bundled extensions tree with the wire protocol vendored under extensions/reef/protocol. Includes channelConfigs manifest metadata, runtime status reporting via setStatus/buildAccountSnapshot, abort-aware inbox shutdown, monotonic device-auth timestamps, and immutable-model guard admission (dated snapshots plus documented gpt-5.6 ids).

* fix(reef): pin zod exactly per dependency pin guard

* style(reef): satisfy extension lint gates

Curly braces in vendored protocol, explicit type re-exports, typed catch callbacks, Object.assign over map-spread, abort-aware loop restructure.

* fix(reef): CI gates — knip workspace, boundary tsconfig, facade imports, cycle break, contract baselines

- knip: reef workspace project includes vendored protocol/ (owns noble deps)
- tsconfig: conform to canonical extension package-boundary include/exclude; add @openclaw/plugin-sdk devDependency
- imports: channel-inbound/channel-outbound facades instead of deprecated subpaths
- protocol: home ReplayStore contract in envelope.ts to break the envelope<->replay type cycle
- baselines: reef in unguarded runtime-api list; regenerate bundled channel config metadata

* feat(reef): plugin catalog cover art, channel label, changelog revert

* fix(reef): drop unused error-class exports, register lint suppression

* fix(reef): knip entry surface for vendored protocol, explicit WebSocketLike export
2026-07-13 05:17:44 -07:00

272 lines
6.3 KiB
JSON

{
"id": "reef",
"name": "Reef",
"description": "Guarded end-to-end encrypted claw channel",
"activation": {
"onStartup": true
},
"channels": [
"reef"
],
"configSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"relayUrl": {
"type": "string",
"format": "uri",
"default": "https://reefwire.ai"
},
"handle": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9_-]{0,62}$"
},
"email": {
"type": "string",
"format": "email"
},
"guard": {
"type": "object",
"additionalProperties": false,
"required": [
"provider",
"pinnedModel",
"apiKeyEnv",
"policyVersion",
"timeoutMs"
],
"properties": {
"provider": {
"enum": [
"anthropic",
"openai"
]
},
"pinnedModel": {
"type": "string",
"minLength": 1
},
"apiKeyEnv": {
"type": "string",
"pattern": "^[A-Z_][A-Z0-9_]*$"
},
"policyVersion": {
"type": "string",
"minLength": 1
},
"timeoutMs": {
"type": "integer",
"minimum": 100,
"maximum": 120000
}
}
},
"stateDir": {
"type": "string",
"minLength": 1
},
"friends": {
"type": "object",
"additionalProperties": {
"$ref": "#/$defs/friend"
}
},
"requestPolicy": {
"enum": [
"code-only",
"friends-of-friends",
"open"
],
"default": "code-only"
},
"dmPolicy": {
"const": "pairing",
"default": "pairing"
},
"allowFrom": {
"type": "array",
"items": {
"type": "string"
},
"default": []
},
"enabled": {
"type": "boolean",
"default": true
}
},
"$defs": {
"friend": {
"type": "object",
"additionalProperties": false,
"required": [
"autonomy",
"ed25519PublicKey",
"x25519PublicKey",
"keyEpoch"
],
"properties": {
"autonomy": {
"enum": [
"notify-only",
"bounded",
"extended"
],
"default": "bounded"
},
"ed25519PublicKey": {
"type": "string",
"minLength": 43,
"maxLength": 43
},
"x25519PublicKey": {
"type": "string",
"minLength": 43,
"maxLength": 43
},
"keyEpoch": {
"type": "integer",
"minimum": 1
},
"safetyNumberChanged": {
"type": "boolean",
"default": false
}
}
}
}
},
"channelConfigs": {
"reef": {
"schema": {
"type": "object",
"additionalProperties": false,
"properties": {
"relayUrl": {
"type": "string",
"format": "uri",
"default": "https://reefwire.ai"
},
"handle": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9_-]{0,62}$"
},
"email": {
"type": "string",
"format": "email"
},
"guard": {
"type": "object",
"additionalProperties": false,
"required": [
"provider",
"pinnedModel",
"apiKeyEnv",
"policyVersion",
"timeoutMs"
],
"properties": {
"provider": {
"enum": [
"anthropic",
"openai"
]
},
"pinnedModel": {
"type": "string",
"minLength": 1
},
"apiKeyEnv": {
"type": "string",
"pattern": "^[A-Z_][A-Z0-9_]*$"
},
"policyVersion": {
"type": "string",
"minLength": 1
},
"timeoutMs": {
"type": "integer",
"minimum": 100,
"maximum": 120000
}
}
},
"stateDir": {
"type": "string",
"minLength": 1
},
"friends": {
"type": "object",
"additionalProperties": {
"$ref": "#/$defs/friend"
}
},
"requestPolicy": {
"enum": [
"code-only",
"friends-of-friends",
"open"
],
"default": "code-only"
},
"dmPolicy": {
"const": "pairing",
"default": "pairing"
},
"allowFrom": {
"type": "array",
"items": {
"type": "string"
},
"default": []
},
"enabled": {
"type": "boolean",
"default": true
}
},
"$defs": {
"friend": {
"type": "object",
"additionalProperties": false,
"required": [
"autonomy",
"ed25519PublicKey",
"x25519PublicKey",
"keyEpoch"
],
"properties": {
"autonomy": {
"enum": [
"notify-only",
"bounded",
"extended"
],
"default": "bounded"
},
"ed25519PublicKey": {
"type": "string",
"minLength": 43,
"maxLength": 43
},
"x25519PublicKey": {
"type": "string",
"minLength": 43,
"maxLength": 43
},
"keyEpoch": {
"type": "integer",
"minimum": 1
},
"safetyNumberChanged": {
"type": "boolean",
"default": false
}
}
}
}
}
}
}
}