Files
53afea47ca feat+test+docs: D71+D72+D73 — olp-plugin/ (OpenClaw /olp Telegram+Discord) + docs/integrations/*.md + README cross-refs (#44)
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>
2026-05-26 09:35:23 +10:00

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

  1. Open the Cline panel in VS Code (sidebar icon).

  2. Click the settings gear → "API Provider".

  3. Select OpenAI Compatible.

  4. Fill the fields:

    Field Value
    Base URL http://127.0.0.1:4567/v1
    API Key olp_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Model ID claude-sonnet-4-5
  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.json under a cline.apiConfiguration key (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.json uses canonical case (e.g. claude-sonnet-4-5). This is fine — OLP's router lowercases the requested model for chain lookup. But if you see unknown model errors, 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