Final Phase 4 substantive D-day group. 3 D-days bundled per Iron Rule 11 IDR (plugin consumes existing endpoints; integration docs reference plugin + olp CLI + olp-connect together; README index links all). After this PR merges, Phase 4 has shipped all 5 D-day groups (D60 charter + port / D61-D63 SSE heartbeat+ring+/status / D64-D67 olp CLI+doctor / D68-D70 olp-connect+anonymous-key+ADR0011 / D71-D73 plugin+docs). The v0.4.0 close PR is maintainer-triggered per CLAUDE.md release_kit overlay. ## D71 — olp-plugin/ (OpenClaw gateway plugin) Port OCP ocp-plugin/index.js (311 lines) → OLP olp-plugin/index.js (482 lines) as the /olp Telegram+Discord slash command, but MINUS mutations (no /olp keys keygen, no /olp keys revoke, no /olp restart, no /olp logs — all of these require SSH out of chat for security). Plugin shape: - olp-plugin/index.js — registers /olp command via OpenClaw api.registerCommand - olp-plugin/openclaw.plugin.json — manifest, apiKey REQUIRED, proxyUrl default http://127.0.0.1:4567 (matches D60) - olp-plugin/package.json — minimal: name/version/type:module + OpenClaw discovery block - olp-plugin/README.md — install + configure + use docs; documents the "no mutations from chat" security stance and the dedicated-bot-key pattern (don't share maintainer's personal key with the bot) Subcommand parity with olp CLI (D64-D67): - /olp status → GET /v0/management/status (owner-only) - /olp health → GET /health (public-ok) - /olp usage → GET /v0/management/dashboard-data (owner-only) - /olp models → GET /v1/models (public-ok) - /olp cache → GET /cache/stats (owner-only) - /olp providers → local cross-ref (public-ok) - /olp chain show [<model>] → local (public-ok, advisory if no FS access — defer to ssh + olp chain show) - /olp doctor → informational (HTTP doctor endpoint deferred; advisory to ssh + olp doctor for live use) - /olp help → usage text Port resolution: OLP_PROXY_URL env → OLP_PORT env → plugin config proxyUrl → http://127.0.0.1:4567. Output: Telegram/Discord monospace code block with status icons (🟢🟡🔴). Long responses truncated for the 4096-char message limit. No npm deps. OpenClaw provides Telegram/Discord transport; plugin uses fetch + node builtins only. ## D72 — docs/integrations/*.md (6 IDE pages + index) Per the Phase 4 brainstorm prior-art survey + ADR 0010 § Out-of-scope posture for Claude Code: - continue.md ✅ — config.yaml (NOT config.json); apiBase; requestOptions.headers - cline.md ✅ — "OpenAI Compatible" provider; Cline #7128 base-URL UI bug warning - cursor.md ⚠️ — known base-URL fragility; only enable models OLP serves - aider.md ✅ — OPENAI_API_BASE env + openai/ prefix; .env support - claude-code.md ❌ — explicitly NOT supported per ADR 0010 § /v1/messages defer rationale; recommended alternative: Cline + OLP - openclaw.md ✅ — install olp-plugin via CLI or symlink; configure apiKey; restart gateway Each ~60-120 lines: status / quick setup / known issues / OLP-specific notes / test-it command. docs/integrations/README.md is the index. ## D73 — README cross-references - New § "IDE Setup" links to docs/integrations/README.md - New § "Telegram / Discord Usage" — install + configure + restart + use - Quick Start mentions olp-connect <ip> as family-onboarding command - package.json `files` field extended to include olp-plugin/ so the published tarball ships the plugin ## Test count 672 → 696 (+24 D71-D73 tests in Suite 35: helpers / formatters / dispatch / error paths). All 696 pass locally. ## Scope discipline - server.mjs UNTOUCHED (plugin consumes EXISTING endpoints) - No new npm deps (no Telegram or Discord SDK — OpenClaw provides transport) - No /v1/messages (out of Phase 4 per ADR 0010) - No CHANGELOG / package.json version bump (Phase 4 close handles versioning; only package.json `files` extended for olp-plugin/ publication) ## Implementor flagged for reviewer 1. /olp doctor returns SSH advisory (no HTTP doctor endpoint yet). When future phase exposes /v0/management/doctor, swap advisory branch for real fetchJSON + fmtDoctor (already implemented + tested). 2. /olp providers + chain show have no FS access (plugin runs in OpenClaw gateway process); registry read via lazy-imported models-registry.json from repo root. For live enabled-state visibility users still need /olp status (owner-tier) or ssh + olp providers / olp chain show. 3. No live-server wire test in Suite 35 — existing Suites 31/32 already cover the integration path against the same endpoints; mock-fetch in Suite 35 is sufficient signal for the plugin layer. ## Authority - ADR 0010 § Phase 4 D-day plan D71-D73 line - OCP ocp-plugin/index.js (port reference) - ADR 0010 § Out-of-Phase-4-scope (claude-code.md ❌ rationale) - 2026-05-26 brainstorm (Top OCP inheritance candidates + prior-art survey IDE-specific quirks for cline/cursor/continue docs) Co-authored-by: dtzp555 <dtzp555@gmail.com> Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
4.4 KiB
OpenClaw + OLP
OpenClaw is a multi-bot gateway
that exposes slash commands on Telegram, Discord, and other chat
surfaces. OLP ships olp-plugin/ as a native
OpenClaw plugin that registers a /olp slash command with read-only
parity to the local olp CLI.
Status: ✅ Supported.
What you get
After install, from Telegram or Discord:
| Slash command | Maps to | Tier |
|---|---|---|
/olp status |
GET /v0/management/status |
owner |
/olp health |
GET /health |
public |
/olp usage |
GET /v0/management/dashboard-data |
owner |
/olp models |
GET /v1/models |
public |
/olp cache |
GET /cache/stats |
owner |
/olp providers |
local registry view | public |
/olp chain show [model] |
local chain view | public |
/olp doctor |
informational (HTTP endpoint not yet shipped) | — |
/olp help |
usage text | — |
Mutating subcommands are deliberately not exposed via chat. keygen,
revoke, restart, logs are SSH-only. See
olp-plugin/README.md
for the rationale.
Quick setup
1. Install the plugin
Two install paths — either works.
Option A — OpenClaw CLI:
openclaw plugins install /path/to/olp/olp-plugin/
Option B — symlink:
mkdir -p ~/.openclaw/extensions/
ln -s /path/to/olp/olp-plugin/ ~/.openclaw/extensions/olp
2. Mint a bot owner key
Run on the OLP host (NOT in chat):
npx olp-keys keygen --owner --name=openclaw-bot
Capture the printed plaintext token — it is shown exactly once.
3. Configure
Edit ~/.openclaw/openclaw.json:
{
"plugins": {
"olp": {
"proxyUrl": "http://127.0.0.1:4567",
"apiKey": "olp_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
}
}
4. Restart the gateway
openclaw gateway restart
The plugin is now active. Try /olp help in your bot's chat.
Known issues
-
openclaw gateway restartis required after install. OpenClaw caches plugin discovery at gateway start.openclaw plugins reloaddoes not guarantee a fresh import of the plugin module. -
Owner key revocation kicks the plugin out immediately. If you revoke the bot's owner key (
npx olp-keys revoke --id=<id>), the next/olp statuswill return401 unauthorized. Mint a replacement key with a new name and edit~/.openclaw/openclaw.json; do NOT reuse the revoked key's UUID. -
Long responses are truncated. Telegram caps messages at ~4096 characters. The plugin truncates with a
... [truncated, use SSH for full]suffix when the rendered output would exceed ~3900 chars. Use SSH + the localolpCLI for full output.
OLP-specific notes
The plugin honours these env vars on the OpenClaw gateway process:
OLP_PROXY_URL— full URL, overrides plugin configproxyUrl.OLP_PORT— port only, localhost assumed; overridesproxyUrlwhenOLP_PROXY_URLis unset.
If you run the OpenClaw gateway under launchd or systemd with custom env
vars, set OLP_PROXY_URL there rather than editing the plugin config —
that way the same plugin install can serve multiple OLP hosts.
Per-bot vs maintainer key
Always create a dedicated bot key, never the maintainer's personal owner key. The bot key:
- Has its own
idso you can revoke it without affecting other clients. - Has its own audit-log entries so you can attribute
/v0/management/*traffic to the bot. - Can be rotated routinely (every 90 days etc.) without coordinating with the maintainer's daily-driver IDE configs.
Test it
After restart, in Telegram or Discord:
/olp health
/olp status
/olp models
Each should return a code-block-wrapped response within a few seconds.
If you see 401 unauthorized: the configured key is missing / wrong /
revoked. If you see 403 forbidden: the key is not owner-tier. If you
see OLP error: fetch failed or similar: the proxyUrl is unreachable
from the gateway host (test with curl http://<proxyUrl>/health from
that host).
Cross-references
olp-plugin/README.md— full plugin docs.- ADR 0010 § Phase 4 D71-D73 — the plugin's charter.
- OCP
/ocpplugin — the OCP predecessor (includes mutating subcommands that OLP deliberately drops).