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>
3.9 KiB
Cline + OLP
Cline is an autonomous-coder VS Code
extension. It speaks OpenAI's /v1/chat/completions wire format via its
"OpenAI Compatible" provider option.
Status: ✅ Supported.
Tested against: Cline v3.x (extension version visible in VS Code's extension panel). Cline's settings UI has shipped multiple variants of the base-URL field across 2025-2026; if your version doesn't show the field described below, see the Known Issues section.
Quick setup
-
Open the Cline panel in VS Code (sidebar icon).
-
Click the settings gear → "API Provider".
-
Select OpenAI Compatible.
-
Fill the fields:
Field Value Base URL http://127.0.0.1:4567/v1API Key olp_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXModel ID claude-sonnet-4-5 -
Save. Cline shows the model name in the bottom-right corner of the panel.
Replace the API key with the plaintext token printed by olp-keys keygen --name=cline. Family members on the LAN should substitute the OLP host's
IP for 127.0.0.1 (or use olp-connect <ip>).
Known issues
-
Cline issue #7128 — base-URL UI field intermittently disappears. Several Cline releases in 2025-2026 shipped a settings UI where the "Base URL" field is hidden when the "OpenAI Compatible" provider is freshly selected. Workaround: switch to a different provider, save, switch back to "OpenAI Compatible" — the field returns. Verify the field is visible in your version BEFORE troubleshooting OLP itself.
-
Cline writes settings to
.vscode/settings.jsonunder acline.apiConfigurationkey (workspace-scoped) and to the VS Code global state (machine-scoped) depending on the "save to workspace" toggle. If Cline keeps "forgetting" the OLP base URL across VS Code restarts, the workspace state is overriding the global state. Either save to workspace explicitly, or clear the workspace key and use global state. -
Cline sometimes lowercases the model ID before sending. OLP's
models-registry.jsonuses canonical case (e.g.claude-sonnet-4-5). This is fine — OLP's router lowercases the requested model for chain lookup. But if you seeunknown modelerrors, double-check the exact string Cline sent via the OLP response headers (curl test below).
OLP-specific notes
Cline does not expose a custom-headers field in its OpenAI Compatible
provider UI as of v3.x. The OLP routing chain is selected purely from the
model ID — pick the canonical name (e.g. claude-sonnet-4-5) that matches
a routing.chains key in your ~/.olp/config.json.
OLP's response headers (X-OLP-Provider-Used, X-OLP-Cache,
X-OLP-Latency-Ms) are not visible in Cline's UI but are captured by VS
Code's Developer Tools Network panel when Cline runs the request.
Test it
# 1. Verify OLP accepts Cline-shape requests
curl -sI -X POST http://127.0.0.1:4567/v1/chat/completions \
-H "Authorization: Bearer olp_XXXXXX" \
-H "Content-Type: application/json" \
-d '{"model":"claude-sonnet-4-5","messages":[{"role":"user","content":"ok"}],"max_tokens":5,"stream":false}' \
| grep -i x-olp
Expect X-OLP-Provider-Used: anthropic (or whichever provider serves
sonnet in your chain) and X-OLP-Cache: miss on first request.
Why not /v1/messages?
Cline supports Anthropic-shape requests via a separate "Anthropic" provider
in its UI. OLP does not implement /v1/messages. Use Cline's OpenAI
Compatible option pointed at OLP rather than Cline's Anthropic option
pointed at api.anthropic.com — the OLP chain gives you fallback to OpenAI
Codex / Mistral / etc. when the Anthropic subscription hits its quota
ceiling. See ADR 0010 § /v1/messages defer rationale.
Cross-references
- Cline issue tracker: https://github.com/cline/cline/issues
olp-connectautomates writing the Cline workspace state.