@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.
Files changed (329) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +270 -0
  3. package/dashboard-dist/api/104.index.js +1420 -0
  4. package/dashboard-dist/api/104.index.js.map +1 -0
  5. package/dashboard-dist/api/113.index.js +496 -0
  6. package/dashboard-dist/api/113.index.js.map +1 -0
  7. package/dashboard-dist/api/18.index.js +67 -0
  8. package/dashboard-dist/api/18.index.js.map +1 -0
  9. package/dashboard-dist/api/217.index.js +44 -0
  10. package/dashboard-dist/api/217.index.js.map +1 -0
  11. package/dashboard-dist/api/222.index.js +90 -0
  12. package/dashboard-dist/api/222.index.js.map +1 -0
  13. package/dashboard-dist/api/25.index.js +3562 -0
  14. package/dashboard-dist/api/25.index.js.map +1 -0
  15. package/dashboard-dist/api/280.index.js +206 -0
  16. package/dashboard-dist/api/280.index.js.map +1 -0
  17. package/dashboard-dist/api/369.index.js +115 -0
  18. package/dashboard-dist/api/369.index.js.map +1 -0
  19. package/dashboard-dist/api/377.index.js +1176 -0
  20. package/dashboard-dist/api/377.index.js.map +1 -0
  21. package/dashboard-dist/api/411.index.js +4250 -0
  22. package/dashboard-dist/api/411.index.js.map +1 -0
  23. package/dashboard-dist/api/424.index.js +135 -0
  24. package/dashboard-dist/api/424.index.js.map +1 -0
  25. package/dashboard-dist/api/573.index.js +806 -0
  26. package/dashboard-dist/api/573.index.js.map +1 -0
  27. package/dashboard-dist/api/598.index.js +328 -0
  28. package/dashboard-dist/api/598.index.js.map +1 -0
  29. package/dashboard-dist/api/62.index.js +4151 -0
  30. package/dashboard-dist/api/62.index.js.map +1 -0
  31. package/dashboard-dist/api/67.index.js +23383 -0
  32. package/dashboard-dist/api/67.index.js.map +1 -0
  33. package/dashboard-dist/api/678.index.js +2734 -0
  34. package/dashboard-dist/api/678.index.js.map +1 -0
  35. package/dashboard-dist/api/698.index.js +1896 -0
  36. package/dashboard-dist/api/698.index.js.map +1 -0
  37. package/dashboard-dist/api/720.index.js +98 -0
  38. package/dashboard-dist/api/720.index.js.map +1 -0
  39. package/dashboard-dist/api/830.index.js +95 -0
  40. package/dashboard-dist/api/830.index.js.map +1 -0
  41. package/dashboard-dist/api/831.index.js +99 -0
  42. package/dashboard-dist/api/831.index.js.map +1 -0
  43. package/dashboard-dist/api/84.index.js +64 -0
  44. package/dashboard-dist/api/84.index.js.map +1 -0
  45. package/dashboard-dist/api/900.index.js +65 -0
  46. package/dashboard-dist/api/900.index.js.map +1 -0
  47. package/dashboard-dist/api/917.index.js +88 -0
  48. package/dashboard-dist/api/917.index.js.map +1 -0
  49. package/dashboard-dist/api/948.index.js +64 -0
  50. package/dashboard-dist/api/948.index.js.map +1 -0
  51. package/dashboard-dist/api/953.index.js +67 -0
  52. package/dashboard-dist/api/953.index.js.map +1 -0
  53. package/dashboard-dist/api/975.index.js +374 -0
  54. package/dashboard-dist/api/975.index.js.map +1 -0
  55. package/dashboard-dist/api/drizzle/sqlite/0000_short_captain_stacy.sql +70 -0
  56. package/dashboard-dist/api/drizzle/sqlite/0001_closed_magus.sql +10 -0
  57. package/dashboard-dist/api/drizzle/sqlite/0002_agent_capability_observation.sql +38 -0
  58. package/dashboard-dist/api/drizzle/sqlite/0003_auth_magic_link.sql +28 -0
  59. package/dashboard-dist/api/drizzle/sqlite/0004_static_scan_fields.sql +8 -0
  60. package/dashboard-dist/api/drizzle/sqlite/0005_gateway_activity.sql +24 -0
  61. package/dashboard-dist/api/drizzle/sqlite/0006_sour_marauders.sql +41 -0
  62. package/dashboard-dist/api/drizzle/sqlite/meta/0000_snapshot.json +460 -0
  63. package/dashboard-dist/api/drizzle/sqlite/meta/0001_snapshot.json +536 -0
  64. package/dashboard-dist/api/drizzle/sqlite/meta/0006_snapshot.json +1249 -0
  65. package/dashboard-dist/api/drizzle/sqlite/meta/_journal.json +55 -0
  66. package/dashboard-dist/api/index.js +27340 -0
  67. package/dashboard-dist/api/index.js.map +1 -0
  68. package/dashboard-dist/api/package.json +16 -0
  69. package/dashboard-dist/api/sourcemap-register.cjs +1 -0
  70. package/dashboard-dist/web/assets/index-CqWIeBTD.js +158 -0
  71. package/dashboard-dist/web/assets/index-Dw7--9q4.css +1 -0
  72. package/dashboard-dist/web/changeway-logo.png +0 -0
  73. package/dashboard-dist/web/favicon.svg +29 -0
  74. package/dashboard-dist/web/index.html +14 -0
  75. package/dashboard-dist/web/logo.svg +16 -0
  76. package/dist/agent/auth.d.ts +37 -0
  77. package/dist/agent/auth.d.ts.map +1 -0
  78. package/dist/agent/auth.js +151 -0
  79. package/dist/agent/auth.js.map +1 -0
  80. package/dist/agent/behavior-detector.d.ts +150 -0
  81. package/dist/agent/behavior-detector.d.ts.map +1 -0
  82. package/dist/agent/behavior-detector.js +573 -0
  83. package/dist/agent/behavior-detector.js.map +1 -0
  84. package/dist/agent/business-reporter.d.ts +114 -0
  85. package/dist/agent/business-reporter.d.ts.map +1 -0
  86. package/dist/agent/business-reporter.js +359 -0
  87. package/dist/agent/business-reporter.js.map +1 -0
  88. package/dist/agent/config-sync.d.ts +70 -0
  89. package/dist/agent/config-sync.d.ts.map +1 -0
  90. package/dist/agent/config-sync.js +133 -0
  91. package/dist/agent/config-sync.js.map +1 -0
  92. package/dist/agent/config.d.ts +97 -0
  93. package/dist/agent/config.d.ts.map +1 -0
  94. package/dist/agent/config.js +359 -0
  95. package/dist/agent/config.js.map +1 -0
  96. package/dist/agent/content-injection-scanner.d.ts +35 -0
  97. package/dist/agent/content-injection-scanner.d.ts.map +1 -0
  98. package/dist/agent/content-injection-scanner.js +270 -0
  99. package/dist/agent/content-injection-scanner.js.map +1 -0
  100. package/dist/agent/engine-log-writer.d.ts +6 -0
  101. package/dist/agent/engine-log-writer.d.ts.map +1 -0
  102. package/dist/agent/engine-log-writer.js +18 -0
  103. package/dist/agent/engine-log-writer.js.map +1 -0
  104. package/dist/agent/env.d.ts +19 -0
  105. package/dist/agent/env.d.ts.map +1 -0
  106. package/dist/agent/env.js +43 -0
  107. package/dist/agent/env.js.map +1 -0
  108. package/dist/agent/event-reporter.d.ts +87 -0
  109. package/dist/agent/event-reporter.d.ts.map +1 -0
  110. package/dist/agent/event-reporter.js +315 -0
  111. package/dist/agent/event-reporter.js.map +1 -0
  112. package/dist/agent/file-watcher.d.ts +50 -0
  113. package/dist/agent/file-watcher.d.ts.map +1 -0
  114. package/dist/agent/file-watcher.js +135 -0
  115. package/dist/agent/file-watcher.js.map +1 -0
  116. package/dist/agent/fs-utils.d.ts +22 -0
  117. package/dist/agent/fs-utils.d.ts.map +1 -0
  118. package/dist/agent/fs-utils.js +41 -0
  119. package/dist/agent/fs-utils.js.map +1 -0
  120. package/dist/agent/gateway-manager.d.ts +59 -0
  121. package/dist/agent/gateway-manager.d.ts.map +1 -0
  122. package/dist/agent/gateway-manager.js +583 -0
  123. package/dist/agent/gateway-manager.js.map +1 -0
  124. package/dist/agent/hook-types.d.ts +276 -0
  125. package/dist/agent/hook-types.d.ts.map +1 -0
  126. package/dist/agent/hook-types.js +51 -0
  127. package/dist/agent/hook-types.js.map +1 -0
  128. package/dist/agent/index.d.ts +8 -0
  129. package/dist/agent/index.d.ts.map +1 -0
  130. package/dist/agent/index.js +8 -0
  131. package/dist/agent/index.js.map +1 -0
  132. package/dist/agent/prompt-gate.d.ts +13 -0
  133. package/dist/agent/prompt-gate.d.ts.map +1 -0
  134. package/dist/agent/prompt-gate.js +28 -0
  135. package/dist/agent/prompt-gate.js.map +1 -0
  136. package/dist/agent/prompt-input.d.ts +9 -0
  137. package/dist/agent/prompt-input.d.ts.map +1 -0
  138. package/dist/agent/prompt-input.js +158 -0
  139. package/dist/agent/prompt-input.js.map +1 -0
  140. package/dist/agent/prompt-output.d.ts +4 -0
  141. package/dist/agent/prompt-output.d.ts.map +1 -0
  142. package/dist/agent/prompt-output.js +19 -0
  143. package/dist/agent/prompt-output.js.map +1 -0
  144. package/dist/agent/runner.d.ts +23 -0
  145. package/dist/agent/runner.d.ts.map +1 -0
  146. package/dist/agent/runner.js +154 -0
  147. package/dist/agent/runner.js.map +1 -0
  148. package/dist/agent/sanitizer.d.ts +10 -0
  149. package/dist/agent/sanitizer.d.ts.map +1 -0
  150. package/dist/agent/sanitizer.js +175 -0
  151. package/dist/agent/sanitizer.js.map +1 -0
  152. package/dist/agent/scan-activity.d.ts +18 -0
  153. package/dist/agent/scan-activity.d.ts.map +1 -0
  154. package/dist/agent/scan-activity.js +32 -0
  155. package/dist/agent/scan-activity.js.map +1 -0
  156. package/dist/agent/types.d.ts +177 -0
  157. package/dist/agent/types.d.ts.map +1 -0
  158. package/dist/agent/types.js +5 -0
  159. package/dist/agent/types.js.map +1 -0
  160. package/dist/agent/workspace-scanner.d.ts +35 -0
  161. package/dist/agent/workspace-scanner.d.ts.map +1 -0
  162. package/dist/agent/workspace-scanner.js +137 -0
  163. package/dist/agent/workspace-scanner.js.map +1 -0
  164. package/dist/dashboard-launcher.d.ts +52 -0
  165. package/dist/dashboard-launcher.d.ts.map +1 -0
  166. package/dist/dashboard-launcher.js +363 -0
  167. package/dist/dashboard-launcher.js.map +1 -0
  168. package/dist/gateway/activity.d.ts +52 -0
  169. package/dist/gateway/activity.d.ts.map +1 -0
  170. package/dist/gateway/activity.js +111 -0
  171. package/dist/gateway/activity.js.map +1 -0
  172. package/dist/gateway/config.d.ts +50 -0
  173. package/dist/gateway/config.d.ts.map +1 -0
  174. package/dist/gateway/config.js +200 -0
  175. package/dist/gateway/config.js.map +1 -0
  176. package/dist/gateway/gateway/activity.d.ts +52 -0
  177. package/dist/gateway/gateway/activity.d.ts.map +1 -0
  178. package/dist/gateway/gateway/activity.js +111 -0
  179. package/dist/gateway/gateway/activity.js.map +1 -0
  180. package/dist/gateway/gateway/config.d.ts +50 -0
  181. package/dist/gateway/gateway/config.d.ts.map +1 -0
  182. package/dist/gateway/gateway/config.js +200 -0
  183. package/dist/gateway/gateway/config.js.map +1 -0
  184. package/dist/gateway/gateway/handlers/anthropic.d.ts +12 -0
  185. package/dist/gateway/gateway/handlers/anthropic.d.ts.map +1 -0
  186. package/dist/gateway/gateway/handlers/anthropic.js +254 -0
  187. package/dist/gateway/gateway/handlers/anthropic.js.map +1 -0
  188. package/dist/gateway/gateway/handlers/gemini.d.ts +12 -0
  189. package/dist/gateway/gateway/handlers/gemini.d.ts.map +1 -0
  190. package/dist/gateway/gateway/handlers/gemini.js +101 -0
  191. package/dist/gateway/gateway/handlers/gemini.js.map +1 -0
  192. package/dist/gateway/gateway/handlers/models.d.ts +4 -0
  193. package/dist/gateway/gateway/handlers/models.d.ts.map +1 -0
  194. package/dist/gateway/gateway/handlers/models.js +36 -0
  195. package/dist/gateway/gateway/handlers/models.js.map +1 -0
  196. package/dist/gateway/gateway/handlers/openai.d.ts +16 -0
  197. package/dist/gateway/gateway/handlers/openai.d.ts.map +1 -0
  198. package/dist/gateway/gateway/handlers/openai.js +254 -0
  199. package/dist/gateway/gateway/handlers/openai.js.map +1 -0
  200. package/dist/gateway/gateway/index.d.ts +27 -0
  201. package/dist/gateway/gateway/index.d.ts.map +1 -0
  202. package/dist/gateway/gateway/index.js +293 -0
  203. package/dist/gateway/gateway/index.js.map +1 -0
  204. package/dist/gateway/gateway/mapping-store.d.ts +38 -0
  205. package/dist/gateway/gateway/mapping-store.d.ts.map +1 -0
  206. package/dist/gateway/gateway/mapping-store.js +74 -0
  207. package/dist/gateway/gateway/mapping-store.js.map +1 -0
  208. package/dist/gateway/gateway/restorer.d.ts +63 -0
  209. package/dist/gateway/gateway/restorer.d.ts.map +1 -0
  210. package/dist/gateway/gateway/restorer.js +284 -0
  211. package/dist/gateway/gateway/restorer.js.map +1 -0
  212. package/dist/gateway/gateway/sanitizer.d.ts +17 -0
  213. package/dist/gateway/gateway/sanitizer.d.ts.map +1 -0
  214. package/dist/gateway/gateway/sanitizer.js +228 -0
  215. package/dist/gateway/gateway/sanitizer.js.map +1 -0
  216. package/dist/gateway/gateway/types.d.ts +53 -0
  217. package/dist/gateway/gateway/types.d.ts.map +1 -0
  218. package/dist/gateway/gateway/types.js +5 -0
  219. package/dist/gateway/gateway/types.js.map +1 -0
  220. package/dist/gateway/handlers/anthropic.d.ts +12 -0
  221. package/dist/gateway/handlers/anthropic.d.ts.map +1 -0
  222. package/dist/gateway/handlers/anthropic.js +254 -0
  223. package/dist/gateway/handlers/anthropic.js.map +1 -0
  224. package/dist/gateway/handlers/gemini.d.ts +12 -0
  225. package/dist/gateway/handlers/gemini.d.ts.map +1 -0
  226. package/dist/gateway/handlers/gemini.js +101 -0
  227. package/dist/gateway/handlers/gemini.js.map +1 -0
  228. package/dist/gateway/handlers/models.d.ts +4 -0
  229. package/dist/gateway/handlers/models.d.ts.map +1 -0
  230. package/dist/gateway/handlers/models.js +36 -0
  231. package/dist/gateway/handlers/models.js.map +1 -0
  232. package/dist/gateway/handlers/openai.d.ts +16 -0
  233. package/dist/gateway/handlers/openai.d.ts.map +1 -0
  234. package/dist/gateway/handlers/openai.js +254 -0
  235. package/dist/gateway/handlers/openai.js.map +1 -0
  236. package/dist/gateway/index.d.ts +27 -0
  237. package/dist/gateway/index.d.ts.map +1 -0
  238. package/dist/gateway/index.js +293 -0
  239. package/dist/gateway/index.js.map +1 -0
  240. package/dist/gateway/mapping-store.d.ts +38 -0
  241. package/dist/gateway/mapping-store.d.ts.map +1 -0
  242. package/dist/gateway/mapping-store.js +74 -0
  243. package/dist/gateway/mapping-store.js.map +1 -0
  244. package/dist/gateway/restorer.d.ts +63 -0
  245. package/dist/gateway/restorer.d.ts.map +1 -0
  246. package/dist/gateway/restorer.js +284 -0
  247. package/dist/gateway/restorer.js.map +1 -0
  248. package/dist/gateway/sanitizer.d.ts +17 -0
  249. package/dist/gateway/sanitizer.d.ts.map +1 -0
  250. package/dist/gateway/sanitizer.js +228 -0
  251. package/dist/gateway/sanitizer.js.map +1 -0
  252. package/dist/gateway/types.d.ts +53 -0
  253. package/dist/gateway/types.d.ts.map +1 -0
  254. package/dist/gateway/types.js +5 -0
  255. package/dist/gateway/types.js.map +1 -0
  256. package/dist/index.d.ts +19 -0
  257. package/dist/index.d.ts.map +1 -0
  258. package/dist/index.js +2084 -0
  259. package/dist/index.js.map +1 -0
  260. package/dist/memory/index.d.ts +5 -0
  261. package/dist/memory/index.d.ts.map +1 -0
  262. package/dist/memory/index.js +5 -0
  263. package/dist/memory/index.js.map +1 -0
  264. package/dist/memory/store.d.ts +82 -0
  265. package/dist/memory/store.d.ts.map +1 -0
  266. package/dist/memory/store.js +194 -0
  267. package/dist/memory/store.js.map +1 -0
  268. package/dist/platform-client/index.d.ts +63 -0
  269. package/dist/platform-client/index.d.ts.map +1 -0
  270. package/dist/platform-client/index.js +294 -0
  271. package/dist/platform-client/index.js.map +1 -0
  272. package/dist/platform-client/types.d.ts +109 -0
  273. package/dist/platform-client/types.d.ts.map +1 -0
  274. package/dist/platform-client/types.js +3 -0
  275. package/dist/platform-client/types.js.map +1 -0
  276. package/gateway/activity.d.ts +52 -0
  277. package/gateway/activity.d.ts.map +1 -0
  278. package/gateway/activity.js +111 -0
  279. package/gateway/activity.js.map +1 -0
  280. package/gateway/config.d.ts +50 -0
  281. package/gateway/config.d.ts.map +1 -0
  282. package/gateway/config.js +200 -0
  283. package/gateway/config.js.map +1 -0
  284. package/gateway/handlers/anthropic.d.ts +12 -0
  285. package/gateway/handlers/anthropic.d.ts.map +1 -0
  286. package/gateway/handlers/anthropic.js +254 -0
  287. package/gateway/handlers/anthropic.js.map +1 -0
  288. package/gateway/handlers/gemini.d.ts +12 -0
  289. package/gateway/handlers/gemini.d.ts.map +1 -0
  290. package/gateway/handlers/gemini.js +101 -0
  291. package/gateway/handlers/gemini.js.map +1 -0
  292. package/gateway/handlers/models.d.ts +4 -0
  293. package/gateway/handlers/models.d.ts.map +1 -0
  294. package/gateway/handlers/models.js +36 -0
  295. package/gateway/handlers/models.js.map +1 -0
  296. package/gateway/handlers/openai.d.ts +16 -0
  297. package/gateway/handlers/openai.d.ts.map +1 -0
  298. package/gateway/handlers/openai.js +254 -0
  299. package/gateway/handlers/openai.js.map +1 -0
  300. package/gateway/index.d.ts +27 -0
  301. package/gateway/index.d.ts.map +1 -0
  302. package/gateway/index.js +293 -0
  303. package/gateway/index.js.map +1 -0
  304. package/gateway/mapping-store.d.ts +38 -0
  305. package/gateway/mapping-store.d.ts.map +1 -0
  306. package/gateway/mapping-store.js +74 -0
  307. package/gateway/mapping-store.js.map +1 -0
  308. package/gateway/restorer.d.ts +63 -0
  309. package/gateway/restorer.d.ts.map +1 -0
  310. package/gateway/restorer.js +284 -0
  311. package/gateway/restorer.js.map +1 -0
  312. package/gateway/sanitizer.d.ts +17 -0
  313. package/gateway/sanitizer.d.ts.map +1 -0
  314. package/gateway/sanitizer.js +228 -0
  315. package/gateway/sanitizer.js.map +1 -0
  316. package/gateway/types.d.ts +53 -0
  317. package/gateway/types.d.ts.map +1 -0
  318. package/gateway/types.js +5 -0
  319. package/gateway/types.js.map +1 -0
  320. package/openclaw.plugin.json +86 -0
  321. package/package.json +74 -0
  322. package/samples/Untitled +1 -0
  323. package/samples/clean-email.txt +20 -0
  324. package/samples/test-document.md +53 -0
  325. package/samples/test-email-popup.txt +44 -0
  326. package/samples/test-email.txt +32 -0
  327. package/samples/test-webpage.html +51 -0
  328. package/scripts/enterprise-enroll.sh +89 -0
  329. 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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"}