8900 commited on
Commit
1788d7f
·
verified ·
1 Parent(s): 2f40c71

Update setup-hf-config.mjs

Browse files
Files changed (1) hide show
  1. setup-hf-config.mjs +122 -101
setup-hf-config.mjs CHANGED
@@ -1,122 +1,143 @@
1
- import fs from "node:fs";
2
  import path from "node:path";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
- var HOME = process.env.OPENCLAW_HOME || process.env.HOME || "/home/user";
5
- var STATE_DIR = path.join(HOME, ".openclaw");
6
- var CONFIG_PATH = path.join(STATE_DIR, "openclaw.json");
7
-
8
- console.log("[setup] Starting... HOME=" + HOME);
9
 
10
- function parseList(val) {
11
- if (!val || !val.trim()) return [];
12
- return val.split(",").map(function(s) { return s.trim(); }).filter(Boolean);
13
- }
 
 
14
 
15
- function envStr(key) {
16
- return (process.env[key] || "").trim();
 
17
  }
18
 
19
- var gatewayToken = envStr("OPENCLAW_GATEWAY_TOKEN");
20
- var gatewayPassword = envStr("OPENCLAW_GATEWAY_PASSWORD");
 
21
 
22
- if (!gatewayToken && !gatewayPassword) {
23
- console.error("[setup] FATAL: set OPENCLAW_GATEWAY_TOKEN or OPENCLAW_GATEWAY_PASSWORD in Secrets");
24
- process.exit(1);
 
 
 
 
 
 
 
25
  }
26
 
27
- var defaultModel = envStr("OPENCLAW_HF_DEFAULT_MODEL") || "google/gemini-2.0-flash";
28
-
29
- var EXCLUDE_PREFIXES = ["OPENCLAW_", "SPACE_", "SYSTEM_", "HF_", "NODE_", "PATH", "HOME", "USER", "PWD", "LANG", "LC_", "npm_", "HOSTNAME", "SHELL", "TERM", "SHLVL"];
30
- var INCLUDE_SUFFIXES = ["_API_KEY", "_SECRET_KEY", "_ACCESS_TOKEN", "_BOT_TOKEN", "_AUTH_TOKEN", "_APP_KEY"];
 
 
31
 
32
- function isProviderKey(k) {
33
- for (var i = 0; i < EXCLUDE_PREFIXES.length; i++) {
34
- if (k.indexOf(EXCLUDE_PREFIXES[i]) === 0) return false;
35
- }
36
- for (var i = 0; i < INCLUDE_SUFFIXES.length; i++) {
37
- var s = INCLUDE_SUFFIXES[i];
38
- if (k.length > s.length && k.indexOf(s) === k.length - s.length) return true;
39
- }
40
- return false;
41
  }
42
 
43
- var allKeys = Object.keys(process.env);
44
- var providerKeys = [];
45
- for (var i = 0; i < allKeys.length; i++) {
46
- var k = allKeys[i];
47
- if (isProviderKey(k) && (process.env[k] || "").trim()) {
48
- providerKeys.push(k);
49
- }
 
 
 
 
50
  }
51
- providerKeys.sort();
52
 
53
- console.log("[setup] Detected provider keys (" + providerKeys.length + "):");
54
- providerKeys.forEach(function(k) { console.log(" + " + k); });
 
55
 
56
- var envProxies = parseList(envStr("OPENCLAW_GATEWAY_TRUSTED_PROXIES"));
57
- var trustedProxies = envProxies.length > 0 ? envProxies : [
58
- "10.16.0.0/12", "10.20.0.0/12", "10.16.4.123", "10.16.7.92", "10.16.18.232",
59
- "10.16.34.155", "10.16.43.133", "10.16.1.206", "10.16.37.110", "10.16.43.246",
60
- "10.20.1.9", "10.20.1.222", "10.20.26.157", "10.20.31.87", "10.20.0.1", "172.17.0.1"
61
- ];
62
 
63
- var config = {
64
- gateway: {
65
- auth: gatewayToken ? { mode: "token", token: gatewayToken } : { mode: "password", password: gatewayPassword },
66
- controlUi: {
67
- allowInsecureAuth: true,
68
- allowedOrigins: ["*"],
69
- dangerouslyDisableDeviceAuth: true,
70
- dangerouslyAllowHostHeaderOriginFallback: true
71
- },
72
- trustedProxies: trustedProxies
73
- },
74
- agents: {
75
- defaults: { model: defaultModel }
76
- },
77
- env: { vars: {} }
78
- };
79
 
80
- providerKeys.forEach(function(pk) {
81
- config.env.vars[pk] = (process.env[pk] || "").trim();
82
- });
83
-
84
- // Webhook configuration
85
- var webhookBaseUrl = envStr("WEBHOOK_BASE_URL");
86
- var webhookSecret = envStr("TELEGRAM_WEBHOOK_SECRET") || "openclaw-webhook-secret-2026";
87
-
88
- if (webhookBaseUrl) {
89
- config.channels = {
90
- telegram: {
91
- enabled: true,
92
- accounts: {
93
- main: {
94
- botToken: envStr("TELEGRAM_BOT_TOKEN")
95
- }
96
- },
97
- webhook: {
98
- enabled: true,
99
- host: "0.0.0.0",
100
- port: 0,
101
- path: "/telegram-webhook",
102
- secret: webhookSecret,
103
- url: webhookBaseUrl + "/telegram-webhook"
104
- }
105
- }
106
- };
107
- console.log("[setup] Telegram: enabled in WEBHOOK mode, url=" + webhookBaseUrl + "/telegram-webhook");
108
- } else {
109
- console.warn("[setup] WEBHOOK_BASE_URL not set in Secrets, webhook disabled");
110
  }
111
 
112
- fs.mkdirSync(STATE_DIR, { recursive: true });
113
- if (fs.existsSync(CONFIG_PATH)) {
114
- fs.copyFileSync(CONFIG_PATH, CONFIG_PATH + ".bak");
 
 
115
  }
116
- fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), "utf-8");
117
 
118
- console.log("[setup] Done.");
119
- console.log("[setup] auth = " + (gatewayToken ? "token" : "password"));
120
- console.log("[setup] model = " + defaultModel);
121
- console.log("[setup] webhook = " + (webhookBaseUrl ? "enabled" : "disabled"));
122
- console.log("[setup] config = " + CONFIG_PATH);
 
 
 
 
 
 
1
+ import fs from "node:fs";
2
  import path from "node:path";
3
+ import http from "node:http";
4
+ import https from "node:https";
5
+ import { execSync } from "node:child_process";
6
+
7
+ // ============================================================
8
+ // Config
9
+ // ============================================================
10
+
11
+ var OPENCLAW_DIR = path.join(
12
+ process.env.OPENCLAW_HOME || process.env.HOME || "/home/user",
13
+ ".openclaw"
14
+ );
15
+ var BOT_TOKEN = (process.env.TELEGRAM_BOT_TOKEN || "").trim();
16
+ var HF_TOKEN = (process.env.HF_TOKEN || "").trim();
17
+ var DATASET_ID = (process.env.HF_DATASET_ID || "").trim();
18
+ var ADMIN_CHAT_ID = (process.env.SYNC_ADMIN_CHAT_ID || "").trim();
19
+ var LOOP_INTERVAL = 30 * 1000;
20
+ var PROXY_PORT = 7861;
21
+
22
+ var REPO_DIR = "/tmp/hf-sync-repo";
23
+ var STATE_FILE = path.join(OPENCLAW_DIR, ".sync-state.json");
24
+
25
+ var ALWAYS_EXCLUDE = [".sync-state.json", ".git", "openclaw.json.bak"];
26
+ var LOG_PATTERNS = [".log", ".log.", ".tmp", ".bak"];
27
+
28
+ var SYNC_COMMANDS = [
29
+ "/sync_all", "/sync_settings", "/sync_memory",
30
+ "/pull_all", "/pull_settings", "/pull_memory",
31
+ "/pause_all", "/pause_settings", "/pause_memory",
32
+ "/pause_pull_settings", "/pause_pull_memory",
33
+ "/resume_all", "/resume_settings", "/resume_memory",
34
+ "/progress"
35
+ ];
36
 
37
+ // ============================================================
38
+ // Task registry
39
+ // ============================================================
 
 
40
 
41
+ var tasks = {
42
+ settings_upload: { active: false, timer: null, lastMsg: "idle" },
43
+ settings_pull: { active: false, timer: null, lastMsg: "idle" },
44
+ memory_upload: { active: false, timer: null, lastMsg: "idle" },
45
+ memory_pull: { active: false, timer: null, lastMsg: "idle" }
46
+ };
47
 
48
+ function setTaskMsg(key, msg) {
49
+ tasks[key].lastMsg = msg;
50
+ console.log("[sync:" + key + "] " + msg);
51
  }
52
 
53
+ // ============================================================
54
+ // State
55
+ // ============================================================
56
 
57
+ function loadState() {
58
+ try {
59
+ if (fs.existsSync(STATE_FILE)) {
60
+ return JSON.parse(fs.readFileSync(STATE_FILE, "utf-8"));
61
+ }
62
+ } catch (e) {}
63
+ return {
64
+ settings: { lastUpload: null, lastPull: null },
65
+ memory: { lastUpload: null, lastPull: null }
66
+ };
67
  }
68
 
69
+ function saveState(state) {
70
+ try {
71
+ fs.mkdirSync(OPENCLAW_DIR, { recursive: true });
72
+ fs.writeFileSync(STATE_FILE, JSON.stringify(state, null, 2), "utf-8");
73
+ } catch (e) {}
74
+ }
75
 
76
+ function nowTs() {
77
+ return new Date().toISOString().replace("T", " ").substring(0, 19);
 
 
 
 
 
 
 
78
  }
79
 
80
+ // ============================================================
81
+ // Progress bar
82
+ // ============================================================
83
+
84
+ function bar(done, total) {
85
+ var width = 10;
86
+ var filled = total > 0 ? Math.round((done / total) * width) : 0;
87
+ var pct = total > 0 ? Math.round((done / total) * 100) : 0;
88
+ var b = "";
89
+ for (var i = 0; i < width; i++) b += i < filled ? "=" : "-";
90
+ return "[" + b + "] " + pct + "% (" + done + "/" + total + ")";
91
  }
 
92
 
93
+ // ============================================================
94
+ // Git helpers
95
+ // ============================================================
96
 
97
+ function repoUrl() {
98
+ return "https://user:" + HF_TOKEN +
99
+ "@huggingface.co/datasets/" + DATASET_ID;
100
+ }
 
 
101
 
102
+ function git(args, cwd) {
103
+ return execSync("git " + args, {
104
+ cwd: cwd || REPO_DIR,
105
+ stdio: "pipe",
106
+ timeout: 60000,
107
+ env: Object.assign({}, process.env, { GIT_TERMINAL_PROMPT: "0" })
108
+ }).toString().trim();
109
+ }
 
 
 
 
 
 
 
 
110
 
111
+ function ensureRepo() {
112
+ if (fs.existsSync(path.join(REPO_DIR, ".git"))) return;
113
+ execSync("rm -rf " + REPO_DIR, { stdio: "pipe" });
114
+ try {
115
+ git("clone --depth 1 " + repoUrl() + " " + REPO_DIR, "/tmp");
116
+ } catch (e) {
117
+ fs.mkdirSync(REPO_DIR, { recursive: true });
118
+ git("init", REPO_DIR);
119
+ git("remote add origin " + repoUrl(), REPO_DIR);
120
+ }
121
+ try {
122
+ git("config user.email openclaw@hf.space");
123
+ git("config user.name OpenClaw-Sync");
124
+ } catch (e) {}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
125
  }
126
 
127
+ function pullLatest() {
128
+ try { git("pull --quiet --no-rebase origin main"); }
129
+ catch (e) {
130
+ try { git("pull --quiet --no-rebase origin master"); } catch (e2) {}
131
+ }
132
  }
 
133
 
134
+ function commitAndPush(msg) {
135
+ git("add -A");
136
+ var changed = git("diff --cached --name-only");
137
+ if (!changed) return 0;
138
+ var count = changed.split("\n").filter(Boolean).length;
139
+ git('commit -m "' + msg + '"');
140
+ try { git("push --quiet origin HEAD:main"); }
141
+ catch (e) { git("push --quiet origin HEAD:master"); }
142
+ return count;
143
+ }