@congzhen/changewayguard 6.8.12
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/LICENSE +21 -0
- package/README.md +270 -0
- package/dashboard-dist/api/104.index.js +1420 -0
- package/dashboard-dist/api/104.index.js.map +1 -0
- package/dashboard-dist/api/113.index.js +496 -0
- package/dashboard-dist/api/113.index.js.map +1 -0
- package/dashboard-dist/api/18.index.js +67 -0
- package/dashboard-dist/api/18.index.js.map +1 -0
- package/dashboard-dist/api/217.index.js +44 -0
- package/dashboard-dist/api/217.index.js.map +1 -0
- package/dashboard-dist/api/222.index.js +90 -0
- package/dashboard-dist/api/222.index.js.map +1 -0
- package/dashboard-dist/api/25.index.js +3562 -0
- package/dashboard-dist/api/25.index.js.map +1 -0
- package/dashboard-dist/api/280.index.js +206 -0
- package/dashboard-dist/api/280.index.js.map +1 -0
- package/dashboard-dist/api/369.index.js +115 -0
- package/dashboard-dist/api/369.index.js.map +1 -0
- package/dashboard-dist/api/377.index.js +1176 -0
- package/dashboard-dist/api/377.index.js.map +1 -0
- package/dashboard-dist/api/411.index.js +4250 -0
- package/dashboard-dist/api/411.index.js.map +1 -0
- package/dashboard-dist/api/424.index.js +135 -0
- package/dashboard-dist/api/424.index.js.map +1 -0
- package/dashboard-dist/api/573.index.js +806 -0
- package/dashboard-dist/api/573.index.js.map +1 -0
- package/dashboard-dist/api/598.index.js +328 -0
- package/dashboard-dist/api/598.index.js.map +1 -0
- package/dashboard-dist/api/62.index.js +4151 -0
- package/dashboard-dist/api/62.index.js.map +1 -0
- package/dashboard-dist/api/67.index.js +23383 -0
- package/dashboard-dist/api/67.index.js.map +1 -0
- package/dashboard-dist/api/678.index.js +2734 -0
- package/dashboard-dist/api/678.index.js.map +1 -0
- package/dashboard-dist/api/698.index.js +1896 -0
- package/dashboard-dist/api/698.index.js.map +1 -0
- package/dashboard-dist/api/720.index.js +98 -0
- package/dashboard-dist/api/720.index.js.map +1 -0
- package/dashboard-dist/api/830.index.js +95 -0
- package/dashboard-dist/api/830.index.js.map +1 -0
- package/dashboard-dist/api/831.index.js +99 -0
- package/dashboard-dist/api/831.index.js.map +1 -0
- package/dashboard-dist/api/84.index.js +64 -0
- package/dashboard-dist/api/84.index.js.map +1 -0
- package/dashboard-dist/api/900.index.js +65 -0
- package/dashboard-dist/api/900.index.js.map +1 -0
- package/dashboard-dist/api/917.index.js +88 -0
- package/dashboard-dist/api/917.index.js.map +1 -0
- package/dashboard-dist/api/948.index.js +64 -0
- package/dashboard-dist/api/948.index.js.map +1 -0
- package/dashboard-dist/api/953.index.js +67 -0
- package/dashboard-dist/api/953.index.js.map +1 -0
- package/dashboard-dist/api/975.index.js +374 -0
- package/dashboard-dist/api/975.index.js.map +1 -0
- package/dashboard-dist/api/drizzle/sqlite/0000_short_captain_stacy.sql +70 -0
- package/dashboard-dist/api/drizzle/sqlite/0001_closed_magus.sql +10 -0
- package/dashboard-dist/api/drizzle/sqlite/0002_agent_capability_observation.sql +38 -0
- package/dashboard-dist/api/drizzle/sqlite/0003_auth_magic_link.sql +28 -0
- package/dashboard-dist/api/drizzle/sqlite/0004_static_scan_fields.sql +8 -0
- package/dashboard-dist/api/drizzle/sqlite/0005_gateway_activity.sql +24 -0
- package/dashboard-dist/api/drizzle/sqlite/0006_sour_marauders.sql +41 -0
- package/dashboard-dist/api/drizzle/sqlite/meta/0000_snapshot.json +460 -0
- package/dashboard-dist/api/drizzle/sqlite/meta/0001_snapshot.json +536 -0
- package/dashboard-dist/api/drizzle/sqlite/meta/0006_snapshot.json +1249 -0
- package/dashboard-dist/api/drizzle/sqlite/meta/_journal.json +55 -0
- package/dashboard-dist/api/index.js +27340 -0
- package/dashboard-dist/api/index.js.map +1 -0
- package/dashboard-dist/api/package.json +16 -0
- package/dashboard-dist/api/sourcemap-register.cjs +1 -0
- package/dashboard-dist/web/assets/index-CqWIeBTD.js +158 -0
- package/dashboard-dist/web/assets/index-Dw7--9q4.css +1 -0
- package/dashboard-dist/web/changeway-logo.png +0 -0
- package/dashboard-dist/web/favicon.svg +29 -0
- package/dashboard-dist/web/index.html +14 -0
- package/dashboard-dist/web/logo.svg +16 -0
- package/dist/agent/auth.d.ts +37 -0
- package/dist/agent/auth.d.ts.map +1 -0
- package/dist/agent/auth.js +151 -0
- package/dist/agent/auth.js.map +1 -0
- package/dist/agent/behavior-detector.d.ts +150 -0
- package/dist/agent/behavior-detector.d.ts.map +1 -0
- package/dist/agent/behavior-detector.js +573 -0
- package/dist/agent/behavior-detector.js.map +1 -0
- package/dist/agent/business-reporter.d.ts +114 -0
- package/dist/agent/business-reporter.d.ts.map +1 -0
- package/dist/agent/business-reporter.js +359 -0
- package/dist/agent/business-reporter.js.map +1 -0
- package/dist/agent/config-sync.d.ts +70 -0
- package/dist/agent/config-sync.d.ts.map +1 -0
- package/dist/agent/config-sync.js +133 -0
- package/dist/agent/config-sync.js.map +1 -0
- package/dist/agent/config.d.ts +97 -0
- package/dist/agent/config.d.ts.map +1 -0
- package/dist/agent/config.js +359 -0
- package/dist/agent/config.js.map +1 -0
- package/dist/agent/content-injection-scanner.d.ts +35 -0
- package/dist/agent/content-injection-scanner.d.ts.map +1 -0
- package/dist/agent/content-injection-scanner.js +270 -0
- package/dist/agent/content-injection-scanner.js.map +1 -0
- package/dist/agent/engine-log-writer.d.ts +6 -0
- package/dist/agent/engine-log-writer.d.ts.map +1 -0
- package/dist/agent/engine-log-writer.js +18 -0
- package/dist/agent/engine-log-writer.js.map +1 -0
- package/dist/agent/env.d.ts +19 -0
- package/dist/agent/env.d.ts.map +1 -0
- package/dist/agent/env.js +43 -0
- package/dist/agent/env.js.map +1 -0
- package/dist/agent/event-reporter.d.ts +87 -0
- package/dist/agent/event-reporter.d.ts.map +1 -0
- package/dist/agent/event-reporter.js +315 -0
- package/dist/agent/event-reporter.js.map +1 -0
- package/dist/agent/file-watcher.d.ts +50 -0
- package/dist/agent/file-watcher.d.ts.map +1 -0
- package/dist/agent/file-watcher.js +135 -0
- package/dist/agent/file-watcher.js.map +1 -0
- package/dist/agent/fs-utils.d.ts +22 -0
- package/dist/agent/fs-utils.d.ts.map +1 -0
- package/dist/agent/fs-utils.js +41 -0
- package/dist/agent/fs-utils.js.map +1 -0
- package/dist/agent/gateway-manager.d.ts +59 -0
- package/dist/agent/gateway-manager.d.ts.map +1 -0
- package/dist/agent/gateway-manager.js +583 -0
- package/dist/agent/gateway-manager.js.map +1 -0
- package/dist/agent/hook-types.d.ts +276 -0
- package/dist/agent/hook-types.d.ts.map +1 -0
- package/dist/agent/hook-types.js +51 -0
- package/dist/agent/hook-types.js.map +1 -0
- package/dist/agent/index.d.ts +8 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +8 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/prompt-gate.d.ts +13 -0
- package/dist/agent/prompt-gate.d.ts.map +1 -0
- package/dist/agent/prompt-gate.js +28 -0
- package/dist/agent/prompt-gate.js.map +1 -0
- package/dist/agent/prompt-input.d.ts +9 -0
- package/dist/agent/prompt-input.d.ts.map +1 -0
- package/dist/agent/prompt-input.js +158 -0
- package/dist/agent/prompt-input.js.map +1 -0
- package/dist/agent/prompt-output.d.ts +4 -0
- package/dist/agent/prompt-output.d.ts.map +1 -0
- package/dist/agent/prompt-output.js +19 -0
- package/dist/agent/prompt-output.js.map +1 -0
- package/dist/agent/runner.d.ts +23 -0
- package/dist/agent/runner.d.ts.map +1 -0
- package/dist/agent/runner.js +154 -0
- package/dist/agent/runner.js.map +1 -0
- package/dist/agent/sanitizer.d.ts +10 -0
- package/dist/agent/sanitizer.d.ts.map +1 -0
- package/dist/agent/sanitizer.js +175 -0
- package/dist/agent/sanitizer.js.map +1 -0
- package/dist/agent/scan-activity.d.ts +18 -0
- package/dist/agent/scan-activity.d.ts.map +1 -0
- package/dist/agent/scan-activity.js +32 -0
- package/dist/agent/scan-activity.js.map +1 -0
- package/dist/agent/types.d.ts +177 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +5 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agent/workspace-scanner.d.ts +35 -0
- package/dist/agent/workspace-scanner.d.ts.map +1 -0
- package/dist/agent/workspace-scanner.js +137 -0
- package/dist/agent/workspace-scanner.js.map +1 -0
- package/dist/dashboard-launcher.d.ts +52 -0
- package/dist/dashboard-launcher.d.ts.map +1 -0
- package/dist/dashboard-launcher.js +363 -0
- package/dist/dashboard-launcher.js.map +1 -0
- package/dist/gateway/activity.d.ts +52 -0
- package/dist/gateway/activity.d.ts.map +1 -0
- package/dist/gateway/activity.js +111 -0
- package/dist/gateway/activity.js.map +1 -0
- package/dist/gateway/config.d.ts +50 -0
- package/dist/gateway/config.d.ts.map +1 -0
- package/dist/gateway/config.js +200 -0
- package/dist/gateway/config.js.map +1 -0
- package/dist/gateway/gateway/activity.d.ts +52 -0
- package/dist/gateway/gateway/activity.d.ts.map +1 -0
- package/dist/gateway/gateway/activity.js +111 -0
- package/dist/gateway/gateway/activity.js.map +1 -0
- package/dist/gateway/gateway/config.d.ts +50 -0
- package/dist/gateway/gateway/config.d.ts.map +1 -0
- package/dist/gateway/gateway/config.js +200 -0
- package/dist/gateway/gateway/config.js.map +1 -0
- package/dist/gateway/gateway/handlers/anthropic.d.ts +12 -0
- package/dist/gateway/gateway/handlers/anthropic.d.ts.map +1 -0
- package/dist/gateway/gateway/handlers/anthropic.js +254 -0
- package/dist/gateway/gateway/handlers/anthropic.js.map +1 -0
- package/dist/gateway/gateway/handlers/gemini.d.ts +12 -0
- package/dist/gateway/gateway/handlers/gemini.d.ts.map +1 -0
- package/dist/gateway/gateway/handlers/gemini.js +101 -0
- package/dist/gateway/gateway/handlers/gemini.js.map +1 -0
- package/dist/gateway/gateway/handlers/models.d.ts +4 -0
- package/dist/gateway/gateway/handlers/models.d.ts.map +1 -0
- package/dist/gateway/gateway/handlers/models.js +36 -0
- package/dist/gateway/gateway/handlers/models.js.map +1 -0
- package/dist/gateway/gateway/handlers/openai.d.ts +16 -0
- package/dist/gateway/gateway/handlers/openai.d.ts.map +1 -0
- package/dist/gateway/gateway/handlers/openai.js +254 -0
- package/dist/gateway/gateway/handlers/openai.js.map +1 -0
- package/dist/gateway/gateway/index.d.ts +27 -0
- package/dist/gateway/gateway/index.d.ts.map +1 -0
- package/dist/gateway/gateway/index.js +293 -0
- package/dist/gateway/gateway/index.js.map +1 -0
- package/dist/gateway/gateway/mapping-store.d.ts +38 -0
- package/dist/gateway/gateway/mapping-store.d.ts.map +1 -0
- package/dist/gateway/gateway/mapping-store.js +74 -0
- package/dist/gateway/gateway/mapping-store.js.map +1 -0
- package/dist/gateway/gateway/restorer.d.ts +63 -0
- package/dist/gateway/gateway/restorer.d.ts.map +1 -0
- package/dist/gateway/gateway/restorer.js +284 -0
- package/dist/gateway/gateway/restorer.js.map +1 -0
- package/dist/gateway/gateway/sanitizer.d.ts +17 -0
- package/dist/gateway/gateway/sanitizer.d.ts.map +1 -0
- package/dist/gateway/gateway/sanitizer.js +228 -0
- package/dist/gateway/gateway/sanitizer.js.map +1 -0
- package/dist/gateway/gateway/types.d.ts +53 -0
- package/dist/gateway/gateway/types.d.ts.map +1 -0
- package/dist/gateway/gateway/types.js +5 -0
- package/dist/gateway/gateway/types.js.map +1 -0
- package/dist/gateway/handlers/anthropic.d.ts +12 -0
- package/dist/gateway/handlers/anthropic.d.ts.map +1 -0
- package/dist/gateway/handlers/anthropic.js +254 -0
- package/dist/gateway/handlers/anthropic.js.map +1 -0
- package/dist/gateway/handlers/gemini.d.ts +12 -0
- package/dist/gateway/handlers/gemini.d.ts.map +1 -0
- package/dist/gateway/handlers/gemini.js +101 -0
- package/dist/gateway/handlers/gemini.js.map +1 -0
- package/dist/gateway/handlers/models.d.ts +4 -0
- package/dist/gateway/handlers/models.d.ts.map +1 -0
- package/dist/gateway/handlers/models.js +36 -0
- package/dist/gateway/handlers/models.js.map +1 -0
- package/dist/gateway/handlers/openai.d.ts +16 -0
- package/dist/gateway/handlers/openai.d.ts.map +1 -0
- package/dist/gateway/handlers/openai.js +254 -0
- package/dist/gateway/handlers/openai.js.map +1 -0
- package/dist/gateway/index.d.ts +27 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +293 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/mapping-store.d.ts +38 -0
- package/dist/gateway/mapping-store.d.ts.map +1 -0
- package/dist/gateway/mapping-store.js +74 -0
- package/dist/gateway/mapping-store.js.map +1 -0
- package/dist/gateway/restorer.d.ts +63 -0
- package/dist/gateway/restorer.d.ts.map +1 -0
- package/dist/gateway/restorer.js +284 -0
- package/dist/gateway/restorer.js.map +1 -0
- package/dist/gateway/sanitizer.d.ts +17 -0
- package/dist/gateway/sanitizer.d.ts.map +1 -0
- package/dist/gateway/sanitizer.js +228 -0
- package/dist/gateway/sanitizer.js.map +1 -0
- package/dist/gateway/types.d.ts +53 -0
- package/dist/gateway/types.d.ts.map +1 -0
- package/dist/gateway/types.js +5 -0
- package/dist/gateway/types.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2084 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +5 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +5 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/store.d.ts +82 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +194 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/platform-client/index.d.ts +63 -0
- package/dist/platform-client/index.d.ts.map +1 -0
- package/dist/platform-client/index.js +294 -0
- package/dist/platform-client/index.js.map +1 -0
- package/dist/platform-client/types.d.ts +109 -0
- package/dist/platform-client/types.d.ts.map +1 -0
- package/dist/platform-client/types.js +3 -0
- package/dist/platform-client/types.js.map +1 -0
- package/gateway/activity.d.ts +52 -0
- package/gateway/activity.d.ts.map +1 -0
- package/gateway/activity.js +111 -0
- package/gateway/activity.js.map +1 -0
- package/gateway/config.d.ts +50 -0
- package/gateway/config.d.ts.map +1 -0
- package/gateway/config.js +200 -0
- package/gateway/config.js.map +1 -0
- package/gateway/handlers/anthropic.d.ts +12 -0
- package/gateway/handlers/anthropic.d.ts.map +1 -0
- package/gateway/handlers/anthropic.js +254 -0
- package/gateway/handlers/anthropic.js.map +1 -0
- package/gateway/handlers/gemini.d.ts +12 -0
- package/gateway/handlers/gemini.d.ts.map +1 -0
- package/gateway/handlers/gemini.js +101 -0
- package/gateway/handlers/gemini.js.map +1 -0
- package/gateway/handlers/models.d.ts +4 -0
- package/gateway/handlers/models.d.ts.map +1 -0
- package/gateway/handlers/models.js +36 -0
- package/gateway/handlers/models.js.map +1 -0
- package/gateway/handlers/openai.d.ts +16 -0
- package/gateway/handlers/openai.d.ts.map +1 -0
- package/gateway/handlers/openai.js +254 -0
- package/gateway/handlers/openai.js.map +1 -0
- package/gateway/index.d.ts +27 -0
- package/gateway/index.d.ts.map +1 -0
- package/gateway/index.js +293 -0
- package/gateway/index.js.map +1 -0
- package/gateway/mapping-store.d.ts +38 -0
- package/gateway/mapping-store.d.ts.map +1 -0
- package/gateway/mapping-store.js +74 -0
- package/gateway/mapping-store.js.map +1 -0
- package/gateway/restorer.d.ts +63 -0
- package/gateway/restorer.d.ts.map +1 -0
- package/gateway/restorer.js +284 -0
- package/gateway/restorer.js.map +1 -0
- package/gateway/sanitizer.d.ts +17 -0
- package/gateway/sanitizer.d.ts.map +1 -0
- package/gateway/sanitizer.js +228 -0
- package/gateway/sanitizer.js.map +1 -0
- package/gateway/types.d.ts +53 -0
- package/gateway/types.d.ts.map +1 -0
- package/gateway/types.js +5 -0
- package/gateway/types.js.map +1 -0
- package/openclaw.plugin.json +86 -0
- package/package.json +74 -0
- package/samples/Untitled +1 -0
- package/samples/clean-email.txt +20 -0
- package/samples/test-document.md +53 -0
- package/samples/test-email-popup.txt +44 -0
- package/samples/test-email.txt +32 -0
- package/samples/test-webpage.html +51 -0
- package/scripts/enterprise-enroll.sh +89 -0
- package/scripts/enterprise-unenroll.sh +75 -0
|
@@ -0,0 +1,583 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Security Gateway Manager (Version 2)
|
|
3
|
+
*
|
|
4
|
+
* Strategy:
|
|
5
|
+
* - Modify openclaw.json instead of agents star/agent/models.json
|
|
6
|
+
* - Because ensureOpenClawModelsJson() overwrites models.json with openclaw.json
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, mkdirSync, writeFileSync, unlinkSync, readdirSync } from "node:fs";
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import os from "node:os";
|
|
11
|
+
import { startGateway as startGatewayServer, stopGateway as stopGatewayServer, isGatewayServerRunning, addActivityListener } from "../gateway/index.js";
|
|
12
|
+
import { loadJsonSync } from "./fs-utils.js";
|
|
13
|
+
import { buildSignedAuthHeadersForUrl, withChangewayOpenPrefix } from "./auth.js";
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// Constants
|
|
16
|
+
// =============================================================================
|
|
17
|
+
const OPENCLAW_DIR = path.join(os.homedir(), ".openclaw");
|
|
18
|
+
const OPENCLAW_CONFIG = path.join(OPENCLAW_DIR, "openclaw.json");
|
|
19
|
+
const MOLTGUARD_DATA_DIR = path.join(OPENCLAW_DIR, "extensions/changewayguard/data");
|
|
20
|
+
const GATEWAY_CONFIG = path.join(MOLTGUARD_DATA_DIR, "gateway.json");
|
|
21
|
+
const GATEWAY_BACKUP = path.join(MOLTGUARD_DATA_DIR, "gateway-backup.json");
|
|
22
|
+
const DEFAULT_GATEWAY_PORT = 53669;
|
|
23
|
+
const GATEWAY_SERVER_URL = `http://127.0.0.1:${DEFAULT_GATEWAY_PORT}`;
|
|
24
|
+
/**
|
|
25
|
+
* Check if a string looks like an API key placeholder (e.g., "VLLM_API_KEY", "OPENAI_API_KEY")
|
|
26
|
+
*/
|
|
27
|
+
function isApiKeyPlaceholder(value) {
|
|
28
|
+
// Placeholder pattern: UPPERCASE_LETTERS with underscores, ending with _API_KEY or _KEY
|
|
29
|
+
return /^[A-Z][A-Z0-9_]*(_API_KEY|_KEY)$/.test(value);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Load auth-profiles.json for a specific agent
|
|
33
|
+
*/
|
|
34
|
+
function loadAuthProfiles(agentId = "main") {
|
|
35
|
+
const authProfilesPath = path.join(OPENCLAW_DIR, "agents", agentId, "agent", "auth-profiles.json");
|
|
36
|
+
try {
|
|
37
|
+
if (existsSync(authProfilesPath)) {
|
|
38
|
+
return loadJsonSync(authProfilesPath);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Ignore errors
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resolve API key from auth-profiles.json
|
|
48
|
+
* @param providerName - Provider name (e.g., "vllm")
|
|
49
|
+
* @param placeholder - The placeholder value (e.g., "VLLM_API_KEY")
|
|
50
|
+
* @returns The actual API key, or the placeholder if not found
|
|
51
|
+
*/
|
|
52
|
+
function resolveApiKey(providerName, placeholder) {
|
|
53
|
+
// If not a placeholder, return as-is
|
|
54
|
+
if (!isApiKeyPlaceholder(placeholder)) {
|
|
55
|
+
return placeholder;
|
|
56
|
+
}
|
|
57
|
+
// Try to load auth profiles from main agent
|
|
58
|
+
const authProfiles = loadAuthProfiles("main");
|
|
59
|
+
if (!authProfiles?.profiles) {
|
|
60
|
+
return placeholder;
|
|
61
|
+
}
|
|
62
|
+
// Look for matching profile (e.g., "vllm:default")
|
|
63
|
+
const profileKey = `${providerName}:default`;
|
|
64
|
+
const profile = authProfiles.profiles[profileKey];
|
|
65
|
+
if (profile?.type === "api_key" && profile.key) {
|
|
66
|
+
return profile.key;
|
|
67
|
+
}
|
|
68
|
+
// Also try just the provider name
|
|
69
|
+
const directProfile = authProfiles.profiles[providerName];
|
|
70
|
+
if (directProfile?.type === "api_key" && directProfile.key) {
|
|
71
|
+
return directProfile.key;
|
|
72
|
+
}
|
|
73
|
+
return placeholder;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Convert original baseUrl to gateway URL using backend name as identifier
|
|
77
|
+
* e.g., providerName="vllm" -> http://127.0.0.1:53669/backend/vllm
|
|
78
|
+
*/
|
|
79
|
+
function toGatewayUrl(providerName) {
|
|
80
|
+
return `${GATEWAY_SERVER_URL}/backend/${providerName}`;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Check if a baseUrl is pointing to the gateway
|
|
84
|
+
*/
|
|
85
|
+
function isGatewayUrl(baseUrl) {
|
|
86
|
+
return baseUrl.startsWith(GATEWAY_SERVER_URL);
|
|
87
|
+
}
|
|
88
|
+
// =============================================================================
|
|
89
|
+
// Gateway Server Management
|
|
90
|
+
// =============================================================================
|
|
91
|
+
let gatewayRunning = false;
|
|
92
|
+
let dashboardPort = null;
|
|
93
|
+
let dashboardToken = null;
|
|
94
|
+
/**
|
|
95
|
+
* Set dashboard port for activity reporting
|
|
96
|
+
*/
|
|
97
|
+
export function setDashboardPort(port) {
|
|
98
|
+
dashboardPort = port;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Set dashboard session token for authentication
|
|
102
|
+
*/
|
|
103
|
+
export function setDashboardToken(token) {
|
|
104
|
+
dashboardToken = token;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Load dashboard session token from file
|
|
108
|
+
*/
|
|
109
|
+
function loadDashboardToken() {
|
|
110
|
+
const tokenFile = path.join(OPENCLAW_DIR, "credentials", "changewayguard", "dashboard-session-token");
|
|
111
|
+
try {
|
|
112
|
+
if (existsSync(tokenFile)) {
|
|
113
|
+
const data = loadJsonSync(tokenFile);
|
|
114
|
+
return data.token || null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Ignore errors
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Report gateway activity to dashboard
|
|
124
|
+
*/
|
|
125
|
+
async function reportActivity(event) {
|
|
126
|
+
if (!dashboardPort) {
|
|
127
|
+
// Dashboard port not set, skip activity report
|
|
128
|
+
return; // Dashboard not running, skip reporting
|
|
129
|
+
}
|
|
130
|
+
// Try to load token if not set
|
|
131
|
+
if (!dashboardToken) {
|
|
132
|
+
dashboardToken = loadDashboardToken();
|
|
133
|
+
}
|
|
134
|
+
if (!dashboardToken) {
|
|
135
|
+
// Dashboard token not available, skip activity report
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
// Report activity silently
|
|
139
|
+
try {
|
|
140
|
+
const url = withChangewayOpenPrefix(`http://127.0.0.1:${dashboardPort}/api/gateway/activity`);
|
|
141
|
+
const response = await fetch(url, {
|
|
142
|
+
method: "POST",
|
|
143
|
+
headers: {
|
|
144
|
+
"Content-Type": "application/json",
|
|
145
|
+
...buildSignedAuthHeadersForUrl({
|
|
146
|
+
method: "POST",
|
|
147
|
+
url,
|
|
148
|
+
body: event,
|
|
149
|
+
authorization: `Bearer ${dashboardToken}`,
|
|
150
|
+
}),
|
|
151
|
+
},
|
|
152
|
+
body: JSON.stringify(event),
|
|
153
|
+
});
|
|
154
|
+
if (!response.ok) {
|
|
155
|
+
console.error("[moltguard] Failed to report gateway activity:", response.status);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Silently ignore errors - dashboard may not be running
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
let activityListenerRegistered = false;
|
|
163
|
+
/** Optional callback for business reporter gateway activity */
|
|
164
|
+
let gatewayActivityCallback = null;
|
|
165
|
+
/** Set a callback to receive gateway activity events for business reporting */
|
|
166
|
+
export function setGatewayActivityCallback(cb) {
|
|
167
|
+
gatewayActivityCallback = cb;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Start the gateway server (in-process, embedded mode)
|
|
171
|
+
*/
|
|
172
|
+
export function startGateway() {
|
|
173
|
+
mkdirSync(MOLTGUARD_DATA_DIR, { recursive: true });
|
|
174
|
+
if (!existsSync(GATEWAY_CONFIG)) {
|
|
175
|
+
const defaultConfig = {
|
|
176
|
+
port: DEFAULT_GATEWAY_PORT,
|
|
177
|
+
backends: {},
|
|
178
|
+
};
|
|
179
|
+
writeFileSync(GATEWAY_CONFIG, JSON.stringify(defaultConfig, null, 2) + "\n", "utf-8");
|
|
180
|
+
}
|
|
181
|
+
// Register activity listener once
|
|
182
|
+
if (!activityListenerRegistered) {
|
|
183
|
+
addActivityListener((event) => {
|
|
184
|
+
// Report asynchronously to avoid blocking gateway
|
|
185
|
+
reportActivity(event).catch((err) => {
|
|
186
|
+
console.error("[moltguard] Failed to report activity:", err);
|
|
187
|
+
});
|
|
188
|
+
// Report to business reporter (only sanitize events with actual redactions)
|
|
189
|
+
if (event.type === "sanitize" && event.redactionCount > 0 && gatewayActivityCallback) {
|
|
190
|
+
gatewayActivityCallback(event.redactionCount, event.categories);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
activityListenerRegistered = true;
|
|
194
|
+
}
|
|
195
|
+
try {
|
|
196
|
+
// Start in embedded mode (don't call process.exit on errors)
|
|
197
|
+
startGatewayServer(GATEWAY_CONFIG, true);
|
|
198
|
+
gatewayRunning = true;
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
console.error("[moltguard] Failed to start gateway:", err);
|
|
202
|
+
gatewayRunning = false;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Restart the gateway server (reload config)
|
|
207
|
+
*/
|
|
208
|
+
export async function restartGateway() {
|
|
209
|
+
// Restarting gateway
|
|
210
|
+
await stopGatewayServer();
|
|
211
|
+
gatewayRunning = false;
|
|
212
|
+
startGateway();
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Stop the gateway server completely
|
|
216
|
+
*/
|
|
217
|
+
export async function stopGateway() {
|
|
218
|
+
await stopGatewayServer();
|
|
219
|
+
gatewayRunning = false;
|
|
220
|
+
}
|
|
221
|
+
export function isGatewayRunning() {
|
|
222
|
+
// Check both our flag and the actual server state
|
|
223
|
+
return gatewayRunning && isGatewayServerRunning();
|
|
224
|
+
}
|
|
225
|
+
// =============================================================================
|
|
226
|
+
// Configuration Management
|
|
227
|
+
// =============================================================================
|
|
228
|
+
/**
|
|
229
|
+
* Read openclaw.json
|
|
230
|
+
*/
|
|
231
|
+
function readOpenClawConfig() {
|
|
232
|
+
if (!existsSync(OPENCLAW_CONFIG)) {
|
|
233
|
+
throw new Error("openclaw.json not found");
|
|
234
|
+
}
|
|
235
|
+
try {
|
|
236
|
+
return loadJsonSync(OPENCLAW_CONFIG);
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
throw new Error(`Failed to parse openclaw.json: ${err}`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Write openclaw.json
|
|
244
|
+
*/
|
|
245
|
+
function writeOpenClawConfig(config) {
|
|
246
|
+
writeFileSync(OPENCLAW_CONFIG, JSON.stringify(config, null, 2) + "\n", "utf-8");
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Determine backend type from provider config
|
|
250
|
+
*/
|
|
251
|
+
function getBackendType(provider) {
|
|
252
|
+
if (provider.api === "anthropic")
|
|
253
|
+
return "anthropic";
|
|
254
|
+
if (provider.api === "gemini")
|
|
255
|
+
return "gemini";
|
|
256
|
+
if (provider.api === "openai-completions" || provider.api === "openai")
|
|
257
|
+
return "openai";
|
|
258
|
+
// Infer from baseUrl
|
|
259
|
+
if (provider.baseUrl?.includes("anthropic.com"))
|
|
260
|
+
return "anthropic";
|
|
261
|
+
if (provider.baseUrl?.includes("gemini") || provider.baseUrl?.includes("google"))
|
|
262
|
+
return "gemini";
|
|
263
|
+
return "openai"; // Default
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Extract path from URL
|
|
267
|
+
*/
|
|
268
|
+
function extractPathFromUrl(urlString) {
|
|
269
|
+
try {
|
|
270
|
+
const url = new URL(urlString);
|
|
271
|
+
return url.pathname.endsWith("/") ? url.pathname.slice(0, -1) : url.pathname;
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
return "";
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Configure gateway with providers
|
|
279
|
+
*/
|
|
280
|
+
function configureGateway(providers) {
|
|
281
|
+
const backends = {};
|
|
282
|
+
for (const [name, provider] of Object.entries(providers)) {
|
|
283
|
+
if (!provider.baseUrl || !provider.apiKey)
|
|
284
|
+
continue;
|
|
285
|
+
// Extract path prefix from original baseUrl for routing
|
|
286
|
+
const pathPrefix = extractPathFromUrl(provider.baseUrl);
|
|
287
|
+
// Extract model IDs from provider config
|
|
288
|
+
const models = provider.models
|
|
289
|
+
?.map((m) => m.id)
|
|
290
|
+
.filter((id) => typeof id === "string");
|
|
291
|
+
// Resolve API key placeholder (e.g., "VLLM_API_KEY" -> actual key from auth-profiles.json)
|
|
292
|
+
const resolvedApiKey = resolveApiKey(name, provider.apiKey);
|
|
293
|
+
if (resolvedApiKey !== provider.apiKey) {
|
|
294
|
+
// Resolved API key placeholder
|
|
295
|
+
}
|
|
296
|
+
backends[name] = {
|
|
297
|
+
baseUrl: provider.baseUrl,
|
|
298
|
+
apiKey: resolvedApiKey,
|
|
299
|
+
type: getBackendType(provider),
|
|
300
|
+
...(pathPrefix && { pathPrefix }),
|
|
301
|
+
...(models && models.length > 0 && { models }),
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
const gatewayConfig = {
|
|
305
|
+
port: DEFAULT_GATEWAY_PORT,
|
|
306
|
+
backends,
|
|
307
|
+
};
|
|
308
|
+
mkdirSync(MOLTGUARD_DATA_DIR, { recursive: true });
|
|
309
|
+
writeFileSync(GATEWAY_CONFIG, JSON.stringify(gatewayConfig, null, 2) + "\n", "utf-8");
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Find all agent models.json files
|
|
313
|
+
*/
|
|
314
|
+
function findAgentModelsFiles() {
|
|
315
|
+
const agentsDir = path.join(OPENCLAW_DIR, "agents");
|
|
316
|
+
const modelsFiles = [];
|
|
317
|
+
if (!existsSync(agentsDir)) {
|
|
318
|
+
return modelsFiles;
|
|
319
|
+
}
|
|
320
|
+
// Find all agent directories
|
|
321
|
+
const entries = readdirSync(agentsDir, { withFileTypes: true });
|
|
322
|
+
for (const entry of entries) {
|
|
323
|
+
if (entry.isDirectory()) {
|
|
324
|
+
const modelsPath = path.join(agentsDir, entry.name, "agent", "models.json");
|
|
325
|
+
if (existsSync(modelsPath)) {
|
|
326
|
+
modelsFiles.push(modelsPath);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return modelsFiles;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Read and parse a models.json file
|
|
334
|
+
*/
|
|
335
|
+
function readModelsJson(filePath) {
|
|
336
|
+
try {
|
|
337
|
+
return loadJsonSync(filePath);
|
|
338
|
+
}
|
|
339
|
+
catch {
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Write a models.json file
|
|
345
|
+
*/
|
|
346
|
+
function writeModelsJson(filePath, data) {
|
|
347
|
+
writeFileSync(filePath, JSON.stringify(data, null, 2) + "\n", "utf-8");
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Update provider baseUrls in all agent models.json files
|
|
351
|
+
* Converts each provider's baseUrl to gateway URL while preserving the path
|
|
352
|
+
*/
|
|
353
|
+
function updateAgentModelsFiles(backupData) {
|
|
354
|
+
const modelsFiles = findAgentModelsFiles();
|
|
355
|
+
for (const filePath of modelsFiles) {
|
|
356
|
+
const data = readModelsJson(filePath);
|
|
357
|
+
if (!data?.providers)
|
|
358
|
+
continue;
|
|
359
|
+
const fileBackup = {};
|
|
360
|
+
let modified = false;
|
|
361
|
+
for (const [name, provider] of Object.entries(data.providers)) {
|
|
362
|
+
// Skip if already pointing to gateway or no baseUrl
|
|
363
|
+
if (!provider.baseUrl || isGatewayUrl(provider.baseUrl)) {
|
|
364
|
+
continue;
|
|
365
|
+
}
|
|
366
|
+
fileBackup[name] = provider.baseUrl;
|
|
367
|
+
provider.baseUrl = toGatewayUrl(name);
|
|
368
|
+
modified = true;
|
|
369
|
+
}
|
|
370
|
+
if (modified) {
|
|
371
|
+
writeModelsJson(filePath, data);
|
|
372
|
+
backupData[filePath] = {
|
|
373
|
+
files: [filePath],
|
|
374
|
+
originalBaseUrls: fileBackup,
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Restore provider baseUrls in agent models.json files from backup
|
|
381
|
+
*/
|
|
382
|
+
function restoreAgentModelsFiles(backupData) {
|
|
383
|
+
const restored = [];
|
|
384
|
+
for (const [filePath, backup] of Object.entries(backupData)) {
|
|
385
|
+
if (!existsSync(filePath))
|
|
386
|
+
continue;
|
|
387
|
+
const data = readModelsJson(filePath);
|
|
388
|
+
if (!data?.providers)
|
|
389
|
+
continue;
|
|
390
|
+
let modified = false;
|
|
391
|
+
for (const [name, originalUrl] of Object.entries(backup.originalBaseUrls)) {
|
|
392
|
+
if (data.providers[name]) {
|
|
393
|
+
data.providers[name].baseUrl = originalUrl;
|
|
394
|
+
modified = true;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
if (modified) {
|
|
398
|
+
writeModelsJson(filePath, data);
|
|
399
|
+
restored.push(filePath);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
return restored;
|
|
403
|
+
}
|
|
404
|
+
// =============================================================================
|
|
405
|
+
// Public API
|
|
406
|
+
// =============================================================================
|
|
407
|
+
/**
|
|
408
|
+
* Enable AI Security Gateway
|
|
409
|
+
* Modifies openclaw.json to route all providers through gateway
|
|
410
|
+
*/
|
|
411
|
+
export async function enableGateway() {
|
|
412
|
+
// Check if already enabled
|
|
413
|
+
if (existsSync(GATEWAY_BACKUP)) {
|
|
414
|
+
throw new Error("Gateway is already enabled. Disable it first with '/og_sanitize off'");
|
|
415
|
+
}
|
|
416
|
+
// Read openclaw.json
|
|
417
|
+
const config = readOpenClawConfig();
|
|
418
|
+
if (!config.models?.providers) {
|
|
419
|
+
throw new Error("No providers found in openclaw.json");
|
|
420
|
+
}
|
|
421
|
+
const providers = config.models.providers;
|
|
422
|
+
const backup = {
|
|
423
|
+
timestamp: new Date().toISOString(),
|
|
424
|
+
routedProviders: {},
|
|
425
|
+
};
|
|
426
|
+
const routedProviders = [];
|
|
427
|
+
const originalProviders = {};
|
|
428
|
+
const skipped = [];
|
|
429
|
+
// Process each provider
|
|
430
|
+
for (const [name, provider] of Object.entries(providers)) {
|
|
431
|
+
// Skip if already pointing to gateway
|
|
432
|
+
if (provider.baseUrl && isGatewayUrl(provider.baseUrl)) {
|
|
433
|
+
skipped.push(name);
|
|
434
|
+
continue;
|
|
435
|
+
}
|
|
436
|
+
// Skip if no baseUrl
|
|
437
|
+
if (!provider.baseUrl) {
|
|
438
|
+
continue;
|
|
439
|
+
}
|
|
440
|
+
// Save original baseUrl (只保存 baseUrl,不保存整个配置)
|
|
441
|
+
backup.routedProviders[name] = {
|
|
442
|
+
originalBaseUrl: provider.baseUrl,
|
|
443
|
+
};
|
|
444
|
+
// Save for gateway config
|
|
445
|
+
originalProviders[name] = { ...provider };
|
|
446
|
+
// Modify to point to gateway using backend name as identifier
|
|
447
|
+
// e.g., vllm -> http://127.0.0.1:53669/backend/vllm
|
|
448
|
+
provider.baseUrl = toGatewayUrl(name);
|
|
449
|
+
routedProviders.push(name);
|
|
450
|
+
}
|
|
451
|
+
// If all providers are already pointing to gateway, treat as "already enabled"
|
|
452
|
+
if (routedProviders.length === 0 && skipped.length > 0) {
|
|
453
|
+
// Create a minimal backup to mark gateway as enabled
|
|
454
|
+
mkdirSync(MOLTGUARD_DATA_DIR, { recursive: true });
|
|
455
|
+
const minimalBackup = {
|
|
456
|
+
timestamp: new Date().toISOString(),
|
|
457
|
+
routedProviders: {},
|
|
458
|
+
};
|
|
459
|
+
// Mark skipped providers as routed (we don't know original URLs)
|
|
460
|
+
for (const name of skipped) {
|
|
461
|
+
minimalBackup.routedProviders[name] = {
|
|
462
|
+
originalBaseUrl: GATEWAY_SERVER_URL, // Can't restore, but mark as managed
|
|
463
|
+
};
|
|
464
|
+
}
|
|
465
|
+
writeFileSync(GATEWAY_BACKUP, JSON.stringify(minimalBackup, null, 2) + "\n", "utf-8");
|
|
466
|
+
// Restart gateway to ensure it's running
|
|
467
|
+
await restartGateway();
|
|
468
|
+
return {
|
|
469
|
+
providers: skipped,
|
|
470
|
+
warnings: ["Providers were already pointing to gateway. Gateway is now marked as enabled."],
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
if (routedProviders.length === 0) {
|
|
474
|
+
throw new Error("No providers found with baseUrl to route through gateway");
|
|
475
|
+
}
|
|
476
|
+
// Configure gateway with original provider URLs
|
|
477
|
+
configureGateway(originalProviders);
|
|
478
|
+
// Write modified openclaw.json
|
|
479
|
+
writeOpenClawConfig(config);
|
|
480
|
+
// Also update agent models.json files
|
|
481
|
+
const agentModelsBackup = {};
|
|
482
|
+
updateAgentModelsFiles(agentModelsBackup);
|
|
483
|
+
if (Object.keys(agentModelsBackup).length > 0) {
|
|
484
|
+
backup.agentModelsBackup = agentModelsBackup;
|
|
485
|
+
}
|
|
486
|
+
// Save backup
|
|
487
|
+
mkdirSync(MOLTGUARD_DATA_DIR, { recursive: true });
|
|
488
|
+
writeFileSync(GATEWAY_BACKUP, JSON.stringify(backup, null, 2) + "\n", "utf-8");
|
|
489
|
+
const warnings = [];
|
|
490
|
+
if (skipped.length > 0) {
|
|
491
|
+
warnings.push(`Skipped providers already pointing to gateway: ${skipped.join(", ")}`);
|
|
492
|
+
}
|
|
493
|
+
const modifiedAgentFiles = Object.keys(agentModelsBackup).length;
|
|
494
|
+
if (modifiedAgentFiles > 0) {
|
|
495
|
+
warnings.push(`Also updated ${modifiedAgentFiles} agent models.json file(s)`);
|
|
496
|
+
}
|
|
497
|
+
// Restart gateway to pick up new config with backends
|
|
498
|
+
await restartGateway();
|
|
499
|
+
return { providers: routedProviders, warnings };
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Disable AI Security Gateway
|
|
503
|
+
* Restores original provider URLs in openclaw.json (智能恢复)
|
|
504
|
+
*/
|
|
505
|
+
export function disableGateway() {
|
|
506
|
+
if (!existsSync(GATEWAY_BACKUP)) {
|
|
507
|
+
throw new Error("Gateway not enabled (no backup found)");
|
|
508
|
+
}
|
|
509
|
+
// Read backup
|
|
510
|
+
const backup = loadJsonSync(GATEWAY_BACKUP);
|
|
511
|
+
// Read current openclaw.json
|
|
512
|
+
const config = readOpenClawConfig();
|
|
513
|
+
if (!config.models?.providers) {
|
|
514
|
+
throw new Error("No providers found in openclaw.json");
|
|
515
|
+
}
|
|
516
|
+
const providers = config.models.providers;
|
|
517
|
+
const restoredProviders = [];
|
|
518
|
+
const deletedProviders = [];
|
|
519
|
+
const modifiedProviders = [];
|
|
520
|
+
// Smart restore: 只恢复 baseUrl,保留其他字段的修改
|
|
521
|
+
for (const [name, routeInfo] of Object.entries(backup.routedProviders)) {
|
|
522
|
+
const provider = providers[name];
|
|
523
|
+
if (!provider) {
|
|
524
|
+
// Provider 被删除了
|
|
525
|
+
deletedProviders.push(name);
|
|
526
|
+
continue;
|
|
527
|
+
}
|
|
528
|
+
if (provider.baseUrl && isGatewayUrl(provider.baseUrl)) {
|
|
529
|
+
// Provider 还指向 gateway,恢复原始 URL
|
|
530
|
+
provider.baseUrl = routeInfo.originalBaseUrl;
|
|
531
|
+
restoredProviders.push(name);
|
|
532
|
+
}
|
|
533
|
+
else if (provider.baseUrl !== routeInfo.originalBaseUrl) {
|
|
534
|
+
// Provider 的 baseUrl 被用户改成了其他值(既不是 gateway 也不是原始值)
|
|
535
|
+
modifiedProviders.push(name);
|
|
536
|
+
// 不恢复,保留用户的修改
|
|
537
|
+
}
|
|
538
|
+
else {
|
|
539
|
+
// Provider 的 baseUrl 已经是原始值了,无需恢复
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
// Write restored config
|
|
543
|
+
writeOpenClawConfig(config);
|
|
544
|
+
// Restore agent models.json files
|
|
545
|
+
let restoredAgentFiles = 0;
|
|
546
|
+
if (backup.agentModelsBackup) {
|
|
547
|
+
const restored = restoreAgentModelsFiles(backup.agentModelsBackup);
|
|
548
|
+
restoredAgentFiles = restored.length;
|
|
549
|
+
}
|
|
550
|
+
// Delete backup
|
|
551
|
+
unlinkSync(GATEWAY_BACKUP);
|
|
552
|
+
const warnings = [];
|
|
553
|
+
if (deletedProviders.length > 0) {
|
|
554
|
+
warnings.push(`These providers were deleted and not restored: ${deletedProviders.join(", ")}`);
|
|
555
|
+
}
|
|
556
|
+
if (modifiedProviders.length > 0) {
|
|
557
|
+
warnings.push(`These providers have custom baseUrl (kept as-is): ${modifiedProviders.join(", ")}`);
|
|
558
|
+
}
|
|
559
|
+
if (restoredAgentFiles > 0) {
|
|
560
|
+
warnings.push(`Also restored ${restoredAgentFiles} agent models.json file(s)`);
|
|
561
|
+
}
|
|
562
|
+
return { providers: restoredProviders, warnings };
|
|
563
|
+
}
|
|
564
|
+
/**
|
|
565
|
+
* Get gateway status
|
|
566
|
+
*/
|
|
567
|
+
export function getGatewayStatus() {
|
|
568
|
+
const enabled = existsSync(GATEWAY_BACKUP);
|
|
569
|
+
const running = isGatewayRunning();
|
|
570
|
+
const status = {
|
|
571
|
+
enabled,
|
|
572
|
+
running,
|
|
573
|
+
port: DEFAULT_GATEWAY_PORT,
|
|
574
|
+
url: GATEWAY_SERVER_URL,
|
|
575
|
+
providers: [],
|
|
576
|
+
};
|
|
577
|
+
if (enabled && existsSync(GATEWAY_BACKUP)) {
|
|
578
|
+
const backup = loadJsonSync(GATEWAY_BACKUP);
|
|
579
|
+
status.providers = Object.keys(backup.routedProviders);
|
|
580
|
+
}
|
|
581
|
+
return status;
|
|
582
|
+
}
|
|
583
|
+
//# sourceMappingURL=gateway-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-manager.js","sourceRoot":"","sources":["../../agent/gateway-manager.ts"],"names":[],"mappings":"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"}
|