8900 commited on
Commit
e9b641c
Β·
verified Β·
1 Parent(s): d161dbf

Update setup-hf-config.mjs

Browse files
Files changed (1) hide show
  1. setup-hf-config.mjs +177 -82
setup-hf-config.mjs CHANGED
@@ -1,111 +1,206 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import https from "node:https";
4
 
5
  // ============================================================
6
  // OpenClaw HF Spaces - Production Config Writer
 
 
7
  // ============================================================
8
 
9
- const HOME = process.env.OPENCLAW_HOME || process.env.HOME || "/home/user";
10
- const STATE_DIR = path.join(HOME, ".openclaw");
11
- const CONFIG_PATH = path.join(STATE_DIR, "openclaw.json");
12
- const WORKSPACE = path.join(STATE_DIR, "workspace");
13
- const SPACE_HOST = (process.env.SPACE_HOST || "").trim();
14
 
15
- console.log("[setup] Starting… HOME=" + HOME);
16
 
17
  function parseList(val) {
18
- if (!val || !val.trim()) return [];
19
- return val.split(",").map(s => s.trim()).filter(Boolean);
20
  }
21
 
22
  function envStr(key) {
23
- return (process.env[key] || "").trim();
24
  }
25
 
26
- // auth
27
- const gatewayToken = envStr("OPENCLAW_GATEWAY_TOKEN");
28
- const gatewayPassword = envStr("OPENCLAW_GATEWAY_PASSWORD");
 
29
 
30
  if (!gatewayToken && !gatewayPassword) {
31
- console.error("[setup] FATAL: set OPENCLAW_GATEWAY_TOKEN or OPENCLAW_GATEWAY_PASSWORD");
32
- process.exit(0);
33
  }
34
 
35
- const defaultModel = envStr("OPENCLAW_HF_DEFAULT_MODEL") || "google/gemini-2.0-flash";
 
 
36
 
37
- // provider keys
38
- const EXCLUDE_PREFIXES = ["OPENCLAW_", "SPACE_", "SYSTEM_", "HF_", "NODE_", "PATH", "HOME", "USER", "PWD", "LANG", "LC_", "npm_", "HOSTNAME", "SHELL", "TERM", "SHLVL"];
39
- const INCLUDE_SUFFIXES = ["_API_KEY", "_SECRET_KEY", "_ACCESS_TOKEN", "_BOT_TOKEN", "_AUTH_TOKEN", "_APP_KEY"];
 
 
 
 
 
 
 
 
40
 
41
  function isProviderKey(k) {
42
- for (const prefix of EXCLUDE_PREFIXES) if (k.startsWith(prefix)) return false;
43
- for (const suffix of INCLUDE_SUFFIXES) if (k.endsWith(suffix)) return true;
44
- return false;
45
- }
46
-
47
- const providerKeys = Object.keys(process.env)
48
- .filter(k => isProviderKey(k) && (process.env[k] || "").trim())
49
- .sort();
50
-
51
- console.log(`[setup] Detected provider keys (${providerKeys.length}):`);
52
- providerKeys.forEach(k => console.log(" + " + k));
53
-
54
- const trustedProxies = parseList(envStr("OPENCLAW_GATEWAY_TRUSTED_PROXIES")).length > 0
55
- ? parseList(envStr("OPENCLAW_GATEWAY_TRUSTED_PROXIES"))
56
- : ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "10.16.0.0/12", "10.20.0.0/12", "127.0.0.1"];
57
-
58
- const config = {
59
- gateway: {
60
- auth: gatewayToken ? { mode: "token", token: gatewayToken } : { mode: "password", password: gatewayPassword },
61
- controlUi: {
62
- allowInsecureAuth: true,
63
- allowedOrigins: ["*"],
64
- dangerouslyDisableDeviceAuth: true,
65
- dangerouslyAllowHostHeaderOriginFallback: true
66
- },
67
- trustedProxies: trustedProxies
68
- },
69
- agents: {
70
- defaults: { model: defaultModel, workspace: WORKSPACE }
71
- },
72
- env: { vars: {} }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
  };
74
 
75
- providerKeys.forEach(pk => {
76
- config.env.vars[pk] = (process.env[pk] || "").trim();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  });
 
 
 
 
 
 
 
78
 
79
- // Telegram
80
  async function setupTelegram() {
81
- const token = envStr("TELEGRAM_BOT_TOKEN");
82
- if (!token) {
83
- console.log("[setup] Telegram: disabled");
84
- return;
85
- }
86
- console.log("[setup] Telegram: configured");
87
  }
88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  (async function() {
90
- fs.mkdirSync(STATE_DIR, { recursive: true });
91
- fs.mkdirSync(WORKSPACE, { recursive: true });
92
- fs.mkdirSync(path.join(WORKSPACE, "memory"), { recursive: true });
93
-
94
- await setupTelegram();
95
-
96
- if (fs.existsSync(CONFIG_PATH)) {
97
- fs.copyFileSync(CONFIG_PATH, CONFIG_PATH + ".bak");
98
- }
99
- fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), "utf-8");
100
-
101
- console.log("[setup] Done.");
102
- console.log("[setup] auth = " + (gatewayToken ? "token" : "password"));
103
- console.log("[setup] model = " + defaultModel);
104
- console.log("[setup] workspace = " + WORKSPACE);
105
- console.log("[setup] proxies = " + trustedProxies.length);
106
- console.log("[setup] env.vars = " + providerKeys.length);
107
- console.log("[setup] config = " + CONFIG_PATH);
108
- })().catch(e => {
109
- console.error("[setup] Fatal: " + e.message);
110
- process.exit(0);
111
  });
 
1
+ import fs from β€œnode:fs”;
2
+ import path from β€œnode:path”;
3
+ import https from β€œnode:https”;
4
 
5
  // ============================================================
6
  // OpenClaw HF Spaces - Production Config Writer
7
+ // Called ONCE per container lifetime by entrypoint.sh.
8
+ // Always writes fresh config from env vars on first boot.
9
  // ============================================================
10
 
11
+ var HOME = process.env.OPENCLAW_HOME || process.env.HOME || β€œ/home/user”;
12
+ var STATE_DIR = path.join(HOME, β€œ.openclaw”);
13
+ var CONFIG_PATH = path.join(STATE_DIR, β€œopenclaw.json”);
14
+ var WORKSPACE = path.join(STATE_DIR, β€œworkspace”);
15
+ var SPACE_HOST = (process.env.SPACE_HOST || β€œβ€).trim();
16
 
17
+ console.log(”[setup] Starting… HOME=” + HOME);
18
 
19
  function parseList(val) {
20
+ if (!val || !val.trim()) return [];
21
+ return val.split(”,”).map(function(s) { return s.trim(); }).filter(Boolean);
22
  }
23
 
24
  function envStr(key) {
25
+ return (process.env[key] || β€œβ€).trim();
26
  }
27
 
28
+ // –– auth –––––––––––––––––––––––––
29
+
30
+ var gatewayToken = envStr(β€œOPENCLAW_GATEWAY_TOKEN”);
31
+ var gatewayPassword = envStr(β€œOPENCLAW_GATEWAY_PASSWORD”);
32
 
33
  if (!gatewayToken && !gatewayPassword) {
34
+ console.error(”[setup] FATAL: set OPENCLAW_GATEWAY_TOKEN or OPENCLAW_GATEWAY_PASSWORD”);
35
+ process.exit(0);
36
  }
37
 
38
+ // –– model ———————————————––
39
+
40
+ var defaultModel = envStr(β€œOPENCLAW_HF_DEFAULT_MODEL”) || β€œgoogle/gemini-2.0-flash”;
41
 
42
+ // –– provider keys —————————————–
43
+
44
+ var EXCLUDE_PREFIXES = [
45
+ β€œOPENCLAW_”, β€œSPACE_”, β€œSYSTEM_”, β€œHF_”,
46
+ β€œNODE_”, β€œPATH”, β€œHOME”, β€œUSER”, β€œPWD”, β€œLANG”, β€œLC_”,
47
+ β€œnpm_”, β€œHOSTNAME”, β€œSHELL”, β€œTERM”, β€œSHLVL”
48
+ ];
49
+ var INCLUDE_SUFFIXES = [
50
+ β€œ_API_KEY”, β€œ_SECRET_KEY”, β€œ_ACCESS_TOKEN”,
51
+ β€œ_BOT_TOKEN”, β€œ_AUTH_TOKEN”, β€œ_APP_KEY”
52
+ ];
53
 
54
  function isProviderKey(k) {
55
+ var i;
56
+ for (i = 0; i < EXCLUDE_PREFIXES.length; i++) {
57
+ if (k.indexOf(EXCLUDE_PREFIXES[i]) === 0) return false;
58
+ }
59
+ for (i = 0; i < INCLUDE_SUFFIXES.length; i++) {
60
+ var s = INCLUDE_SUFFIXES[i];
61
+ if (k.length > s.length && k.indexOf(s) === k.length - s.length) return true;
62
+ }
63
+ return false;
64
+ }
65
+
66
+ var providerKeys = Object.keys(process.env).filter(function(k) {
67
+ return isProviderKey(k) && (process.env[k] || β€œβ€).trim();
68
+ }).sort();
69
+
70
+ console.log(”[setup] Detected provider keys (” + providerKeys.length + β€œ):”);
71
+ providerKeys.forEach(function(k) { console.log(” + β€œ + k); });
72
+
73
+ // –– trusted proxies β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
74
+
75
+ var envProxies = parseList(envStr(β€œOPENCLAW_GATEWAY_TRUSTED_PROXIES”));
76
+ var trustedProxies = envProxies.length > 0 ? envProxies : [
77
+ β€œ10.0.0.0/8”,
78
+ β€œ172.16.0.0/12”,
79
+ β€œ192.168.0.0/16”,
80
+ β€œ10.16.0.0/12”, β€œ10.20.0.0/12”,
81
+ β€œ10.16.4.123”, β€œ10.16.7.92”, β€œ10.16.18.232”,
82
+ β€œ10.16.34.155”, β€œ10.16.43.133”, β€œ10.16.1.206”,
83
+ β€œ10.16.37.110”, β€œ10.16.43.246”,
84
+ β€œ10.20.1.9”, β€œ10.20.1.222”,
85
+ β€œ10.20.26.157”, β€œ10.20.31.87”,
86
+ β€œ10.20.0.1”, β€œ172.17.0.1”,
87
+ β€œ127.0.0.1”
88
+ ];
89
+
90
+ // –– build config β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
91
+
92
+ var config = {
93
+ gateway: {
94
+ auth: gatewayToken
95
+ ? { mode: β€œtoken”, token: gatewayToken }
96
+ : { mode: β€œpassword”, password: gatewayPassword },
97
+ controlUi: {
98
+ allowInsecureAuth: true,
99
+ allowedOrigins: [”*”],
100
+ dangerouslyDisableDeviceAuth: true,
101
+ dangerouslyAllowHostHeaderOriginFallback: true
102
+ },
103
+ trustedProxies: trustedProxies
104
+ },
105
+ agents: {
106
+ defaults: {
107
+ model: defaultModel,
108
+ workspace: WORKSPACE
109
+ }
110
+ },
111
+ env: { vars: {} }
112
  };
113
 
114
+ providerKeys.forEach(function(pk) {
115
+ config.env.vars[pk] = (process.env[pk] || β€œβ€).trim();
116
+ });
117
+
118
+ // –– Telegram –––––––––––––––––––––––
119
+
120
+ function tgRequest(token, method, body) {
121
+ return new Promise(function(resolve) {
122
+ var data = JSON.stringify(body || {});
123
+ var req = https.request({
124
+ hostname: β€œapi.telegram.org”,
125
+ path: β€œ/bot” + token + β€œ/” + method,
126
+ method: β€œPOST”,
127
+ headers: {
128
+ β€œContent-Type”: β€œapplication/json”,
129
+ β€œContent-Length”: Buffer.byteLength(data)
130
+ }
131
+ }, function(res) {
132
+ var buf = β€œβ€;
133
+ res.on(β€œdata”, function(c) { buf += c; });
134
+ res.on(β€œend”, function() {
135
+ try { resolve(JSON.parse(buf)); } catch (e) { resolve(null); }
136
  });
137
+ });
138
+ req.on(β€œerror”, function() { resolve(null); });
139
+ req.setTimeout(8000, function() { req.destroy(); resolve(null); });
140
+ req.write(data);
141
+ req.end();
142
+ });
143
+ }
144
 
 
145
  async function setupTelegram() {
146
+ var token = envStr(β€œTELEGRAM_BOT_TOKEN”);
147
+ if (!token) {
148
+ console.log(”[setup] Telegram: disabled (no TELEGRAM_BOT_TOKEN)”);
149
+ return;
 
 
150
  }
151
 
152
+ if (SPACE_HOST) {
153
+ var webhookUrl = β€œhttps://” + SPACE_HOST + β€œ/tg-webhook”;
154
+ var r = await tgRequest(token, β€œsetWebhook”, {
155
+ url: webhookUrl,
156
+ drop_pending_updates: true,
157
+ max_connections: 10
158
+ });
159
+ if (r && r.ok) {
160
+ console.log(”[setup] Telegram: webhook registered -> β€œ + webhookUrl);
161
+ } else {
162
+ console.log(”[setup] Telegram: auto-registration failed”);
163
+ console.log(”[setup] Open this URL in your browser once:”);
164
+ console.log(” https://api.telegram.org/bot” + token +
165
+ β€œ/setWebhook?url=” + webhookUrl + β€œ&drop_pending_updates=true”);
166
+ }
167
+ } else {
168
+ console.log(”[setup] Telegram: set SPACE_HOST for auto webhook”);
169
+ }
170
+
171
+ config.channels = {
172
+ telegram: {
173
+ enabled: true,
174
+ accounts: {
175
+ main: { botToken: token, apiRoot: β€œhttps://api.telegram.org” }
176
+ }
177
+ }
178
+ };
179
+ console.log(”[setup] Telegram: configured”);
180
+ }
181
+
182
+ // –– main –––––––––––––––––––––––––
183
+
184
  (async function() {
185
+ fs.mkdirSync(STATE_DIR, { recursive: true });
186
+ fs.mkdirSync(WORKSPACE, { recursive: true });
187
+ fs.mkdirSync(path.join(WORKSPACE, β€œmemory”), { recursive: true });
188
+
189
+ await setupTelegram();
190
+
191
+ if (fs.existsSync(CONFIG_PATH)) {
192
+ fs.copyFileSync(CONFIG_PATH, CONFIG_PATH + β€œ.bak”);
193
+ }
194
+ fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), β€œutf-8”);
195
+
196
+ console.log(”[setup] Done.”);
197
+ console.log(”[setup] auth = β€œ + (gatewayToken ? β€œtoken” : β€œpassword”));
198
+ console.log(”[setup] model = β€œ + defaultModel);
199
+ console.log(”[setup] workspace = β€œ + WORKSPACE);
200
+ console.log(”[setup] proxies = β€œ + trustedProxies.length);
201
+ console.log(”[setup] env.vars = β€œ + providerKeys.length);
202
+ console.log(”[setup] config = β€œ + CONFIG_PATH);
203
+ })().catch(function(e) {
204
+ console.error(”[setup] Fatal: β€œ + e.message);
205
+ process.exit(0);
206
  });