@elvatis_com/openclaw-cli-bridge-elvatis 2.2.0 → 2.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ai/handoff/DASHBOARD.md +6 -5
- package/.ai/handoff/LOG.md +32 -0
- package/.ai/handoff/NEXT_ACTIONS.md +3 -2
- package/.ai/handoff/STATUS.md +4 -3
- package/README.md +4 -1
- package/index.ts +28 -46
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/src/config-patcher.ts +4 -1
package/.ai/handoff/DASHBOARD.md
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# DASHBOARD.md — openclaw-cli-bridge-elvatis
|
|
2
2
|
|
|
3
|
-
_Last updated: 2026-04-
|
|
3
|
+
_Last updated: 2026-04-10_
|
|
4
4
|
|
|
5
5
|
<!-- SECTION: plugin_status -->
|
|
6
6
|
## Plugin Status
|
|
7
7
|
|
|
8
8
|
| Component | Version | Build | Tests | Status |
|
|
9
9
|
|-----------|---------|-------|-------|--------|
|
|
10
|
-
| openclaw-cli-bridge-elvatis | 2.2.
|
|
10
|
+
| openclaw-cli-bridge-elvatis | 2.2.2 | ✅ | ✅ | ✅ Stable |
|
|
11
11
|
<!-- /SECTION: plugin_status -->
|
|
12
12
|
|
|
13
13
|
<!-- SECTION: release_state -->
|
|
@@ -15,9 +15,9 @@ _Last updated: 2026-04-09_
|
|
|
15
15
|
|
|
16
16
|
| Platform | Published Version | Status |
|
|
17
17
|
|----------|------------------|--------|
|
|
18
|
-
| GitHub | v2.2.
|
|
19
|
-
| npm | 2.
|
|
20
|
-
| ClawHub | 2.
|
|
18
|
+
| GitHub | v2.2.2 | ✅ Pushed to main |
|
|
19
|
+
| npm | 2.2.2 | ✅ Published (via CI) |
|
|
20
|
+
| ClawHub | 2.2.2 | ✅ Published (via CI) |
|
|
21
21
|
<!-- /SECTION: release_state -->
|
|
22
22
|
|
|
23
23
|
<!-- SECTION: open_tasks -->
|
|
@@ -31,6 +31,7 @@ _No open tasks._
|
|
|
31
31
|
|
|
32
32
|
| Task | Title | Version |
|
|
33
33
|
|------|-------|---------|
|
|
34
|
+
| T-018 | Fix vllm apiKey corruption (401) + harden config-patcher | 2.2.2 |
|
|
34
35
|
| T-017 | Fix log spam, restart loops, CLI blocking | 2.2.0 |
|
|
35
36
|
| T-016 | Issue #2: Codex auth auto-import into agent auth store | 2.1.0 |
|
|
36
37
|
| T-015 | Issue #4: Background session mgmt with workdir isolation | 2.1.0 |
|
package/.ai/handoff/LOG.md
CHANGED
|
@@ -4,6 +4,38 @@ _Last 10 sessions. Older entries in LOG-ARCHIVE.md._
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## 2026-04-10 — Session 10 (Claude Opus 4.6)
|
|
8
|
+
|
|
9
|
+
> **Agent:** claude-opus-4-6
|
|
10
|
+
> **Phase:** fix
|
|
11
|
+
> **Commit before:** v2.2.0
|
|
12
|
+
> **Commit after:** v2.2.1
|
|
13
|
+
|
|
14
|
+
**T-018: Fix vllm apiKey corruption causing 401 + harden config-patcher**
|
|
15
|
+
|
|
16
|
+
### Problem
|
|
17
|
+
The vllm provider in `~/.openclaw/openclaw.json` had `"apiKey": "__OPENCLAW_KEEP__"` instead of `"cli-bridge"`. The CLI bridge proxy on port 31337 expects `Authorization: Bearer cli-bridge` and rejects any other value with HTTP 401.
|
|
18
|
+
|
|
19
|
+
This caused all `vllm/cli-claude/*` requests to fail silently, triggering the self-healing plugin's model fallback to `openai-codex/gpt-5.1`.
|
|
20
|
+
|
|
21
|
+
**Root cause:** An OpenClaw config migration overwrote the apiKey with the marker value `__OPENCLAW_KEEP__`. The config-patcher only checked whether cli-bridge models existed (line 46–53) — if they did, it skipped re-patching even though the apiKey was wrong.
|
|
22
|
+
|
|
23
|
+
### Fix (src/config-patcher.ts)
|
|
24
|
+
- Added `existingApiKey` / `hasCorrectApiKey` check to the skip-guard (line 55)
|
|
25
|
+
- Patcher now re-patches if `apiKey !== "cli-bridge"`, preventing recurrence after future config migrations
|
|
26
|
+
|
|
27
|
+
### Also in this session
|
|
28
|
+
- Fixed `~/.openclaw/openclaw.json` directly: `"apiKey": "__OPENCLAW_KEEP__"` → `"cli-bridge"`
|
|
29
|
+
- Gateway restarted — no 401 errors, self-heal model order confirmed working
|
|
30
|
+
|
|
31
|
+
### Build
|
|
32
|
+
- `npm run build` — ✅ (pre-existing TS errors from missing openclaw/plugin-sdk, JS emitted via `--noEmitOnError false`)
|
|
33
|
+
|
|
34
|
+
### Version
|
|
35
|
+
2.2.0 → 2.2.1
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
7
39
|
## 2026-04-09 — Session 9 (Claude Opus 4.6)
|
|
8
40
|
|
|
9
41
|
> **Agent:** claude-opus-4-6
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# NEXT_ACTIONS.md — openclaw-cli-bridge-elvatis
|
|
2
2
|
|
|
3
|
-
_Last updated: 2026-04-
|
|
3
|
+
_Last updated: 2026-04-10_
|
|
4
4
|
|
|
5
5
|
<!-- SECTION: summary -->
|
|
6
6
|
## Status Summary
|
|
7
7
|
|
|
8
8
|
| Status | Count |
|
|
9
9
|
|---------|-------|
|
|
10
|
-
| Done |
|
|
10
|
+
| Done | 18 |
|
|
11
11
|
| Ready | 0 |
|
|
12
12
|
| Blocked | 0 |
|
|
13
13
|
<!-- /SECTION: summary -->
|
|
@@ -30,6 +30,7 @@ _No blocked tasks._
|
|
|
30
30
|
|
|
31
31
|
| Task | Title | Date |
|
|
32
32
|
|-------|--------------------------------------------------------------------|------------|
|
|
33
|
+
| T-018 | Fix vllm apiKey corruption (401) + harden config-patcher (v2.2.1)| 2026-04-10 |
|
|
33
34
|
| T-017 | Fix log spam, restart loops, CLI blocking (v2.2.0) | 2026-04-09 |
|
|
34
35
|
| T-016 | Issue #2: Codex auth auto-import into agent auth store | 2026-03-19 |
|
|
35
36
|
| T-015 | Issue #4: Background session mgmt with workdir isolation | 2026-03-19 |
|
package/.ai/handoff/STATUS.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# STATUS — openclaw-cli-bridge-elvatis
|
|
2
2
|
|
|
3
|
-
## Current Version: 2.2.
|
|
3
|
+
## Current Version: 2.2.2
|
|
4
4
|
|
|
5
|
-
- **npm:** @elvatis_com/openclaw-cli-bridge-elvatis@2.2.
|
|
6
|
-
- **ClawHub:** openclaw-cli-bridge-elvatis@2.2.
|
|
5
|
+
- **npm:** @elvatis_com/openclaw-cli-bridge-elvatis@2.2.2
|
|
6
|
+
- **ClawHub:** openclaw-cli-bridge-elvatis@2.2.2
|
|
7
7
|
- **GitHub:** https://github.com/elvatis/openclaw-cli-bridge-elvatis (pushed to main)
|
|
8
8
|
|
|
9
9
|
## CLI Model Token Limits (corrected in v1.9.2)
|
|
@@ -47,6 +47,7 @@ This is by design — CLI tools output plain text only.
|
|
|
47
47
|
- /bridge-status shows cookie-based status
|
|
48
48
|
|
|
49
49
|
## Release History (recent)
|
|
50
|
+
- v2.2.1 (2026-04-10): Fix vllm apiKey corruption (401 Unauthorized) + harden config-patcher to re-patch on wrong apiKey
|
|
50
51
|
- v2.2.0 (2026-04-09): Fix log spam (module-level guards), remove fuser -k restart loops, session restore gateway-only, EADDRINUSE graceful handling
|
|
51
52
|
- v2.1.0 (2026-03-19): Issue #6 workdir isolation, Issue #4 session mgmt enhancements, Issue #2 codex auth auto-import
|
|
52
53
|
- v2.0.0: Major version bump
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> OpenClaw plugin that bridges locally installed AI CLIs (Codex, Gemini, Claude Code, OpenCode, Pi) as model providers — with slash commands for instant model switching, restore, health testing, and model listing.
|
|
4
4
|
|
|
5
|
-
**Current version:** `2.2.
|
|
5
|
+
**Current version:** `2.2.2`
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -376,6 +376,9 @@ npm run ci # lint + typecheck + test
|
|
|
376
376
|
|
|
377
377
|
## Changelog
|
|
378
378
|
|
|
379
|
+
### v2.2.1
|
|
380
|
+
- **fix:** Config-patcher now validates `apiKey` value — re-patches if `__OPENCLAW_KEEP__` or any wrong value is present (prevents vllm 401 Unauthorized after config migrations)
|
|
381
|
+
|
|
379
382
|
### v2.2.0
|
|
380
383
|
- **fix:** Module-level guards prevent duplicate log spam — `register()` is called per-agent (~11×), now logs Chrome/provider/commands only once
|
|
381
384
|
- **fix:** Shortened command registration log: count + `/cli-list` reference instead of listing all 32 commands
|
package/index.ts
CHANGED
|
@@ -240,20 +240,12 @@ let _cdpBrowserLaunchPromise: Promise<import("playwright").BrowserContext | null
|
|
|
240
240
|
// Set to true after first run; hot-reloads see true and skip the restore loop.
|
|
241
241
|
let _startupRestoreDone = false;
|
|
242
242
|
|
|
243
|
-
//
|
|
244
|
-
//
|
|
245
|
-
//
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
// Proxy start guard — prevents multiple concurrent startProxy() calls from
|
|
249
|
-
// racing. The first call wins; subsequent calls detect the running proxy via
|
|
250
|
-
// probeExisting() and reuse it silently.
|
|
243
|
+
// ── Proxy guards ─────────────────────────────────────────────────────────────
|
|
244
|
+
// register() is called per-agent (~11×) AND on every hot-reload (~60s).
|
|
245
|
+
// All noisy info logs removed. Only warnings/errors remain. These simple
|
|
246
|
+
// module-level booleans are sufficient — probeExisting() handles the real
|
|
247
|
+
// deduplication for the proxy.
|
|
251
248
|
let _proxyStarted = false;
|
|
252
|
-
|
|
253
|
-
// Tracks whether THIS process owns the proxy (freshly started it, not just reusing
|
|
254
|
-
// an external one). Used to decide if heavyweight startup tasks (session restores,
|
|
255
|
-
// keep-alive intervals) should run. Short-lived CLI commands (models status, doctor)
|
|
256
|
-
// reuse the gateway's proxy but should NOT launch Chromium instances.
|
|
257
249
|
let _proxyOwnedByThisProcess = false;
|
|
258
250
|
|
|
259
251
|
// Session keep-alive interval — refreshes browser cookies every 20h
|
|
@@ -1026,16 +1018,13 @@ const plugin = {
|
|
|
1026
1018
|
// Stealth mode uses channel: "chrome" (real system Chrome). If it's missing,
|
|
1027
1019
|
// browser launches will fail or Cloudflare will block the bundled Chromium.
|
|
1028
1020
|
const chromeCheck = checkSystemChrome();
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
`Install with: sudo apt install google-chrome-stable (or chromium-browser)`
|
|
1037
|
-
);
|
|
1038
|
-
}
|
|
1021
|
+
// Chrome warning only — success is silent (logged hundreds of times per minute otherwise)
|
|
1022
|
+
if (!chromeCheck.available) {
|
|
1023
|
+
api.logger.warn(
|
|
1024
|
+
`[cli-bridge] ⚠ system Chrome not found! Web browser providers (/grok-login, /gemini-login, etc.) ` +
|
|
1025
|
+
`require Google Chrome or Chromium installed system-wide. ` +
|
|
1026
|
+
`Install with: sudo apt install google-chrome-stable (or chromium-browser)`
|
|
1027
|
+
);
|
|
1039
1028
|
}
|
|
1040
1029
|
|
|
1041
1030
|
// ── Session restore: only on first plugin load (not on hot-reloads) ──────
|
|
@@ -1284,27 +1273,23 @@ const plugin = {
|
|
|
1284
1273
|
},
|
|
1285
1274
|
});
|
|
1286
1275
|
|
|
1287
|
-
|
|
1288
|
-
api.logger.info("[cli-bridge] openai-codex provider registered");
|
|
1289
|
-
}
|
|
1276
|
+
// Provider registration is silent — logged hundreds of times otherwise
|
|
1290
1277
|
|
|
1291
1278
|
// Auto-import Codex CLI credentials into the agent auth store (Issue #2).
|
|
1292
1279
|
// This ensures `openai-codex/*` models work immediately without manual
|
|
1293
1280
|
// `openclaw models auth login`. Runs async, non-blocking.
|
|
1294
|
-
//
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
});
|
|
1307
|
-
}
|
|
1281
|
+
// Codex auth import: silent log callback (suppress "already up-to-date" spam)
|
|
1282
|
+
// Only log on actual import or error — not on skip/already-current.
|
|
1283
|
+
void importCodexAuth({
|
|
1284
|
+
codexAuthPath,
|
|
1285
|
+
log: () => {}, // silent — internal "already up-to-date" spam suppressed
|
|
1286
|
+
}).then((result) => {
|
|
1287
|
+
if (result.imported) {
|
|
1288
|
+
api.logger.info("[cli-bridge] Codex auth auto-imported into agent auth store ✅");
|
|
1289
|
+
} else if (result.error) {
|
|
1290
|
+
api.logger.warn(`[cli-bridge] Codex auth import failed: ${result.error}`);
|
|
1291
|
+
}
|
|
1292
|
+
});
|
|
1308
1293
|
}
|
|
1309
1294
|
|
|
1310
1295
|
// ── Phase 2: CLI request proxy ─────────────────────────────────────────────
|
|
@@ -1331,14 +1316,14 @@ const plugin = {
|
|
|
1331
1316
|
|
|
1332
1317
|
const startProxy = async (): Promise<void> => {
|
|
1333
1318
|
// Guard: only the first register() call starts the proxy.
|
|
1334
|
-
// Subsequent per-agent calls skip entirely.
|
|
1319
|
+
// Subsequent per-agent calls AND hot-reloads skip entirely.
|
|
1335
1320
|
if (_proxyStarted) return;
|
|
1336
1321
|
_proxyStarted = true;
|
|
1337
1322
|
|
|
1338
1323
|
// If a healthy proxy is already up, reuse it — no need to rebind.
|
|
1339
1324
|
const alive = await probeExisting();
|
|
1340
1325
|
if (alive) {
|
|
1341
|
-
|
|
1326
|
+
// Silent — this fires on every hot-reload (~60s) and every register() call
|
|
1342
1327
|
return;
|
|
1343
1328
|
}
|
|
1344
1329
|
|
|
@@ -2476,10 +2461,7 @@ const plugin = {
|
|
|
2476
2461
|
"/bridge-status",
|
|
2477
2462
|
"/cli-help",
|
|
2478
2463
|
];
|
|
2479
|
-
|
|
2480
|
-
api.logger.info(`[cli-bridge] registered ${allCommands.length} commands (use /cli-list to see all)`);
|
|
2481
|
-
}
|
|
2482
|
-
_registerLoggedOnce = true;
|
|
2464
|
+
// Command registration is silent — fires on every register() call
|
|
2483
2465
|
},
|
|
2484
2466
|
};
|
|
2485
2467
|
|
package/openclaw.plugin.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"id": "openclaw-cli-bridge-elvatis",
|
|
3
3
|
"slug": "openclaw-cli-bridge-elvatis",
|
|
4
4
|
"name": "OpenClaw CLI Bridge",
|
|
5
|
-
"version": "2.2.
|
|
5
|
+
"version": "2.2.2",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"description": "Phase 1: openai-codex auth bridge. Phase 2: local HTTP proxy routing model calls through gemini/claude CLIs (vllm provider).",
|
|
8
8
|
"providers": [
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elvatis_com/openclaw-cli-bridge-elvatis",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.2",
|
|
4
4
|
"description": "Bridges gemini, claude, and codex CLI tools as OpenClaw model providers. Reads existing CLI auth without re-login.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"openclaw": {
|
package/src/config-patcher.ts
CHANGED
|
@@ -52,7 +52,10 @@ export function patchOpencllawConfig(port: number): PatchResult {
|
|
|
52
52
|
!!allowedModels["vllm/cli-gemini/gemini-2.5-pro"] ||
|
|
53
53
|
!!allowedModels["vllm/cli-claude/claude-sonnet-4-6"];
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
const existingApiKey = (cfg as any)?.models?.providers?.vllm?.apiKey;
|
|
56
|
+
const hasCorrectApiKey = existingApiKey === CLI_BRIDGE_API_KEY;
|
|
57
|
+
|
|
58
|
+
if (hasBridgeProviderModels && hasBridgeAllowlist && hasCorrectApiKey) {
|
|
56
59
|
return { patched: false, reason: "vllm provider + agent allowlist already include cli-bridge models." };
|
|
57
60
|
}
|
|
58
61
|
|