{
  "id": "friend-cloud-connector",
  "name": "Friend Cloud Connector",
  "version": "0.4.2",
  "type": "pt",
  "mode": "managed",
  "transport": "stdio",
  "runtime": "go",
  "trust": "builtin",
  "description": "Generic Cloud Friend Host Protocol connector: maintains an outbound WebSocket to the host product backend (e.g. Yunwo), executes whitelisted method calls against the local Friend API, and streams events back. Product-agnostic protocol layer.",
  "command": [
    "/var/lib/friend/plugins/friend-cloud-connector/friend-cloud-connector"
  ],
  "platform": "linux/amd64",
  "config_schema": {
    "host_ws_url": {
      "type": "string",
      "description": "Host product WebSocket endpoint to dial (outbound)",
      "required": true
    },
    "host_token": {
      "type": "string",
      "description": "Per-user credential issued by the host (Yunwo FriendToken)",
      "required": true,
      "secret": true
    },
    "reconnect_min_seconds": {
      "type": "int",
      "description": "Minimum reconnect backoff seconds",
      "default": 2
    },
    "reconnect_max_seconds": {
      "type": "int",
      "description": "Maximum reconnect backoff seconds",
      "default": 60
    },
    "idle_threshold_seconds": {
      "type": "int",
      "description": "Send instance.idle to host after all chains stay non-active for this long",
      "default": 300
    },
    "check_interval_seconds": {
      "type": "int",
      "description": "Idle monitor polling interval (chain.list)",
      "default": 30
    },
    "stream_batch_ms": {
      "type": "int",
      "description": "Micro-batching window in ms for brain.stream delta frames",
      "default": 100
    }
  },
  "supports_hot_reload": true,
  "capabilities": {
    "wants": [
      "chain.abort",
      "chain.get",
      "chain.list",
      "chain.node.append",
      "chain.node.get",
      "chain.nodes.list",
      "chain.send",
      "chains.tree",
      "config.get",
      "config.set",
      "event.publish",
      "event.subscribe",
      "llm.channel.probe",
      "llm.channels.delete",
      "llm.channels.list",
      "llm.channels.update",
      "llm.routes.get",
      "llm.routes.set",
      "transmission.send",
      "perception.emit",
      "perception.route",
      "persona.get",
      "persona.update",
      "skills.disable",
      "skills.enable",
      "skills.list",
      "status.health",
      "chain.child.create",
      "chain.main.get",
      "chain.close",
      "chain.alias.set"
    ]
  }
}