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>
5.0 KiB
olp-plugin
OpenClaw gateway plugin that exposes a /olp slash command on Telegram and
Discord, with subcommand parity to the local olp CLI (bin/olp.mjs) minus
mutating operations.
Authority: ADR 0010 § Phase 4 D71-D73.
Status
✅ Shipped at v0.4.0 (read-only subset of olp CLI).
What you can do from chat
| 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 (empty unless wired) | public |
/olp doctor |
informational only (HTTP doctor endpoint not yet shipped) | — |
/olp help |
usage text | — |
What you can NOT do from chat (by design)
The following olp CLI subcommands are deliberately not ported to the
chat surface, because Telegram + Discord are shared / persistent message
streams and key material or raw audit logs should not be flowing across
them:
olp keys keygen— key material would land in chat historyolp keys revoke— accidental misclick could lock out clientsolp restart— a misclick should not cycle the proxyolp logs— audit content may carry PII
Use SSH to the host running OLP and the local olp CLI for those.
Install
The plugin is shipped inside the OLP repo at olp-plugin/. Two install paths:
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
Either path makes the plugin discoverable; restart the gateway to pick it up:
openclaw gateway restart
Configure
Edit ~/.openclaw/openclaw.json and add a config block for the olp plugin:
{
"plugins": {
"olp": {
"proxyUrl": "http://127.0.0.1:4567",
"apiKey": "olp_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
}
}
-
proxyUrl— full URL of the OLP proxy. Defaulthttp://127.0.0.1:4567(OLP's default since v0.4.0 / D60). Overridable viaOLP_PROXY_URLorOLP_PORTenv if you run the gateway under launchd / systemd with custom env. -
apiKey— owner-tier OLP API key. Required for the subcommands markedownerin the table above. Create one with:# On the OLP host, NOT in chat: npx olp-keys keygen --owner --name=openclaw-bot # Capture the plaintext token from the output — it is printed exactly once.Use a dedicated bot key (the
--name=openclaw-botexample above) so you cannpx olp-keys revoke --id=<id>later without affecting the maintainer's personal key.
Use
In Telegram or Discord, after the gateway picks up the plugin:
/olp status
/olp usage
/olp models
/olp help
Output is wrapped in a monospace code block. Long responses are truncated
to fit Telegram's ~4096-char per-message limit; a ... [truncated, use SSH for full] suffix marks where the cut happened.
Authorization model
The plugin sends Authorization: Bearer <apiKey> on every request. OLP's
server enforces:
- public-tier endpoints (
/health,/v1/models) accept any non-revoked key (or no key at all ifauth.allow_anonymous: true). - owner-tier endpoints (
/v0/management/*,/cache/stats) reject any non-owner key with 403.
If you see 401 unauthorized or 403 forbidden in chat:
- Verify the configured
apiKeyis a non-revoked owner-tier key. - Verify the key was created on the same host running the OLP server (keys
are stored under
~/.olp/keys/and validated by hash on the server side). - Check the OLP server's
/healthdirectly withcurlto confirm reachability.
Port resolution priority
OLP_PROXY_URLenv (full URL) — useful when the gateway runs on a different host than OLP and you proxy in via Tailscale.OLP_PORTenv (port only; localhost assumed).- Plugin config
proxyUrl. - Fallback
http://127.0.0.1:4567.
Why no Telegram/Discord SDK dependency
OpenClaw provides the transport (Telegram bot + Discord bot are gateway features). This plugin only registers a slash command — it does not open its own websocket / long-poll connection. That means:
- No new npm dependency.
- No bot tokens stored in plugin config.
- Plugin works for any OpenClaw-supported chat surface (currently Telegram + Discord; future surfaces inherit automatically).
Cross-references
- Local
olpCLI — the full mutating-capable surface. - OCP
/ocpplugin — the OCP predecessor this is ported from. - ADR 0010 — Phase 4 charter.
- ADR 0007 — multi-key auth model that gates owner-tier subcommands.