Files
openclaw/extensions/reef/openclaw.plugin.json
Peter Steinberger d361b4ccb8 feat(reef): headless openclaw reef CLI for agent-driven registration and pairing
Adds a non-interactive command surface (openclaw reef register|status|friend code|request|list|remove) so an agent can claim a handle and manage guarded friendships when its owner asks, without the interactive wizard. --json emits machine-readable output for automation. Registration is crash-safe and idempotent: guard defaults are provider-coupled, the full config is validated before the single-use magic-link token is consumed, a duplicate-handle claim recovers by proving key ownership and reconciling the relay's request policy, the exchanged session is cached scoped to relay+email (never printed) so reruns recover, one state dir is pinned to one identity, and friend removal revokes both the pin and the allowlist entry. Manifest gains commandAliases/onCommands so the CLI resolves; docs cover the agent-driven path.
2026-07-13 16:23:13 -07:00

280 lines
6.4 KiB
JSON

{
"id": "reef",
"name": "Reef",
"description": "Guarded end-to-end encrypted claw channel",
"activation": {
"onStartup": true,
"onCommands": [
"reef"
]
},
"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
}
}
}
}
}
}
},
"commandAliases": [
{
"name": "reef"
}
]
}