OpenClaw with the Aulay channel plugin, for one-click assistants hosted by an Aulay runtime.
82
OpenClaw channel plugin that gives an OpenClaw gateway one channel called Aulay. The plugin dials out from inside the gateway to the Aulay messaging core (aulay-messaging/1, bearer bridge token) and the core relays every connected messenger (Telegram, Discord, Slack) to it. OpenClaw never learns which messenger a message came from; it gets a generic client profile and its rendering guidance instead.
Used by the derived image docker.io/aulayai/openclaw:<upstream>-aulay.<n> that Aulay runtimes pull for one-click assistants. The runtime writes ~/.openclaw/aulay/bridge.json ({url, token, instance_id}) into the state volume and the Aulay-owned keys into openclaw.json:
{
plugins: { load: { paths: ["/opt/aulay/openclaw-channel"] }, entries: { aulay: { enabled: true } } },
channels: { aulay: { enabled: true, bridgeConfigPath: "/home/node/.openclaw/aulay/bridge.json", agentId: "main" } },
bindings: [{ agentId: "main", match: { channel: "aulay", accountId: "*" } }],
}
| OpenClaw | Aulay |
|---|---|
gateway.startAccount(ctx) / ctx.abortSignal | opens and closes the long-lived bridge link (one per account) |
runtime.channel.inbound.run({ raw, adapter }) | one Aulay inbound event → one turn; conversation.id = Aulay conversation id, sender.id = Aulay user id (or guest:<name>) |
delivery.deliver(payload) / outbound.sendText | send to the conversation; message_id is Aulay's mref_… |
outbound.sendMedia | file block with the media URL |
profile guidance | appended to textForAgent as [client: <profile>] … |
AulayBridgeService.prompt() exposes button prompts over the bridge (used by tests); wiring OpenClaw's exec approvals onto it through approvalCapability is a follow-up.
src/bridge-service.ts — framework-agnostic: bridge.json → BridgeClient (from @aulay/messaging-sdk) → InboundSink. Tested against the SDK's FakeCore.src/openclaw-host.ts — the only module importing openclaw/plugin-sdk/*.types/openclaw-sdk.d.ts — a shim transcribed from the pinned openclaw package's declarations so the repo typechecks without the 390 MB dependency. pnpm run typecheck:surface runs in CI against the real package (.forgejo/workflows/openclaw-image.yml) before the image is pushed; SDK churn fails there, not at a user's runtime.pnpm install --ignore-workspace
pnpm test # vitest: bridge round trip against FakeCore, turn adapter mapping
pnpm run typecheck # against the shim
pnpm run build # esbuild bundle → dist/index.js (openclaw/* external)
Content type
Image
Digest
sha256:a612ccc96…
Size
1.1 GB
Last updated
about 12 hours ago
docker pull aulayai/openclaw:2026.9.8-aulay.latest