mirror of
https://github.com/dtzp555-max/olp.git
synced 2026-07-21 21:15:10 +00:00
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>
95 lines
3.9 KiB
Markdown
95 lines
3.9 KiB
Markdown
# Cline + OLP
|
|
|
|
[Cline](https://github.com/cline/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](https://github.com/cline/cline/issues/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
|
|
|
|
```bash
|
|
# 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](../adr/0010-phase-4-charter-operator-and-client-ux.md).
|
|
|
|
## Cross-references
|
|
|
|
- Cline issue tracker: https://github.com/cline/cline/issues
|
|
- [`olp-connect`](../../bin/olp-connect) automates writing the Cline workspace
|
|
state.
|