@honor-claw/yoyo 1.3.0-beta.1 → 1.3.0-beta.3

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 (2) hide show
  1. package/dist/index.mjs +776 -746
  2. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -1,50 +1,41 @@
1
- import e, { promises as t, readFileSync as n } from "fs";
2
- import * as r from "path";
3
- import { dirname as i, join as a } from "path";
4
- import { fileURLToPath as o } from "url";
5
- import s, { constants as c, existsSync as l } from "node:fs";
6
- import u from "node:path";
7
- import d from "open";
8
- import { customAlphabet as f } from "nanoid";
9
- import { ProxyAgent as p, request as m } from "undici";
10
- import { HttpProxyAgent as ee } from "http-proxy-agent";
11
- import { HttpsProxyAgent as te } from "https-proxy-agent";
12
- import { createServer as ne } from "http";
13
- import { URL as re, fileURLToPath as h } from "node:url";
14
- import { createHash as g, randomBytes as ie } from "crypto";
15
- import _, { createHash as ae, randomUUID as oe } from "node:crypto";
1
+ import e, { constants as t, existsSync as n } from "node:fs";
2
+ import r from "node:path";
3
+ import i from "open";
4
+ import { customAlphabet as a } from "nanoid";
5
+ import { ProxyAgent as o, request as s } from "undici";
6
+ import { HttpProxyAgent as c } from "http-proxy-agent";
7
+ import { HttpsProxyAgent as l } from "https-proxy-agent";
8
+ import { createServer as u } from "http";
9
+ import { URL as d, fileURLToPath as f } from "node:url";
10
+ import { createHash as p, randomBytes as m } from "crypto";
11
+ import h, { createHash as g, randomUUID as _ } from "node:crypto";
16
12
  import v from "node:fs/promises";
17
- import se from "node:os";
18
- import y from "os";
19
- import { execFile as ce } from "child_process";
20
- import { promisify as le } from "util";
21
- import * as b from "winreg";
22
- import { z as x } from "zod";
23
- import S, { WebSocket as ue } from "ws";
24
- import { Buffer as C } from "node:buffer";
13
+ import y from "node:os";
14
+ import b, { promises as x } from "fs";
15
+ import S from "os";
16
+ import { execFile as ee } from "child_process";
17
+ import { promisify as te } from "util";
18
+ import * as C from "winreg";
19
+ import * as ne from "path";
20
+ import { z as w } from "zod";
21
+ import T, { WebSocket as re } from "ws";
22
+ import { Buffer as ie } from "node:buffer";
25
23
  //#region src/utils/version.ts
26
- var w = null;
27
- function de() {
28
- if (w !== null) return !!w;
29
- try {
30
- let e = n(a(i(o(import.meta.url)), "../../package.json"), "utf-8");
31
- w = (JSON.parse(e).version || "").includes("beta");
32
- } catch (e) {
33
- console.error(`Failed to check version: ${e}`);
34
- }
35
- return !!w;
24
+ var ae = null;
25
+ function oe() {
26
+ return ae === null && (ae = "1.3.0-beta.3".includes("beta") || "1.3.0-beta.3".includes("alpha")), !!ae;
36
27
  }
37
28
  //#endregion
38
29
  //#region src/runtime.ts
39
- var fe = null;
40
- function pe(e) {
41
- fe = e;
30
+ var se = null;
31
+ function ce(e) {
32
+ se = e;
42
33
  }
43
- function me() {
44
- if (!fe) throw Error("Yoyo runtime not initialized");
45
- return fe;
34
+ function le() {
35
+ if (!se) throw Error("Yoyo runtime not initialized");
36
+ return se;
46
37
  }
47
- function he() {
38
+ function ue() {
48
39
  try {
49
40
  let e = j();
50
41
  return {
@@ -57,46 +48,46 @@ function he() {
57
48
  }
58
49
  //#endregion
59
50
  //#region src/utils/env.ts
60
- var T = {
51
+ var E = {
61
52
  brand: "YOYO_CLAW_BRAND",
62
53
  manufacture: "YOYO_CLAW_MANUFACTURER",
63
54
  deviceType: "YOYO_CLAW_DEVICE_TYPE",
64
55
  userId: "YOYO_CLAW_USER_ID"
65
- }, ge = "YOYO_CLAW_ENV", _e = {
56
+ }, de = "YOYO_CLAW_ENV", fe = {
66
57
  dev: "dev",
67
58
  pre: "test",
68
59
  test: "test",
69
60
  prd: "production",
70
61
  production: "production"
71
62
  };
72
- function ve() {
63
+ function pe() {
73
64
  return {
74
- brand: process.env[T.brand],
75
- manufacture: process.env[T.manufacture],
76
- deviceType: process.env[T.deviceType]
65
+ brand: process.env[E.brand],
66
+ manufacture: process.env[E.manufacture],
67
+ deviceType: process.env[E.deviceType]
77
68
  };
78
69
  }
79
- function ye() {
80
- return process.env[T.userId];
70
+ function me() {
71
+ return process.env[E.userId];
81
72
  }
82
- function be() {
83
- let e = process.env[ge];
84
- if (e) return _e[e.toLowerCase()];
73
+ function he() {
74
+ let e = process.env[de];
75
+ if (e) return fe[e.toLowerCase()];
85
76
  }
86
77
  //#endregion
87
78
  //#region src/utils/error.ts
88
- function E(e, t) {
79
+ function D(e, t) {
89
80
  let n = e instanceof Error ? e.message : String(e);
90
81
  return Error(`${t}: ${n}`, { cause: e });
91
82
  }
92
83
  //#endregion
93
84
  //#region src/utils/logger.ts
94
- var xe = null;
95
- function Se(e) {
96
- xe = e;
85
+ var ge = null;
86
+ function _e(e) {
87
+ ge = e;
97
88
  }
98
- function D() {
99
- return xe || {
89
+ function O() {
90
+ return ge || {
100
91
  debug: console.debug,
101
92
  info: console.log,
102
93
  warn: console.warn,
@@ -105,7 +96,7 @@ function D() {
105
96
  }
106
97
  //#endregion
107
98
  //#region src/modules/configs/provider.ts
108
- function Ce(e) {
99
+ function ve(e) {
109
100
  let t = {};
110
101
  if (!e.models?.providers) return t;
111
102
  let n = Object.keys(e.models.providers);
@@ -115,7 +106,7 @@ function Ce(e) {
115
106
  }
116
107
  return t;
117
108
  }
118
- function we(e, t) {
109
+ function ye(e, t) {
119
110
  let n = { ...e };
120
111
  if (n.models?.providers) {
121
112
  let e = {};
@@ -128,46 +119,46 @@ function we(e, t) {
128
119
  providers: e
129
120
  };
130
121
  }
131
- return n.agents &&= Te(n.agents, t), n.auth?.profiles && (n.auth = {
122
+ return n.agents &&= be(n.agents, t), n.auth?.profiles && (n.auth = {
132
123
  ...n.auth,
133
- profiles: Oe(n.auth.profiles, t)
134
- }, je(t)), n;
124
+ profiles: we(n.auth.profiles, t)
125
+ }, De(t)), n;
135
126
  }
136
- function Te(e, t) {
127
+ function be(e, t) {
137
128
  let n = { ...e };
138
- return n.defaults &&= Ee(n.defaults, t), n.list &&= n.list.map((e) => De(e, t)), n;
129
+ return n.defaults &&= xe(n.defaults, t), n.list &&= n.list.map((e) => Se(e, t)), n;
139
130
  }
140
- function Ee(e, t) {
131
+ function xe(e, t) {
141
132
  let n = { ...e };
142
- if (n.model &&= O(n.model, t), n.imageModel &&= O(n.imageModel, t), n.pdfModel &&= O(n.pdfModel, t), n.models) {
133
+ if (n.model &&= k(n.model, t), n.imageModel &&= k(n.imageModel, t), n.pdfModel &&= k(n.pdfModel, t), n.models) {
143
134
  let e = {};
144
135
  for (let [r, i] of Object.entries(n.models)) {
145
- let n = k(r, t);
136
+ let n = Ce(r, t);
146
137
  e[n] = i;
147
138
  }
148
139
  n.models = e;
149
140
  }
150
141
  return n.subagents?.model && (n.subagents = {
151
142
  ...n.subagents,
152
- model: O(n.subagents.model, t)
143
+ model: k(n.subagents.model, t)
153
144
  }), n;
154
145
  }
155
- function De(e, t) {
146
+ function Se(e, t) {
156
147
  let n = { ...e };
157
- return n.model &&= O(n.model, t), n.subagents?.model && (n.subagents = {
148
+ return n.model &&= k(n.model, t), n.subagents?.model && (n.subagents = {
158
149
  ...n.subagents,
159
- model: O(n.subagents.model, t)
150
+ model: k(n.subagents.model, t)
160
151
  }), n;
161
152
  }
162
- function O(e, t) {
163
- if (typeof e == "string") return k(e, t);
153
+ function k(e, t) {
154
+ if (typeof e == "string") return Ce(e, t);
164
155
  if (typeof e == "object" && e) {
165
156
  let n = { ...e };
166
- return n.primary &&= k(n.primary, t), n.fallbacks && Array.isArray(n.fallbacks) && (n.fallbacks = n.fallbacks.map((e) => k(e, t))), n;
157
+ return n.primary &&= Ce(n.primary, t), n.fallbacks && Array.isArray(n.fallbacks) && (n.fallbacks = n.fallbacks.map((e) => Ce(e, t))), n;
167
158
  }
168
159
  return e;
169
160
  }
170
- function k(e, t) {
161
+ function Ce(e, t) {
171
162
  let n = e.split("/");
172
163
  if (n.length > 0) {
173
164
  let e = t[n[0]];
@@ -175,7 +166,7 @@ function k(e, t) {
175
166
  }
176
167
  return e;
177
168
  }
178
- function Oe(e, t) {
169
+ function we(e, t) {
179
170
  let n = {};
180
171
  for (let [r, i] of Object.entries(e)) {
181
172
  let e = { ...i }, a = t[e.provider];
@@ -183,85 +174,85 @@ function Oe(e, t) {
183
174
  }
184
175
  return n;
185
176
  }
186
- function ke() {
177
+ function Te() {
187
178
  return process.platform === "win32" ? process.env.USERPROFILE || "" : process.env.HOME || "";
188
179
  }
189
- function Ae(e) {
190
- let t = [], n = ke(), r = e || u.join(n, ".openclaw"), i = u.join(r, "agents", "main", "agent", "auth-profiles.json");
191
- s.existsSync(i) && t.push(i);
192
- let a = u.join(r, "agents");
193
- if (s.existsSync(a)) {
194
- let e = s.readdirSync(a, { withFileTypes: !0 });
195
- for (let n of e) if (n.isDirectory()) {
196
- let e = u.join(a, n.name, "agent", "auth-profiles.json");
197
- s.existsSync(e) && !t.includes(e) && t.push(e);
180
+ function Ee(t) {
181
+ let n = [], i = Te(), a = t || r.join(i, ".openclaw"), o = r.join(a, "agents", "main", "agent", "auth-profiles.json");
182
+ e.existsSync(o) && n.push(o);
183
+ let s = r.join(a, "agents");
184
+ if (e.existsSync(s)) {
185
+ let t = e.readdirSync(s, { withFileTypes: !0 });
186
+ for (let i of t) if (i.isDirectory()) {
187
+ let t = r.join(s, i.name, "agent", "auth-profiles.json");
188
+ e.existsSync(t) && !n.includes(t) && n.push(t);
198
189
  }
199
190
  }
200
- return t;
191
+ return n;
201
192
  }
202
- function je(e, t) {
203
- let n = Ae(t), r = [], i = [], a = !1;
204
- for (let t of n) try {
205
- let n = s.readFileSync(t, "utf-8"), i = JSON.parse(n);
206
- if (!i.profiles || typeof i.profiles != "object") continue;
207
- let o = !1;
208
- for (let [t, n] of Object.entries(i.profiles)) {
209
- let t = n, r = t.provider, i = e[r];
210
- i && r !== i && (t.provider = i, o = !0);
211
- }
212
- if (i.order && typeof i.order == "object") {
213
- let t = {};
214
- for (let [n, r] of Object.entries(i.order)) {
215
- let i = e[n], a = i || n;
216
- t[a] = r, i && n !== i && (o = !0);
193
+ function De(t, n) {
194
+ let r = Ee(n), i = [], a = [], o = !1;
195
+ for (let n of r) try {
196
+ let r = e.readFileSync(n, "utf-8"), a = JSON.parse(r);
197
+ if (!a.profiles || typeof a.profiles != "object") continue;
198
+ let s = !1;
199
+ for (let [e, n] of Object.entries(a.profiles)) {
200
+ let e = n, r = e.provider, i = t[r];
201
+ i && r !== i && (e.provider = i, s = !0);
202
+ }
203
+ if (a.order && typeof a.order == "object") {
204
+ let e = {};
205
+ for (let [n, r] of Object.entries(a.order)) {
206
+ let i = t[n], a = i || n;
207
+ e[a] = r, i && n !== i && (s = !0);
217
208
  }
218
- o && (i.order = t);
209
+ s && (a.order = e);
219
210
  }
220
- if (i.lastGood && typeof i.lastGood == "object") {
221
- let t = {};
222
- for (let [n, r] of Object.entries(i.lastGood)) {
223
- let i = e[n], a = i || n;
224
- t[a] = r, i && n !== i && (o = !0);
211
+ if (a.lastGood && typeof a.lastGood == "object") {
212
+ let e = {};
213
+ for (let [n, r] of Object.entries(a.lastGood)) {
214
+ let i = t[n], a = i || n;
215
+ e[a] = r, i && n !== i && (s = !0);
225
216
  }
226
- o && (i.lastGood = t);
217
+ s && (a.lastGood = e);
227
218
  }
228
- o && (s.writeFileSync(t, JSON.stringify(i, null, 2) + "\n", "utf-8"), r.push(t), a = !0);
219
+ s && (e.writeFileSync(n, JSON.stringify(a, null, 2) + "\n", "utf-8"), i.push(n), o = !0);
229
220
  } catch (e) {
230
- let n = e instanceof Error ? e.message : String(e);
231
- i.push(`${t}: ${n}`);
221
+ let t = e instanceof Error ? e.message : String(e);
222
+ a.push(`${n}: ${t}`);
232
223
  }
233
224
  return {
234
- updated: a,
235
- files: r,
236
- errors: i
225
+ updated: o,
226
+ files: i,
227
+ errors: a
237
228
  };
238
229
  }
239
230
  //#endregion
240
231
  //#region src/modules/configs/config-manager.ts
241
- var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create,alarm.delete,alarm.disable,alarm.enable,alarm.query,alarm.update,app.close,app.open,call.phone,call.search,capture-screenshot,contact.search,file-upload,hotspot,local-search,message.search,message.send,mobile-data,no-disturb,quiet-mode,ringing-mode,schedule.create,schedule.delete,schedule.search,schedule.update,screen-record,vibration-mode,volume.operate,wlan,bluetooth,location-service,nfc,usb-shared-network,eyecomfort,status-bar-show,brightness,autoscreen-onnotice,dark-mode,device-operation,camera,app.uninstall,audio-record,battery,gui.create,gui.pause,gui.terminate,mcp.tool.call".split(","), Fe = class {
232
+ var A = "yoyo", Oe = { watch: !0 }, ke = 250, Ae = /* @__PURE__ */ "alarm.create,alarm.delete,alarm.disable,alarm.enable,alarm.query,alarm.update,app.close,app.open,call.phone,call.search,capture-screenshot,contact.search,file-upload,hotspot,local-search,message.search,message.send,mobile-data,no-disturb,quiet-mode,ringing-mode,schedule.create,schedule.delete,schedule.search,schedule.update,screen-record,vibration-mode,volume.operate,wlan,bluetooth,location-service,nfc,usb-shared-network,eyecomfort,status-bar-show,brightness,autoscreen-onnotice,dark-mode,device-operation,camera,app.uninstall,audio-record,battery,gui.create,gui.pause,gui.terminate,mcp.tool.call".split(","), je = class {
242
233
  loadConfig() {
243
234
  try {
244
- return me().config.loadConfig();
235
+ return le().config.loadConfig();
245
236
  } catch (e) {
246
- throw E(e, "Failed to load config");
237
+ throw D(e, "Failed to load config");
247
238
  }
248
239
  }
249
240
  async saveConfig(e) {
250
241
  try {
251
- await me().config.writeConfigFile(e);
242
+ await le().config.writeConfigFile(e);
252
243
  } catch (e) {
253
- throw E(e, "Failed to save config");
244
+ throw D(e, "Failed to save config");
254
245
  }
255
246
  }
256
247
  getGatewayAuthConfig() {
257
248
  try {
258
249
  let e = this.loadConfig().gateway?.auth;
259
250
  if (!e) return;
260
- let t = {
261
- token: "",
262
- password: ""
251
+ let t = e.token ?? "", n = e.password ?? "";
252
+ return !t && !n ? void 0 : {
253
+ token: t,
254
+ password: n
263
255
  };
264
- return e.token && (t.token = e.token), e.password && (t.password = e.password), Object.keys(t).length === 0 ? void 0 : t;
265
256
  } catch (e) {
266
257
  console.error(`[claw-configs] Failed to read gateway auth config: ${e}`);
267
258
  return;
@@ -291,7 +282,7 @@ var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create
291
282
  env: n,
292
283
  source: "manual"
293
284
  };
294
- let r = be();
285
+ let r = he();
295
286
  return r ? {
296
287
  env: r,
297
288
  source: "env"
@@ -346,7 +337,7 @@ var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create
346
337
  };
347
338
  await this.saveConfig(r);
348
339
  } catch (e) {
349
- throw E(e, "Failed to update device config");
340
+ throw D(e, "Failed to update device config");
350
341
  }
351
342
  }
352
343
  async updateEnv(e) {
@@ -374,7 +365,7 @@ var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create
374
365
  };
375
366
  await this.saveConfig(n);
376
367
  } catch (e) {
377
- throw E(e, "Failed to update env config");
368
+ throw D(e, "Failed to update env config");
378
369
  }
379
370
  }
380
371
  async resetEnv() {
@@ -403,7 +394,7 @@ var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create
403
394
  };
404
395
  await this.saveConfig(n);
405
396
  } catch (e) {
406
- throw E(e, "Failed to reset env config");
397
+ throw D(e, "Failed to reset env config");
407
398
  }
408
399
  }
409
400
  async updateGrayTag(e) {
@@ -427,7 +418,7 @@ var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create
427
418
  };
428
419
  await this.saveConfig(n);
429
420
  } catch (e) {
430
- throw E(e, "Failed to update gray tag config");
421
+ throw D(e, "Failed to update gray tag config");
431
422
  }
432
423
  }
433
424
  async updateUserConfig(e) {
@@ -451,7 +442,7 @@ var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create
451
442
  };
452
443
  await this.saveConfig(n);
453
444
  } catch (e) {
454
- throw E(e, "Failed to update user config");
445
+ throw D(e, "Failed to update user config");
455
446
  }
456
447
  }
457
448
  async clearUserConfig() {
@@ -474,25 +465,25 @@ var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create
474
465
  };
475
466
  await this.saveConfig(t);
476
467
  } catch (e) {
477
- throw E(e, "Failed to clear user config");
468
+ throw D(e, "Failed to clear user config");
478
469
  }
479
470
  }
480
471
  async initializePluginConfig(e) {
481
472
  try {
482
- let t = this.loadConfig(), n = t.plugins?.allow || [], r = n.includes(e) ? n : [...n, e], i = t.gateway?.nodes?.allowCommands || [], a = Array.from(new Set([...i, ...Pe])), o = t.skills || {}, s = o.load || {}, c = s.watch === Me.watch && s.watchDebounceMs !== void 0 ? s : {
473
+ let t = this.loadConfig(), n = t.plugins?.allow || [], r = n.includes(e) ? n : [...n, e], i = t.gateway?.nodes?.allowCommands || [], a = Array.from(new Set([...i, ...Ae])), o = t.skills || {}, s = o.load || {}, c = s.watch === Oe.watch && s.watchDebounceMs !== void 0 ? s : {
483
474
  ...s,
484
- ...Me,
485
- watchDebounceMs: s.watchDebounceMs ?? Ne
486
- }, l = t.plugins?.entries?.[e]?.config?.envInfo, u = t.plugins?.entries?.[e]?.config?.env, d = !!(l?.env || u), f = be(), p = !!l?.env && l.source === "env", m = !l?.env && !!u || p && f && l.env !== f, ee = !d || m, te = {
487
- env: f || u || (de() ? "test" : "production"),
475
+ ...Oe,
476
+ watchDebounceMs: s.watchDebounceMs ?? ke
477
+ }, l = t.plugins?.entries?.[e]?.config?.envInfo, u = t.plugins?.entries?.[e]?.config?.env, d = !!(l?.env || u), f = he(), p = !!l?.env && l.source === "env", m = !l?.env && !!u || p && f && l.env !== f, h = !d || m, g = {
478
+ env: f || u || (oe() ? "test" : "production"),
488
479
  source: "env"
489
- }, ne = t.plugins?.entries?.[e]?.config || {}, re = ee ? {
490
- ...ne,
491
- envInfo: te,
480
+ }, _ = t.plugins?.entries?.[e]?.config || {}, v = h ? {
481
+ ..._,
482
+ envInfo: g,
492
483
  env: void 0
493
- } : ne, h = Ce(t);
494
- Object.keys(h).length > 0 && D().info(`[claw-configs] Found ${Object.keys(h).length} providers to rename: ${Object.entries(h).map(([e, t]) => `${e} -> ${t}`).join(", ")}`);
495
- let g = {
484
+ } : _, y = ve(t);
485
+ Object.keys(y).length > 0 && O().info(`[claw-configs] Found ${Object.keys(y).length} providers to rename: ${Object.entries(y).map(([e, t]) => `${e} -> ${t}`).join(", ")}`);
486
+ let b = {
496
487
  ...t,
497
488
  plugins: {
498
489
  ...t.plugins,
@@ -502,7 +493,7 @@ var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create
502
493
  [e]: {
503
494
  ...t.plugins?.entries?.[e],
504
495
  enabled: !0,
505
- config: re
496
+ config: v
506
497
  }
507
498
  }
508
499
  },
@@ -518,24 +509,24 @@ var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create
518
509
  load: c
519
510
  }
520
511
  };
521
- Object.keys(h).length > 0 && (g = we(g, h), D().info("[claw-configs] Provider renaming completed")), await this.saveConfig(g);
512
+ Object.keys(y).length > 0 && (b = ye(b, y), O().info("[claw-configs] Provider renaming completed")), await this.saveConfig(b);
522
513
  } catch (e) {
523
- throw E(e, "failed to initialize plugin config");
514
+ throw D(e, "failed to initialize plugin config");
524
515
  }
525
516
  }
526
- }, Ie = null;
517
+ }, Me = null;
527
518
  function j() {
528
- return Ie ||= new Fe(), Ie;
519
+ return Me ||= new je(), Me;
529
520
  }
530
521
  //#endregion
531
522
  //#region src/commands/env/impl.ts
532
- var Le = {
523
+ var Ne = {
533
524
  env: "environment variable",
534
525
  manual: "manual config"
535
526
  };
536
- function Re(e, t) {
527
+ function Pe(e, t) {
537
528
  return t.command("env").description("Manage runtime environment (dev/test/production)").option("--set <env>", "Set environment: dev, test or production").option("--gray <tag>", "Set gray header").option("--reset", "Reset env source to environment variable").action(async (e) => {
538
- let { set: t, gray: n, reset: r } = e, i = D();
529
+ let { set: t, gray: n, reset: r } = e, i = O();
539
530
  try {
540
531
  let e = j();
541
532
  if (r && (await e.resetEnv(), i.info("✅ Environment source reset to environment variable")), t) {
@@ -547,7 +538,7 @@ function Re(e, t) {
547
538
  }
548
539
  if (n ? (await e.updateGrayTag(n), i.info(`✅ Gray tag set to: ${n}`)) : n === "" && (await e.updateGrayTag(void 0), i.info("✅ Gray tag cleared")), !t && n === void 0) {
549
540
  let t = e.getEnvInfo(), n = e.getGrayTag();
550
- i.info(`📋 Current environment: ${t.env} (source: ${Le[t.source]})`), n ? i.info(`📋 Current gray tag: ${n}`) : i.info("📋 Gray tag: not set");
541
+ i.info(`📋 Current environment: ${t.env} (source: ${Ne[t.source]})`), n ? i.info(`📋 Current gray tag: ${n}`) : i.info("📋 Gray tag: not set");
551
542
  }
552
543
  } catch (e) {
553
544
  let t = e instanceof Error ? e.message : String(e);
@@ -557,19 +548,19 @@ function Re(e, t) {
557
548
  }
558
549
  //#endregion
559
550
  //#region src/utils/id.ts
560
- var ze = f("0123456789abcdefghijklmnopqrstuvwxyz", 32);
551
+ var Fe = a("0123456789abcdefghijklmnopqrstuvwxyz", 32);
561
552
  function M(e) {
562
- return ze(e);
553
+ return Fe(e);
563
554
  }
564
555
  //#endregion
565
556
  //#region src/apis/helpers.ts
566
- function Be(e) {
557
+ function Ie(e) {
567
558
  return e.status >= 200 && e.status < 300 && e.data.code === "1";
568
559
  }
569
560
  //#endregion
570
561
  //#region src/apis/hosts.ts
571
- function Ve() {
572
- let e = he(), t;
562
+ function Le() {
563
+ let e = ue(), t;
573
564
  switch (e.env) {
574
565
  case "dev":
575
566
  t = {
@@ -594,34 +585,34 @@ function Ve() {
594
585
  }
595
586
  //#endregion
596
587
  //#region src/utils/proxy.ts
597
- function He(e) {
588
+ function Re(e) {
598
589
  return e || process.env.HTTP_PROXY || process.env.http_proxy || process.env.HTTPS_PROXY || process.env.https_proxy;
599
590
  }
600
- function Ue(e, t) {
591
+ function ze(e, t) {
601
592
  return !t && !!e;
602
593
  }
603
- function We(e, t) {
604
- let n = He(t);
594
+ function Be(e, t) {
595
+ let n = Re(t);
605
596
  if (n) {
606
- if (e.startsWith("wss://")) return new te(n);
607
- if (e.startsWith("ws://")) return new ee(n);
597
+ if (e.startsWith("wss://")) return new l(n);
598
+ if (e.startsWith("ws://")) return new c(n);
608
599
  }
609
600
  }
610
601
  //#endregion
611
602
  //#region src/apis/http-client.ts
612
- var Ge = class extends Error {
603
+ var Ve = class extends Error {
613
604
  constructor(e, t, n) {
614
605
  super(n), this.status = e, this.data = t, this.name = "HttpError";
615
606
  }
616
- }, Ke = class {
607
+ }, He = class {
617
608
  baseUrl;
618
609
  defaultHeaders;
619
610
  defaultTimeout;
620
611
  proxyAgent;
621
612
  constructor(e, t) {
622
613
  this.baseUrl = e.replace(/\/$/, ""), this.defaultHeaders = t?.defaultHeaders || {}, this.defaultTimeout = t?.defaultTimeout || 3e4;
623
- let n = He(t?.proxy);
624
- n && (this.proxyAgent = new p(n));
614
+ let n = Re(t?.proxy);
615
+ n && (this.proxyAgent = new o(n));
625
616
  }
626
617
  async request(e) {
627
618
  let { method: t = "GET", headers: n = {}, body: r, timeout: i = this.defaultTimeout, query: a } = e, o = e.url;
@@ -633,35 +624,35 @@ var Ge = class extends Error {
633
624
  let t = e.toString();
634
625
  t && (o += (o.includes("?") ? "&" : "?") + t);
635
626
  }
636
- let s = {
627
+ let c = {
637
628
  ...this.defaultHeaders,
638
629
  ...n
639
630
  };
640
- r && !s["Content-Type"] && (s["Content-Type"] = "application/json");
641
- let c;
642
- r != null && (c = typeof r == "string" ? r : JSON.stringify(r));
631
+ r && !c["Content-Type"] && (c["Content-Type"] = "application/json");
632
+ let l;
633
+ r != null && (l = typeof r == "string" ? r : JSON.stringify(r));
643
634
  try {
644
- let n = Ue(He(), e.disableProxy) && this.proxyAgent ? this.proxyAgent : void 0, r = await m(o, {
635
+ let n = ze(Re(), e.disableProxy) && this.proxyAgent ? this.proxyAgent : void 0, r = await s(o, {
645
636
  method: t,
646
- headers: s,
647
- body: c,
637
+ headers: c,
638
+ body: l,
648
639
  headersTimeout: i,
649
640
  bodyTimeout: i,
650
641
  dispatcher: n
651
- }), a = await r.body.text(), l;
642
+ }), a = await r.body.text(), u;
652
643
  try {
653
- l = a ? JSON.parse(a) : {};
644
+ u = a ? JSON.parse(a) : {};
654
645
  } catch {
655
- l = a;
646
+ u = a;
656
647
  }
657
648
  if (r.statusCode >= 200 && r.statusCode < 300) return {
658
- data: l,
649
+ data: u,
659
650
  status: r.statusCode,
660
651
  headers: r.headers
661
652
  };
662
- throw new Ge(r.statusCode, l, `HTTP request failed with status ${r.statusCode}`);
653
+ throw new Ve(r.statusCode, u, `HTTP request failed with status ${r.statusCode}`);
663
654
  } catch (e) {
664
- throw e instanceof Ge ? e : E(e, "HTTP request failed");
655
+ throw e instanceof Ve ? e : D(e, "HTTP request failed");
665
656
  }
666
657
  }
667
658
  async get(e, t) {
@@ -699,10 +690,10 @@ var Ge = class extends Error {
699
690
  method: "PATCH"
700
691
  });
701
692
  }
702
- }, qe = class {
693
+ }, Ue = class {
703
694
  httpClient;
704
695
  constructor(e, t) {
705
- this.httpClient = new Ke(e, t);
696
+ this.httpClient = new He(e, t);
706
697
  }
707
698
  async registerDevice(e, t, n) {
708
699
  let r = {
@@ -758,25 +749,25 @@ var Ge = class extends Error {
758
749
  headers: r,
759
750
  timeout: 15e3
760
751
  });
761
- if (Be(a) && a.data.data) return a.data.data;
752
+ if (Ie(a) && a.data.data) return a.data.data;
762
753
  throw Error(`failed to get token: ${JSON.stringify(a.data)}, traceId: ${n}`);
763
754
  }
764
755
  };
765
756
  function N() {
766
- let e = Ve();
767
- return new qe(`https://${e.clawCloud}/aicloud/yoyo-claw-service`, e.grayTag ? { defaultHeaders: { "x-gray": e.grayTag } } : void 0);
757
+ let e = Le();
758
+ return new Ue(`https://${e.clawCloud}/aicloud/yoyo-claw-service`, e.grayTag ? { defaultHeaders: { "x-gray": e.grayTag } } : void 0);
768
759
  }
769
760
  //#endregion
770
761
  //#region src/honor-auth/assets/favicon.png
771
- var Je = "data:image/png;base64,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", Ye = "<svg aria-hidden=\"true\" viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"32\" cy=\"32\" r=\"30\" fill=\"currentColor\" opacity=\"0.12\"/><circle cx=\"32\" cy=\"32\" r=\"21\" fill=\"currentColor\"/><path d=\"M22.5 32.5L29 39L42.5 25.5\" stroke=\"white\" stroke-width=\"4.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>", Xe = "<svg aria-hidden=\"true\" viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"32\" cy=\"32\" r=\"30\" fill=\"currentColor\" opacity=\"0.12\"/><circle cx=\"32\" cy=\"32\" r=\"21\" fill=\"currentColor\"/><path d=\"M24.5 24.5L39.5 39.5M39.5 24.5L24.5 39.5\" stroke=\"white\" stroke-width=\"4.5\" stroke-linecap=\"round\"/></svg>", Ze = { favicon: "/favicon.png" };
762
+ var We = "data:image/png;base64,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", Ge = "<svg aria-hidden=\"true\" viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"32\" cy=\"32\" r=\"30\" fill=\"currentColor\" opacity=\"0.12\"/><circle cx=\"32\" cy=\"32\" r=\"21\" fill=\"currentColor\"/><path d=\"M22.5 32.5L29 39L42.5 25.5\" stroke=\"white\" stroke-width=\"4.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>", Ke = "<svg aria-hidden=\"true\" viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"32\" cy=\"32\" r=\"30\" fill=\"currentColor\" opacity=\"0.12\"/><circle cx=\"32\" cy=\"32\" r=\"21\" fill=\"currentColor\"/><path d=\"M24.5 24.5L39.5 39.5M39.5 24.5L24.5 39.5\" stroke=\"white\" stroke-width=\"4.5\" stroke-linecap=\"round\"/></svg>", qe = { favicon: "/favicon.png" };
772
763
  function P(e) {
773
764
  return e.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\"", "&quot;").replaceAll("'", "&#39;");
774
765
  }
775
- function Qe(e) {
766
+ function Je(e) {
776
767
  return !e || e.length === 0 ? "" : `<div class="details">${e.map((e) => `<div class="detail-item"><span class="detail-key">${P(e.key)}</span><span class="detail-value">${P(e.value)}</span></div>`).join("")}</div>`;
777
768
  }
778
769
  function F(e) {
779
- let t = e.statusClass === "success" ? Ye : Xe;
770
+ let t = e.statusClass === "success" ? Ge : Ke;
780
771
  return `<!doctype html>
781
772
  <html lang="zh-CN">
782
773
  <head>
@@ -968,7 +959,7 @@ function F(e) {
968
959
  </div>
969
960
  <div class="icon-wrap ${e.statusClass}">${t}</div>
970
961
  <h1>${P(e.title)}</h1>
971
- ${Qe(e.details)}
962
+ ${Je(e.details)}
972
963
  <div class="footer">
973
964
  <p class="hint">${P(e.hintText)}</p>
974
965
  <p class="caption">浏览器不会自动关闭当前页面,保留或稍后关闭都不影响登录结果。</p>
@@ -979,9 +970,9 @@ function F(e) {
979
970
  }
980
971
  //#endregion
981
972
  //#region src/honor-auth/callback-server.ts
982
- var $e = { "favicon.png": Je };
983
- function et(e, t) {
984
- let n = $e[t];
973
+ var Ye = { "favicon.png": We };
974
+ function Xe(e, t) {
975
+ let n = Ye[t];
985
976
  if (!n) {
986
977
  e.writeHead(404), e.end();
987
978
  return;
@@ -992,19 +983,19 @@ function et(e, t) {
992
983
  "Cache-Control": "public, max-age=3600"
993
984
  }), e.end(i);
994
985
  }
995
- function tt(e) {
986
+ function Ze(e) {
996
987
  return new Promise((t, n) => {
997
- let { port: r, timeout: i = 6e5, onCodeReceived: a, onError: o } = e, s = null, c = !1, l = !1, u = !1, d = () => {
998
- c || (c = !0, s && clearTimeout(s), m.close());
999
- }, f = (e) => {
1000
- d(), o?.(e), u || (u = !0, n(e));
1001
- }, p = (e = 120) => {
988
+ let { port: r, timeout: i = 6e5, onCodeReceived: a, onError: o } = e, s = null, c = !1, l = !1, f = !1, p = () => {
989
+ c || (c = !0, s && clearTimeout(s), g.close());
990
+ }, m = (e) => {
991
+ p(), o?.(e), f || (f = !0, n(e));
992
+ }, h = (e = 120) => {
1002
993
  setTimeout(() => {
1003
- d();
994
+ p();
1004
995
  }, e);
1005
- }, m = ne((e, t) => {
996
+ }, g = u((e, t) => {
1006
997
  try {
1007
- let n = new re(e.url || "", `http://localhost:${r}`);
998
+ let n = new d(e.url || "", `http://localhost:${r}`);
1008
999
  if (e.method !== "GET") {
1009
1000
  t.writeHead(405, { "Content-Type": "text/html; charset=utf-8" }), t.end(F({
1010
1001
  pageTitle: "请求方式不支持",
@@ -1014,8 +1005,8 @@ function tt(e) {
1014
1005
  }));
1015
1006
  return;
1016
1007
  }
1017
- if (n.pathname === "/favicon.ico" || n.pathname === Ze.favicon) {
1018
- et(t, "favicon.png");
1008
+ if (n.pathname === "/favicon.ico" || n.pathname === qe.favicon) {
1009
+ Xe(t, "favicon.png");
1019
1010
  return;
1020
1011
  }
1021
1012
  let i = n.searchParams.get("code") || "", o = n.searchParams.get("error") || "", s = n.searchParams.get("error_description") || n.searchParams.get("error_message") || "";
@@ -1024,7 +1015,7 @@ function tt(e) {
1024
1015
  statusClass: "success",
1025
1016
  title: "登录已完成",
1026
1017
  hintText: "请返回 OpenClaw,登录流程会继续完成。"
1027
- })), p(), a(i)) : o && !l ? (t.writeHead(400, { "Content-Type": "text/html; charset=utf-8" }), t.end(F({
1018
+ })), h(), a(i)) : o && !l ? (t.writeHead(400, { "Content-Type": "text/html; charset=utf-8" }), t.end(F({
1028
1019
  pageTitle: "授权失败",
1029
1020
  statusClass: "error",
1030
1021
  title: "未能完成授权",
@@ -1037,7 +1028,7 @@ function tt(e) {
1037
1028
  value: s
1038
1029
  }] : []]
1039
1030
  })), setTimeout(() => {
1040
- f(/* @__PURE__ */ Error(s ? `authorization failed: ${o} (${s})` : `authorization failed: ${o}`));
1031
+ m(/* @__PURE__ */ Error(s ? `authorization failed: ${o} (${s})` : `authorization failed: ${o}`));
1041
1032
  }, 120)) : l ? (t.writeHead(200, { "Content-Type": "text/html; charset=utf-8" }), t.end(F({
1042
1033
  pageTitle: "登录已完成",
1043
1034
  statusClass: "success",
@@ -1049,7 +1040,7 @@ function tt(e) {
1049
1040
  title: "回调参数不完整",
1050
1041
  hintText: "请返回 OpenClaw 重新发起登录。"
1051
1042
  })), setTimeout(() => {
1052
- f(/* @__PURE__ */ Error("authorization failed: no code in callback"));
1043
+ m(/* @__PURE__ */ Error("authorization failed: no code in callback"));
1053
1044
  }, 120));
1054
1045
  } catch (e) {
1055
1046
  console.error("authorize callback error:", e), t.writeHead(500, { "Content-Type": "text/html; charset=utf-8" }), t.end(F({
@@ -1058,24 +1049,24 @@ function tt(e) {
1058
1049
  title: "回调服务出现异常",
1059
1050
  hintText: "请返回 OpenClaw 后重新发起登录。"
1060
1051
  })), setTimeout(() => {
1061
- f(/* @__PURE__ */ Error("authorization failed: callback server internal error"));
1052
+ m(/* @__PURE__ */ Error("authorization failed: callback server internal error"));
1062
1053
  }, 120);
1063
1054
  }
1064
1055
  });
1065
- m.on("error", (e) => {
1066
- f(e);
1067
- }), m.listen(r, () => {
1056
+ g.on("error", (e) => {
1057
+ m(e);
1058
+ }), g.listen(r, () => {
1068
1059
  s = setTimeout(() => {
1069
- f(/* @__PURE__ */ Error("authorize timeout"));
1060
+ m(/* @__PURE__ */ Error("authorize timeout"));
1070
1061
  }, i);
1071
- }), m.on("close", () => {
1072
- s && clearTimeout(s), u || (u = !0, t());
1062
+ }), g.on("close", () => {
1063
+ s && clearTimeout(s), f || (f = !0, t());
1073
1064
  });
1074
1065
  });
1075
1066
  }
1076
1067
  //#endregion
1077
1068
  //#region src/honor-auth/config.ts
1078
- var nt = {
1069
+ var Qe = {
1079
1070
  authHost: "https://hnoauth-login-test-drcn.cloud.honor.com",
1080
1071
  clientId: "221641491",
1081
1072
  redirectUri: "http://127.0.0.1:8081/deepLink",
@@ -1083,7 +1074,7 @@ var nt = {
1083
1074
  scope: "openid profile",
1084
1075
  reqClientType: "110",
1085
1076
  loginChannel: "99011000"
1086
- }, rt = {
1077
+ }, $e = {
1087
1078
  authHost: "https://hnoauth-login-drcn.cloud.honor.com",
1088
1079
  clientId: "221000597",
1089
1080
  redirectUri: "http://127.0.0.1:8081/deepLink",
@@ -1092,31 +1083,31 @@ var nt = {
1092
1083
  reqClientType: "110",
1093
1084
  loginChannel: "99011000"
1094
1085
  };
1095
- function it(e) {
1086
+ function et(e) {
1096
1087
  return {
1097
- ...he()?.env === "production" ? rt : nt,
1088
+ ...ue()?.env === "production" ? $e : Qe,
1098
1089
  ...e
1099
1090
  };
1100
1091
  }
1101
1092
  //#endregion
1102
1093
  //#region src/honor-auth/honor-auth-client.ts
1103
- var at = class {
1094
+ var tt = class {
1104
1095
  config;
1105
1096
  constructor(e) {
1106
1097
  this.config = e;
1107
1098
  }
1108
1099
  generateRandomString(e) {
1109
- let t = ie(e), n = "";
1100
+ let t = m(e), n = "";
1110
1101
  for (let r = 0; r < e; r++) n += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"[t[r] % 62];
1111
1102
  return n;
1112
1103
  }
1113
1104
  generateCodeVerifier(e = 128) {
1114
- let t = ie(e), n = "";
1105
+ let t = m(e), n = "";
1115
1106
  for (let r = 0; r < e; r++) n += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~"[t[r] % 66];
1116
1107
  return n;
1117
1108
  }
1118
1109
  generateCodeChallenge(e) {
1119
- return g("sha256").update(e).digest().toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
1110
+ return p("sha256").update(e).digest().toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
1120
1111
  }
1121
1112
  generatePKCEParams() {
1122
1113
  let e = this.generateCodeVerifier();
@@ -1144,8 +1135,8 @@ var at = class {
1144
1135
  return { ...this.config };
1145
1136
  }
1146
1137
  };
1147
- function ot(e) {
1148
- return new at(e);
1138
+ function nt(e) {
1139
+ return new tt(e);
1149
1140
  }
1150
1141
  //#endregion
1151
1142
  //#region src/utils/fs-safe.ts
@@ -1154,61 +1145,61 @@ var I = class extends Error {
1154
1145
  constructor(e, t, n) {
1155
1146
  super(t, n), this.code = e, this.name = "SafeFsError";
1156
1147
  }
1157
- }, st = new Set(["ENOENT", "ENOTDIR"]), ct = new Set([
1148
+ }, rt = new Set(["ENOENT", "ENOTDIR"]), it = new Set([
1158
1149
  "ELOOP",
1159
1150
  "EINVAL",
1160
1151
  "ENOTSUP"
1161
1152
  ]);
1162
- function lt(e) {
1153
+ function at(e) {
1163
1154
  return !!(e && typeof e == "object" && "code" in e);
1164
1155
  }
1165
1156
  function L(e) {
1166
- return lt(e) && typeof e.code == "string" && st.has(e.code);
1157
+ return at(e) && typeof e.code == "string" && rt.has(e.code);
1167
1158
  }
1168
- function ut(e) {
1169
- return lt(e) && typeof e.code == "string" && ct.has(e.code);
1159
+ function ot(e) {
1160
+ return at(e) && typeof e.code == "string" && it.has(e.code);
1170
1161
  }
1171
- function dt(e) {
1172
- let t = u.win32.normalize(e);
1162
+ function st(e) {
1163
+ let t = r.win32.normalize(e);
1173
1164
  return t.startsWith("\\\\?\\") && (t = t.slice(4), t.toUpperCase().startsWith("UNC\\") && (t = `\\\\${t.slice(4)}`)), t.replaceAll("/", "\\").toLowerCase();
1174
1165
  }
1175
1166
  function R(e, t) {
1176
- let n = u.resolve(e), r = u.resolve(t);
1167
+ let n = r.resolve(e), i = r.resolve(t);
1177
1168
  if (process.platform === "win32") {
1178
- let e = dt(n), t = dt(r), i = u.win32.relative(e, t);
1179
- return i === "" || !i.startsWith("..") && !u.win32.isAbsolute(i);
1169
+ let e = st(n), t = st(i), a = r.win32.relative(e, t);
1170
+ return a === "" || !a.startsWith("..") && !r.win32.isAbsolute(a);
1180
1171
  }
1181
- let i = u.relative(n, r);
1182
- return i === "" || !i.startsWith("..") && !u.isAbsolute(i);
1172
+ let a = r.relative(n, i);
1173
+ return a === "" || !a.startsWith("..") && !r.isAbsolute(a);
1183
1174
  }
1184
- function ft(e) {
1175
+ function ct(e) {
1185
1176
  return e === 0 || e === 0n;
1186
1177
  }
1187
1178
  function z(e, t, n = process.platform) {
1188
- return e.ino === t.ino ? e.dev === t.dev ? !0 : n === "win32" && (ft(e.dev) || ft(t.dev)) : !1;
1179
+ return e.ino === t.ino ? e.dev === t.dev ? !0 : n === "win32" && (ct(e.dev) || ct(t.dev)) : !1;
1189
1180
  }
1190
- var pt = process.platform !== "win32" && "O_NOFOLLOW" in c, mt = c.O_RDONLY | (pt ? c.O_NOFOLLOW : 0), ht = c.O_WRONLY | c.O_CREAT | c.O_EXCL | (pt ? c.O_NOFOLLOW : 0), gt = c.O_WRONLY | c.O_APPEND | (pt ? c.O_NOFOLLOW : 0), _t = (e) => e.endsWith(u.sep) ? e : e + u.sep;
1191
- function vt(e, t) {
1181
+ var lt = process.platform !== "win32" && "O_NOFOLLOW" in t, ut = t.O_RDONLY | (lt ? t.O_NOFOLLOW : 0), dt = t.O_WRONLY | t.O_CREAT | t.O_EXCL | (lt ? t.O_NOFOLLOW : 0), ft = t.O_WRONLY | t.O_APPEND | (lt ? t.O_NOFOLLOW : 0), pt = (e) => e.endsWith(r.sep) ? e : e + r.sep;
1182
+ function mt(e, t) {
1192
1183
  if (!e.startsWith("~")) return e;
1193
- let n = t ?? process.env.HOME ?? process.env.USERPROFILE ?? se.homedir();
1184
+ let n = t ?? process.env.HOME ?? process.env.USERPROFILE ?? y.homedir();
1194
1185
  return n ? e.replace(/^~(?=$|[\\/])/, n) : e;
1195
1186
  }
1196
- async function yt(e) {
1187
+ async function ht(e) {
1197
1188
  let t;
1198
1189
  try {
1199
1190
  t = await v.realpath(e.rootDir);
1200
1191
  } catch (e) {
1201
1192
  throw L(e) ? new I("not-found", "root dir not found") : e;
1202
1193
  }
1203
- let n = _t(t), r = vt(e.relativePath), i = u.resolve(n, r);
1204
- if (!R(n, i)) throw new I("outside-root", "file is outside workspace root");
1194
+ let n = pt(t), i = mt(e.relativePath), a = r.resolve(n, i);
1195
+ if (!R(n, a)) throw new I("outside-root", "file is outside workspace root");
1205
1196
  return {
1206
1197
  rootReal: t,
1207
1198
  rootWithSep: n,
1208
- resolved: i
1199
+ resolved: a
1209
1200
  };
1210
1201
  }
1211
- async function bt(e, t) {
1202
+ async function gt(e, t) {
1212
1203
  try {
1213
1204
  if ((await v.lstat(e)).isDirectory()) throw new I("not-file", "not a file");
1214
1205
  } catch (e) {
@@ -1216,9 +1207,9 @@ async function bt(e, t) {
1216
1207
  }
1217
1208
  let n;
1218
1209
  try {
1219
- n = await v.open(e, mt);
1210
+ n = await v.open(e, ut);
1220
1211
  } catch (e) {
1221
- throw L(e) ? new I("not-found", "file not found") : ut(e) ? new I("symlink", "symlink open blocked", { cause: e }) : lt(e) && e.code === "EISDIR" ? new I("not-file", "not a file") : e;
1212
+ throw L(e) ? new I("not-found", "file not found") : ot(e) ? new I("symlink", "symlink open blocked", { cause: e }) : at(e) && e.code === "EISDIR" ? new I("not-file", "not a file") : e;
1222
1213
  }
1223
1214
  try {
1224
1215
  let [r, i] = await Promise.all([n.stat(), v.lstat(e)]);
@@ -1238,8 +1229,8 @@ async function bt(e, t) {
1238
1229
  throw await n.close().catch(() => {}), e instanceof I ? e : L(e) ? new I("not-found", "file not found") : e;
1239
1230
  }
1240
1231
  }
1241
- async function xt(e) {
1242
- let { rootWithSep: t, resolved: n } = await yt(e), r = await bt(n);
1232
+ async function _t(e) {
1233
+ let { rootWithSep: t, resolved: n } = await ht(e), r = await gt(n);
1243
1234
  if (!R(t, r.realPath)) throw await r.handle.close().catch(() => {}), new I("outside-root", "file is outside workspace root");
1244
1235
  try {
1245
1236
  if (e.maxBytes !== void 0 && r.stat.size > e.maxBytes) throw new I("too-large", `file exceeds limit of ${e.maxBytes} bytes (got ${r.stat.size})`);
@@ -1252,20 +1243,20 @@ async function xt(e) {
1252
1243
  await r.handle.close().catch(() => {});
1253
1244
  }
1254
1245
  }
1255
- function St(e) {
1256
- let t = u.dirname(e), n = u.basename(e);
1257
- return u.join(t, `.${n}.${process.pid}.${oe()}.tmp`);
1246
+ function vt(e) {
1247
+ let t = r.dirname(e), n = r.basename(e);
1248
+ return r.join(t, `.${n}.${process.pid}.${_()}.tmp`);
1258
1249
  }
1259
- async function Ct(e) {
1260
- let t = await v.open(e.tempPath, ht, e.mode);
1250
+ async function yt(e) {
1251
+ let t = await v.open(e.tempPath, dt, e.mode);
1261
1252
  try {
1262
1253
  return typeof e.data == "string" ? await t.writeFile(e.data, e.encoding ?? "utf8") : await t.writeFile(e.data), await t.stat();
1263
1254
  } finally {
1264
1255
  await t.close().catch(() => {});
1265
1256
  }
1266
1257
  }
1267
- async function wt(e) {
1268
- let t = _t(await v.realpath(e.rootDir)), n = await bt(e.targetPath, { rejectHardlinks: !0 });
1258
+ async function bt(e) {
1259
+ let t = pt(await v.realpath(e.rootDir)), n = await gt(e.targetPath, { rejectHardlinks: !0 });
1269
1260
  try {
1270
1261
  if (process.platform !== "win32" && !z(n.stat, e.expectedStat)) throw new I("path-mismatch", "path changed during write");
1271
1262
  if (!R(t, n.realPath)) throw new I("outside-root", "file is outside workspace root");
@@ -1274,40 +1265,40 @@ async function wt(e) {
1274
1265
  }
1275
1266
  }
1276
1267
  async function B(e) {
1277
- let { rootWithSep: t, resolved: n } = await yt(e);
1278
- e.mkdir !== !1 && await v.mkdir(u.dirname(n), { recursive: !0 });
1279
- let r = n, i = !1;
1268
+ let { rootWithSep: t, resolved: n } = await ht(e);
1269
+ e.mkdir !== !1 && await v.mkdir(r.dirname(n), { recursive: !0 });
1270
+ let i = n, a = !1;
1280
1271
  try {
1281
1272
  let e = await v.realpath(n);
1282
1273
  if (!R(t, e)) throw new I("outside-root", "file is outside workspace root");
1283
- r = e, i = !0;
1274
+ i = e, a = !0;
1284
1275
  } catch (e) {
1285
1276
  if (e instanceof I || !L(e)) throw e;
1286
1277
  }
1287
- let a = e.mode === "append";
1288
- if (a && !i) throw new I("not-found", "cannot append to non-existent file");
1289
- return a ? await Tt({
1290
- ioPath: r,
1278
+ let o = e.mode === "append";
1279
+ if (o && !a) throw new I("not-found", "cannot append to non-existent file");
1280
+ return o ? await xt({
1281
+ ioPath: i,
1291
1282
  rootWithSep: t,
1292
1283
  data: e.data,
1293
1284
  encoding: e.encoding,
1294
1285
  maxBytes: e.maxBytes
1295
- }) : await Et({
1296
- ioPath: r,
1286
+ }) : await St({
1287
+ ioPath: i,
1297
1288
  rootWithSep: t,
1298
1289
  rootDir: e.rootDir,
1299
1290
  data: e.data,
1300
1291
  encoding: e.encoding,
1301
- existingFile: i,
1292
+ existingFile: a,
1302
1293
  fileMode: 384
1303
1294
  });
1304
1295
  }
1305
- async function Tt(e) {
1296
+ async function xt(e) {
1306
1297
  let t;
1307
1298
  try {
1308
- t = await v.open(e.ioPath, gt);
1299
+ t = await v.open(e.ioPath, ft);
1309
1300
  } catch (e) {
1310
- throw L(e) ? new I("not-found", "file not found") : ut(e) ? new I("symlink", "symlink open blocked", { cause: e }) : e;
1301
+ throw L(e) ? new I("not-found", "file not found") : ot(e) ? new I("symlink", "symlink open blocked", { cause: e }) : e;
1311
1302
  }
1312
1303
  try {
1313
1304
  let n = await t.stat();
@@ -1328,11 +1319,11 @@ async function Tt(e) {
1328
1319
  await t.close().catch(() => {});
1329
1320
  }
1330
1321
  }
1331
- async function Et(e) {
1322
+ async function St(e) {
1332
1323
  let t = null, n = e.ioPath;
1333
1324
  try {
1334
- t = St(n);
1335
- let r = await Ct({
1325
+ t = vt(n);
1326
+ let r = await yt({
1336
1327
  tempPath: t,
1337
1328
  data: e.data,
1338
1329
  encoding: e.encoding,
@@ -1340,7 +1331,7 @@ async function Et(e) {
1340
1331
  });
1341
1332
  await v.rename(t, n), t = null;
1342
1333
  try {
1343
- await wt({
1334
+ await bt({
1344
1335
  rootDir: e.rootDir,
1345
1336
  targetPath: n,
1346
1337
  expectedStat: r
@@ -1362,30 +1353,30 @@ async function Et(e) {
1362
1353
  function V(e) {
1363
1354
  return e?.trim() || void 0;
1364
1355
  }
1365
- function Dt(e = import.meta.url) {
1366
- let t = u.dirname(h(e));
1367
- for (; t !== u.dirname(t);) {
1368
- if (l(u.join(t, "package.json"))) return t;
1369
- t = u.dirname(t);
1356
+ function Ct(e = import.meta.url) {
1357
+ let t = r.dirname(f(e));
1358
+ for (; t !== r.dirname(t);) {
1359
+ if (n(r.join(t, "package.json"))) return t;
1360
+ t = r.dirname(t);
1370
1361
  }
1371
1362
  return t;
1372
1363
  }
1373
- function Ot(e = process.env, t = se.homedir) {
1374
- let n = kt(e, t);
1375
- return n ? u.resolve(n) : void 0;
1364
+ function wt(e = process.env, t = y.homedir) {
1365
+ let n = Tt(e, t);
1366
+ return n ? r.resolve(n) : void 0;
1376
1367
  }
1377
- function kt(e, t) {
1368
+ function Tt(e, t) {
1378
1369
  let n = V(e.OPENCLAW_HOME);
1379
1370
  if (n) {
1380
1371
  if (n === "~" || n.startsWith("~/") || n.startsWith("~\\")) {
1381
- let r = V(e.HOME) ?? V(e.USERPROFILE) ?? At(t);
1372
+ let r = V(e.HOME) ?? V(e.USERPROFILE) ?? Et(t);
1382
1373
  return r ? n.replace(/^~(?=$|[\\/])/, r) : void 0;
1383
1374
  }
1384
1375
  return n;
1385
1376
  }
1386
- return V(e.HOME) || V(e.USERPROFILE) || At(t);
1377
+ return V(e.HOME) || V(e.USERPROFILE) || Et(t);
1387
1378
  }
1388
- function At(e) {
1379
+ function Et(e) {
1389
1380
  try {
1390
1381
  return V(e());
1391
1382
  } catch {
@@ -1394,56 +1385,71 @@ function At(e) {
1394
1385
  }
1395
1386
  //#endregion
1396
1387
  //#region src/modules/configs/identity-persist.ts
1397
- var jt = /* @__PURE__ */ function(e) {
1388
+ var Dt = /* @__PURE__ */ function(e) {
1398
1389
  return e[e.LEGACY = 1] = "LEGACY", e[e.NEW = 2] = "NEW", e;
1399
- }({}), Mt = ".openclaw", Nt = "yoyo", Pt = "identity.json";
1400
- function Ft() {
1401
- return u.join(Mt, Nt, Pt);
1390
+ }({}), Ot = ".openclaw", kt = "yoyo", At = "identity.json";
1391
+ function jt() {
1392
+ return r.join(Ot, kt, At);
1402
1393
  }
1403
- async function It(e) {
1404
- let t = Ft();
1394
+ async function Mt(e) {
1395
+ let t = jt();
1405
1396
  try {
1406
- let n = (await xt({
1397
+ let n = (await _t({
1407
1398
  rootDir: e,
1408
1399
  relativePath: t,
1409
1400
  maxBytes: 10 * 1024
1410
1401
  })).buffer.toString("utf8"), r = JSON.parse(n);
1411
- return typeof r != "object" || !r ? zt() : {
1412
- ...zt(),
1402
+ return typeof r != "object" || !r ? Ft() : {
1403
+ ...Ft(),
1413
1404
  ...r
1414
1405
  };
1415
1406
  } catch (e) {
1416
- return D().warn(`[yoyo-identity] failed to read identity: ${e.message}`), null;
1407
+ return O().warn(`[yoyo-identity] failed to read identity: ${e.message}`), null;
1417
1408
  }
1418
1409
  }
1419
- async function Lt() {
1420
- let e = Ot();
1421
- return e ? await It(e) || null : (D().warn("[yoyo-identity] failed to find home dir"), null);
1410
+ async function Nt() {
1411
+ let e = wt();
1412
+ return e ? await Mt(e) || null : (O().warn("[yoyo-identity] failed to find home dir"), null);
1422
1413
  }
1423
- async function Rt(e) {
1424
- let t = Ot();
1425
- if (!t) return D().warn("[yoyo-identity] failed to find home dir"), null;
1426
- let n = await It(t), r = {
1414
+ async function Pt(e) {
1415
+ let t = wt();
1416
+ if (!t) return O().warn("[yoyo-identity] failed to find home dir"), null;
1417
+ let n = await Mt(t), r = {
1427
1418
  ...n,
1428
- version: n?.version || jt.NEW
1419
+ version: n?.version || Dt.NEW
1429
1420
  };
1430
- return e.legacyDeviceId && (r.legacyDeviceId = e.legacyDeviceId), e.deviceId && (r.deviceId = e.deviceId, r.publicKeyPem = e.publicKeyPem, r.privateKeyPem = e.privateKeyPem, r.createdAtMs = e.createdAtMs), e.version && (r.version = e.version), await B({
1421
+ return e.legacyDeviceId && (r.legacyDeviceId = e.legacyDeviceId), e.deviceId && (r.deviceId = e.deviceId, r.publicKeyPem = e.publicKeyPem, r.privateKeyPem = e.privateKeyPem, r.createdAtMs = e.createdAtMs), e.version && (r.version = e.version), "gatewayAuthMd5" in e && (r.gatewayAuthMd5 = e.gatewayAuthMd5), await B({
1431
1422
  rootDir: t,
1432
- relativePath: Ft(),
1423
+ relativePath: jt(),
1433
1424
  data: JSON.stringify(r, null, 2),
1434
1425
  encoding: "utf8",
1435
1426
  mkdir: !0
1436
1427
  }), r;
1437
1428
  }
1438
- function zt() {
1439
- return { version: jt.NEW };
1429
+ function Ft() {
1430
+ return { version: Dt.NEW };
1440
1431
  }
1441
1432
  //#endregion
1442
- //#region src/modules/device/registry.ts
1443
- async function Bt(e, t) {
1444
- if (!e || !t) throw Error("设备信息或用户信息缺失");
1445
- let n = j().getGatewayAuthConfig(), r = await N().registerDevice(e, t, n);
1446
- if (!Be(r)) throw Error(`注册失败:${r.data?.cnMessage}`);
1433
+ //#region src/utils/hash.ts
1434
+ function It(e) {
1435
+ return h.createHash("md5").update(e).digest("hex");
1436
+ }
1437
+ function Lt(e) {
1438
+ return e ? `${e.slice(0, 8)}...` : "none";
1439
+ }
1440
+ //#endregion
1441
+ //#region src/modules/device/gateway-auth.ts
1442
+ function Rt(e) {
1443
+ return typeof e == "string" ? e : e == null ? "" : JSON.stringify(e);
1444
+ }
1445
+ function zt(e) {
1446
+ return It(JSON.stringify({
1447
+ token: Rt(e?.token),
1448
+ password: Rt(e?.password)
1449
+ }));
1450
+ }
1451
+ function Bt(e, t) {
1452
+ return (e ?? "") === t;
1447
1453
  }
1448
1454
  //#endregion
1449
1455
  //#region src/modules/device/identity.ts
@@ -1452,7 +1458,7 @@ function Vt(e) {
1452
1458
  return e.toString("base64").replaceAll("+", "-").replaceAll("/", "_").replace(/=+$/g, "");
1453
1459
  }
1454
1460
  function Ht(e) {
1455
- let t = _.createPublicKey(e).export({
1461
+ let t = h.createPublicKey(e).export({
1456
1462
  type: "spki",
1457
1463
  format: "der"
1458
1464
  });
@@ -1460,10 +1466,10 @@ function Ht(e) {
1460
1466
  }
1461
1467
  function Ut(e) {
1462
1468
  let t = Ht(e);
1463
- return _.createHash("sha256").update(t).digest("hex");
1469
+ return h.createHash("sha256").update(t).digest("hex");
1464
1470
  }
1465
1471
  async function Wt() {
1466
- let { publicKey: e, privateKey: t } = _.generateKeyPairSync("ed25519"), n = e.export({
1472
+ let { publicKey: e, privateKey: t } = h.generateKeyPairSync("ed25519"), n = e.export({
1467
1473
  type: "spki",
1468
1474
  format: "pem"
1469
1475
  }).toString(), r = t.export({
@@ -1478,10 +1484,10 @@ async function Wt() {
1478
1484
  };
1479
1485
  }
1480
1486
  async function Gt() {
1481
- let e = await Lt();
1487
+ let e = await Nt();
1482
1488
  if (e && e.deviceId && e.publicKeyPem && e.privateKeyPem && e.createdAtMs) {
1483
1489
  let t = e.deviceId, n = Ut(e.publicKeyPem);
1484
- return n && n !== e.deviceId && (await Rt({
1490
+ return n && n !== e.deviceId && (await Pt({
1485
1491
  ...e,
1486
1492
  deviceId: n
1487
1493
  }), t = n), {
@@ -1493,31 +1499,49 @@ async function Gt() {
1493
1499
  };
1494
1500
  }
1495
1501
  let t = await Wt();
1496
- return await Rt(t), t;
1502
+ return await Pt(t), t;
1497
1503
  }
1498
- function Kt(e, t) {
1499
- let n = _.createPrivateKey(e);
1500
- return Vt(_.sign(null, Buffer.from(t, "utf8"), n));
1504
+ async function Kt() {
1505
+ return (await Nt())?.gatewayAuthMd5;
1501
1506
  }
1502
- function qt(e) {
1507
+ function qt(e, t) {
1508
+ let n = h.createPrivateKey(e);
1509
+ return Vt(h.sign(null, Buffer.from(t, "utf8"), n));
1510
+ }
1511
+ function Jt(e) {
1503
1512
  return Vt(Ht(e));
1504
1513
  }
1505
1514
  //#endregion
1515
+ //#region src/modules/device/registry.ts
1516
+ async function Yt(e, t) {
1517
+ if (!e || !t) throw Error("设备信息或用户信息缺失");
1518
+ let n = j().getGatewayAuthConfig(), r = await N().registerDevice(e, t, n);
1519
+ if (!Ie(r)) throw Error(`注册失败:${r.data?.cnMessage}`);
1520
+ }
1521
+ async function Xt(e, t) {
1522
+ let n = zt(j().getGatewayAuthConfig()), r = await Kt(), i = O();
1523
+ if (i.info(`[yoyoclaw-registry] checking gateway auth md5: current=${Lt(n)}, persisted=${Lt(r)}`), Bt(r, n)) {
1524
+ i.info("[yoyoclaw-registry] gateway auth unchanged, skipping device registration");
1525
+ return;
1526
+ }
1527
+ i.info("[yoyoclaw-registry] gateway auth changed, registering device"), await Yt(e, t), await Pt({ gatewayAuthMd5: n }), i.info("[yoyoclaw-registry] gateway auth md5 persisted after device registration");
1528
+ }
1529
+ //#endregion
1506
1530
  //#region src/modules/device/providers/linux.ts
1507
- function Jt(t) {
1531
+ function Zt(e) {
1508
1532
  try {
1509
- return e.existsSync(t) ? e.readFileSync(t, "utf-8").trim() : "";
1533
+ return b.existsSync(e) ? b.readFileSync(e, "utf-8").trim() : "";
1510
1534
  } catch {
1511
1535
  return "";
1512
1536
  }
1513
1537
  }
1514
- var Yt = class {
1538
+ var Qt = class {
1515
1539
  async ensureInitialized() {}
1516
1540
  getLinuxDeviceModel() {
1517
- return Jt("/sys/class/dmi/id/product_name") || Jt("/sys/class/dmi/id/board_name") || `${y.cpus()[0]?.model || "Linux PC"} (${y.arch()})`;
1541
+ return Zt("/sys/class/dmi/id/product_name") || Zt("/sys/class/dmi/id/board_name") || `${S.cpus()[0]?.model || "Linux PC"} (${S.arch()})`;
1518
1542
  }
1519
1543
  getLinuxDeviceName() {
1520
- return `${y.hostname()} (${this.getLinuxDeviceModel()})`;
1544
+ return `${S.hostname()} (${this.getLinuxDeviceModel()})`;
1521
1545
  }
1522
1546
  getDeviceName() {
1523
1547
  return this.getLinuxDeviceName();
@@ -1531,13 +1555,13 @@ var Yt = class {
1531
1555
  getDeviceType() {
1532
1556
  return "pc";
1533
1557
  }
1534
- }, Xt = class {
1558
+ }, $t = class {
1535
1559
  async ensureInitialized() {}
1536
1560
  getMacOSDeviceModel() {
1537
- return `${y.cpus()[0]?.model || "Mac"} (${y.machine?.() || y.arch()})`;
1561
+ return `${S.cpus()[0]?.model || "Mac"} (${S.machine?.() || S.arch()})`;
1538
1562
  }
1539
1563
  getMacOSDeviceName() {
1540
- return `${y.hostname()} (${this.getMacOSDeviceModel()})`;
1564
+ return `${S.hostname()} (${this.getMacOSDeviceModel()})`;
1541
1565
  }
1542
1566
  getDeviceName() {
1543
1567
  return this.getMacOSDeviceName();
@@ -1551,7 +1575,7 @@ var Yt = class {
1551
1575
  getDeviceType() {
1552
1576
  return "pc";
1553
1577
  }
1554
- }, Zt = le(ce), Qt = class {
1578
+ }, en = te(ee), tn = class {
1555
1579
  cache = {
1556
1580
  brand: "",
1557
1581
  model: "",
@@ -1566,7 +1590,7 @@ var Yt = class {
1566
1590
  }
1567
1591
  async execAndroidCmd(e, t = 5e3) {
1568
1592
  try {
1569
- let { stdout: n } = await Zt("/system/bin/sh", ["-c", e], {
1593
+ let { stdout: n } = await en("/system/bin/sh", ["-c", e], {
1570
1594
  timeout: t,
1571
1595
  encoding: "utf-8"
1572
1596
  });
@@ -1588,13 +1612,13 @@ var Yt = class {
1588
1612
  getAndroidDeviceModel() {
1589
1613
  if (this.cache.model) return this.cache.model;
1590
1614
  try {
1591
- let t = "/system/build.prop";
1592
- if (e.existsSync(t)) {
1593
- let n = e.readFileSync(t, "utf8").match(/ro\.product\.model=(.*)/);
1594
- if (n && n[1]) return n[1].trim();
1615
+ let e = "/system/build.prop";
1616
+ if (b.existsSync(e)) {
1617
+ let t = b.readFileSync(e, "utf8").match(/ro\.product\.model=(.*)/);
1618
+ if (t && t[1]) return t[1].trim();
1595
1619
  }
1596
1620
  } catch {}
1597
- return `Android(${y.arch()})`;
1621
+ return `Android(${S.arch()})`;
1598
1622
  }
1599
1623
  getAndroidDeviceName() {
1600
1624
  return this.getAndroidDeviceModel();
@@ -1617,7 +1641,7 @@ var Yt = class {
1617
1641
  function U(e, t, n) {
1618
1642
  return new Promise((r) => {
1619
1643
  try {
1620
- new b({
1644
+ new C({
1621
1645
  hive: e,
1622
1646
  key: t
1623
1647
  }).get(n, (e, t) => {
@@ -1628,10 +1652,10 @@ function U(e, t, n) {
1628
1652
  }
1629
1653
  });
1630
1654
  }
1631
- function $t(e, t) {
1655
+ function nn(e, t) {
1632
1656
  return new Promise((n) => {
1633
1657
  try {
1634
- new b({
1658
+ new C({
1635
1659
  hive: e,
1636
1660
  key: t
1637
1661
  }).values((e) => {
@@ -1642,7 +1666,7 @@ function $t(e, t) {
1642
1666
  }
1643
1667
  });
1644
1668
  }
1645
- var en = class {
1669
+ var rn = class {
1646
1670
  cache = { deviceBrand: "" };
1647
1671
  initPromise;
1648
1672
  constructor() {
@@ -1654,26 +1678,26 @@ var en = class {
1654
1678
  async _initializeCache() {
1655
1679
  try {
1656
1680
  let [e, t, n, r] = await Promise.all([
1657
- U(b.HKLM, "\\HARDWARE\\DESCRIPTION\\System", "SystemManufacturer"),
1658
- U(b.HKLM, "\\HARDWARE\\DESCRIPTION\\System", "SystemBiosVendor"),
1659
- U(b.HKLM, "\\HARDWARE\\DESCRIPTION\\System\\BIOS", "Vendor"),
1660
- U(b.HKLM, "\\HARDWARE\\DESCRIPTION\\System\\BIOS", "SystemManufacturer")
1681
+ U(C.HKLM, "\\HARDWARE\\DESCRIPTION\\System", "SystemManufacturer"),
1682
+ U(C.HKLM, "\\HARDWARE\\DESCRIPTION\\System", "SystemBiosVendor"),
1683
+ U(C.HKLM, "\\HARDWARE\\DESCRIPTION\\System\\BIOS", "Vendor"),
1684
+ U(C.HKLM, "\\HARDWARE\\DESCRIPTION\\System\\BIOS", "SystemManufacturer")
1661
1685
  ]);
1662
1686
  [
1663
1687
  e,
1664
1688
  t,
1665
1689
  n,
1666
1690
  r
1667
- ].find((e) => e && e.toLowerCase().includes("honor")) || await $t(b.HKLM, "\\SOFTWARE\\HONOR\\PCManager") ? this.cache.deviceBrand = "HONOR" : this.cache.deviceBrand = "";
1691
+ ].find((e) => e && e.toLowerCase().includes("honor")) || await nn(C.HKLM, "\\SOFTWARE\\HONOR\\PCManager") ? this.cache.deviceBrand = "HONOR" : this.cache.deviceBrand = "";
1668
1692
  } catch {
1669
1693
  this.cache.deviceBrand = "";
1670
1694
  }
1671
1695
  }
1672
1696
  getWindowsDeviceModel() {
1673
- return `Windows ${y.release()}`;
1697
+ return `Windows ${S.release()}`;
1674
1698
  }
1675
1699
  getWindowsDeviceName() {
1676
- return `${y.hostname()} (${this.getWindowsDeviceModel()})`;
1700
+ return `${S.hostname()} (${this.getWindowsDeviceModel()})`;
1677
1701
  }
1678
1702
  getDeviceName() {
1679
1703
  return this.getWindowsDeviceName();
@@ -1690,33 +1714,33 @@ var en = class {
1690
1714
  };
1691
1715
  //#endregion
1692
1716
  //#region src/modules/device/providers/index.ts
1693
- function tn() {
1694
- let e = process.platform;
1695
- if (e === "win32") return "windows";
1696
- if (e === "linux") {
1717
+ function an() {
1718
+ let t = process.platform;
1719
+ if (t === "win32") return "windows";
1720
+ if (t === "linux") {
1697
1721
  try {
1698
- if (s.existsSync("/system/bin/getprop")) return "pad";
1722
+ if (e.existsSync("/system/bin/getprop")) return "pad";
1699
1723
  } catch {}
1700
1724
  return "linux";
1701
1725
  }
1702
- return e === "darwin" ? "macos" : "linux";
1726
+ return t === "darwin" ? "macos" : "linux";
1703
1727
  }
1704
- function nn() {
1705
- switch (tn()) {
1706
- case "pad": return new Qt();
1707
- case "windows": return new en();
1708
- case "linux": return new Yt();
1709
- case "macos": return new Xt();
1710
- default: return new Yt();
1728
+ function on() {
1729
+ switch (an()) {
1730
+ case "pad": return new tn();
1731
+ case "windows": return new rn();
1732
+ case "linux": return new Qt();
1733
+ case "macos": return new $t();
1734
+ default: return new Qt();
1711
1735
  }
1712
1736
  }
1713
1737
  //#endregion
1714
1738
  //#region src/modules/device/device-info.ts
1715
1739
  async function W() {
1716
- let e = nn(), t = j();
1740
+ let e = on(), t = j();
1717
1741
  await e.ensureInitialized();
1718
- let n = await Gt(), r = n.legacyDeviceId ?? n.deviceId, i = ve(), a = t.getDeviceConfig();
1719
- D().debug?.(`[yoyoclaw-device] env: ${JSON.stringify(i)}, config: ${JSON.stringify(a)}`);
1742
+ let n = await Gt(), r = n.legacyDeviceId ?? n.deviceId, i = pe(), a = t.getDeviceConfig();
1743
+ O().debug?.(`[yoyoclaw-device] env: ${JSON.stringify(i)}, config: ${JSON.stringify(a)}`);
1720
1744
  let o = i.brand || a?.brand || e.getDeviceBrand() || "unknown", s = i.deviceType || a?.type || e.getDeviceType(), c = (i.manufacture || a?.manufacture || o).slice(0, 128), l = (a?.name || e.getDeviceName()).slice(0, 128), u = (a?.model || e.getDeviceModel()).slice(0, 128), d = {
1721
1745
  deviceId: r,
1722
1746
  deviceName: l,
@@ -1726,7 +1750,7 @@ async function W() {
1726
1750
  manufacture: c,
1727
1751
  port: t.getGatewayPort()
1728
1752
  }, f = i.brand || i.deviceType || i.manufacture ? "env" : "config";
1729
- D().info(`[yoyoclaw-device] device info: ${JSON.stringify(d)} (source: ${f})`);
1753
+ O().info(`[yoyoclaw-device] device info: ${JSON.stringify(d)} (source: ${f})`);
1730
1754
  let p = !!(i.brand && i.brand !== a?.brand || i.manufacture && i.manufacture !== a?.manufacture || i.deviceType && i.deviceType !== a?.type);
1731
1755
  if (!a || p) {
1732
1756
  let e = {
@@ -1737,27 +1761,27 @@ async function W() {
1737
1761
  model: u
1738
1762
  };
1739
1763
  t.updateDeviceConfig(e).catch((e) => {
1740
- D().warn(`[yoyoclaw-device] failed to persist device config: ${String(e)}`);
1764
+ O().warn(`[yoyoclaw-device] failed to persist device config: ${String(e)}`);
1741
1765
  });
1742
1766
  }
1743
1767
  return d;
1744
1768
  }
1745
1769
  //#endregion
1746
1770
  //#region src/modules/device/helpers.ts
1747
- function rn(e) {
1771
+ function sn(e) {
1748
1772
  return typeof e == "string" && e.trim() || "";
1749
1773
  }
1750
- function an(e) {
1774
+ function cn(e) {
1751
1775
  return e.replace(/[A-Z]/g, (e) => String.fromCharCode(e.charCodeAt(0) + 32));
1752
1776
  }
1753
- function on(e) {
1754
- let t = rn(e);
1755
- return t ? an(t) : "";
1777
+ function ln(e) {
1778
+ let t = sn(e);
1779
+ return t ? cn(t) : "";
1756
1780
  }
1757
1781
  //#endregion
1758
1782
  //#region src/modules/device/auth.ts
1759
- function sn(e) {
1760
- let t = e.scopes.join(","), n = e.token ?? "", r = on(e.platform), i = on(e.deviceFamily);
1783
+ function un(e) {
1784
+ let t = e.scopes.join(","), n = e.token ?? "", r = ln(e.platform), i = ln(e.deviceFamily);
1761
1785
  return [
1762
1786
  "v3",
1763
1787
  e.deviceId,
@@ -1774,10 +1798,10 @@ function sn(e) {
1774
1798
  }
1775
1799
  //#endregion
1776
1800
  //#region src/modules/device/credential-builder.ts
1777
- function cn(e) {
1801
+ function dn(e) {
1778
1802
  let { deviceIdentity: t, clientName: n = "", clientMode: r = "cli", role: i = "operator", scopes: a = ["operator.admin"], platform: o = process.platform, deviceFamily: s, authToken: c = null, nonce: l, signedAtMs: u = Date.now() } = e;
1779
1803
  if (!t) return;
1780
- let d = sn({
1804
+ let d = un({
1781
1805
  deviceId: t.deviceId,
1782
1806
  clientId: n,
1783
1807
  clientMode: r,
@@ -1788,10 +1812,10 @@ function cn(e) {
1788
1812
  nonce: l,
1789
1813
  platform: o,
1790
1814
  deviceFamily: s
1791
- }), f = Kt(t.privateKeyPem, d);
1815
+ }), f = qt(t.privateKeyPem, d);
1792
1816
  return {
1793
1817
  id: t.deviceId,
1794
- publicKey: qt(t.publicKeyPem),
1818
+ publicKey: Jt(t.publicKeyPem),
1795
1819
  signature: f,
1796
1820
  signedAt: u,
1797
1821
  nonce: l
@@ -1799,7 +1823,7 @@ function cn(e) {
1799
1823
  }
1800
1824
  //#endregion
1801
1825
  //#region src/honor-auth/token-manager.ts
1802
- async function ln(e, t = !0) {
1826
+ async function fn(e, t = !0) {
1803
1827
  try {
1804
1828
  let n = j(), r = e.jwtToken;
1805
1829
  if (!r && e.userId) {
@@ -1807,7 +1831,7 @@ async function ln(e, t = !0) {
1807
1831
  r = (await N().exchangeToken(t, { userId: e.userId })).jwtToken;
1808
1832
  }
1809
1833
  if (!r) throw Error("no token available");
1810
- if (!t) return D().info("💾 token got, but not to save"), { token: r };
1834
+ if (!t) return O().info("💾 token got, but not to save"), { token: r };
1811
1835
  let i = Math.floor(Date.now() / 1e3) + 720 * 60 * 60;
1812
1836
  return await n.updateUserConfig({
1813
1837
  token: r,
@@ -1815,10 +1839,10 @@ async function ln(e, t = !0) {
1815
1839
  expired: i
1816
1840
  }), { token: r };
1817
1841
  } catch (e) {
1818
- throw E(e, "保存Token失败");
1842
+ throw D(e, "保存Token失败");
1819
1843
  }
1820
1844
  }
1821
- async function un(e) {
1845
+ async function pn(e) {
1822
1846
  let t = await W(), n = await N().exchangeToken(t, { userId: e });
1823
1847
  if (n.jwtToken) {
1824
1848
  let e = Math.floor(Date.now() / 1e3) + 720 * 60 * 60;
@@ -1831,37 +1855,37 @@ async function un(e) {
1831
1855
  }
1832
1856
  return await j().clearUserConfig(), null;
1833
1857
  }
1834
- async function dn() {
1835
- let e = D();
1858
+ async function mn() {
1859
+ let e = O();
1836
1860
  try {
1837
- let t = j(), n = t.getUserConfig(), r = ye();
1838
- if (e.debug?.(`[yoyoclaw-auth] env userId: ${r ? "present" : "absent"}, config userId: ${n?.userId ? "present" : "absent"}, config token: ${n?.token ? "present" : "absent"}`), n?.userId) return await un(r || n.userId);
1861
+ let t = j(), n = t.getUserConfig(), r = me();
1862
+ if (e.debug?.(`[yoyoclaw-auth] env userId: ${r ? "present" : "absent"}, config userId: ${n?.userId ? "present" : "absent"}, config token: ${n?.token ? "present" : "absent"}`), n?.userId) return await pn(r || n.userId);
1839
1863
  if (n?.token) {
1840
1864
  if (!n.expired || n.expired >= Math.floor(Date.now() / 1e3)) return { token: n.token };
1841
1865
  e.debug?.("[yoyoclaw-auth] cached token expired");
1842
1866
  }
1843
- return r ? (e.debug?.("[yoyoclaw-auth] token expired, using env userId to exchange token"), await un(r)) : (n?.token && (e.debug?.("[yoyoclaw-auth] clearing expired token"), await t.clearUserConfig()), null);
1867
+ return r ? (e.debug?.("[yoyoclaw-auth] token expired, using env userId to exchange token"), await pn(r)) : (n?.token && (e.debug?.("[yoyoclaw-auth] clearing expired token"), await t.clearUserConfig()), null);
1844
1868
  } catch (e) {
1845
- throw E(e, "加载Token失败");
1869
+ throw D(e, "加载Token失败");
1846
1870
  }
1847
1871
  }
1848
- async function fn() {
1872
+ async function hn() {
1849
1873
  try {
1850
- await j().clearUserConfig(), D().info("[yoyoclaw-auth] token cleared");
1874
+ await j().clearUserConfig(), O().info("[yoyoclaw-auth] token cleared");
1851
1875
  } catch (e) {
1852
- throw E(e, "清除Token失败");
1876
+ throw D(e, "清除Token失败");
1853
1877
  }
1854
1878
  }
1855
1879
  //#endregion
1856
1880
  //#region src/honor-auth/browser.ts
1857
- async function pn(e, t) {
1858
- let n = it(t);
1859
- D().debug?.("Starting Honor login flow...");
1860
- let r = ot(n), i = r.generatePKCEParams(), a = r.buildAuthUrl(i), o = null, s = tt({
1881
+ async function gn(e, t) {
1882
+ let n = et(t);
1883
+ O().debug?.("Starting Honor login flow...");
1884
+ let r = nt(n), a = r.generatePKCEParams(), o = r.buildAuthUrl(a), s = null, c = Ze({
1861
1885
  port: n.localPort,
1862
1886
  timeout: 6e5,
1863
1887
  onCodeReceived: (e) => {
1864
- o = e;
1888
+ s = e;
1865
1889
  },
1866
1890
  onError: (e) => {
1867
1891
  console.error("callback server error:", e);
@@ -1869,47 +1893,47 @@ async function pn(e, t) {
1869
1893
  });
1870
1894
  console.log("🌐 open browser...");
1871
1895
  try {
1872
- await d(a);
1896
+ await i(o);
1873
1897
  } catch (e) {
1874
- throw E(e, "failed to open browser, check your permissions");
1898
+ throw D(e, "failed to open browser, check your permissions");
1875
1899
  }
1876
1900
  try {
1877
- await s;
1901
+ await c;
1878
1902
  } catch (e) {
1879
- throw E(e, "authorization timeout");
1903
+ throw D(e, "authorization timeout");
1880
1904
  }
1881
- if (!o) throw Error("no auth code");
1905
+ if (!s) throw Error("no auth code");
1882
1906
  try {
1883
1907
  let t = await N().exchangeToken(e, {
1884
- code: o,
1908
+ code: s,
1885
1909
  authConfig: n
1886
1910
  });
1887
1911
  if (!t?.jwtToken) throw Error("failed to get jwt token");
1888
- return await ln({ jwtToken: t.jwtToken }, n.saveToFile !== !1), { token: t.jwtToken };
1912
+ return await fn({ jwtToken: t.jwtToken }, n.saveToFile !== !1), { token: t.jwtToken };
1889
1913
  } catch (e) {
1890
- throw E(e, "get token failed");
1914
+ throw D(e, "get token failed");
1891
1915
  }
1892
1916
  }
1893
1917
  //#endregion
1894
1918
  //#region src/honor-auth/cloud.ts
1895
- async function mn() {
1919
+ async function _n() {
1896
1920
  let e = j().getUserConfig();
1897
1921
  if (!e?.token) throw Error("⚠️ Not logged in");
1898
1922
  let t = await W(), n = N(), r = { token: e.token }, i = await n.logoutDevice(t, r);
1899
- if (!Be(i)) throw Error(i.data?.cnMessage || "Unknown error");
1900
- await fn();
1923
+ if (!Ie(i)) throw Error(i.data?.cnMessage || "Unknown error");
1924
+ await hn();
1901
1925
  }
1902
1926
  //#endregion
1903
1927
  //#region src/modules/login/impl.ts
1904
- async function hn(e = {}) {
1905
- let { userId: t } = e, n = D();
1928
+ async function vn(e = {}) {
1929
+ let { userId: t } = e, n = O();
1906
1930
  try {
1907
1931
  n.debug?.("Starting login process...");
1908
1932
  let e = await W(), r;
1909
- t ? (r = await ln({
1933
+ t ? (r = await fn({
1910
1934
  userId: t,
1911
1935
  deviceInfo: e
1912
- }), n.debug?.("Using provided user info"), n.debug?.(`User: ${t}`), n.debug?.(`Device ID: ${e?.deviceId}`)) : (n.debug?.("Starting OAuth2 authentication..."), r = await pn(e), n.debug?.("OAuth2 authentication successful"), n.debug?.(`Device ID: ${e?.deviceId}`)), console.log("📡 Registering device to Claw Cloud..."), await Bt(e, r), console.log("✅ Device registered successfully"), console.log("🔗 Channel connection in progress, use 'openclaw honor status' to check device status");
1936
+ }), n.debug?.("Using provided user info"), n.debug?.(`User: ${t}`), n.debug?.(`Device ID: ${e?.deviceId}`)) : (n.debug?.("Starting OAuth2 authentication..."), r = await gn(e), n.debug?.("OAuth2 authentication successful"), n.debug?.(`Device ID: ${e?.deviceId}`)), console.log("📡 Registering device to Claw Cloud..."), await Yt(e, r), console.log("✅ Device registered successfully"), console.log("🔗 Channel connection in progress, use 'openclaw honor status' to check device status");
1913
1937
  } catch (e) {
1914
1938
  let t = e instanceof Error ? e.message : String(e);
1915
1939
  console.error("❌ Login process failed:", t);
@@ -1917,11 +1941,11 @@ async function hn(e = {}) {
1917
1941
  }
1918
1942
  //#endregion
1919
1943
  //#region src/commands/login/impl.ts
1920
- function gn(e, t) {
1944
+ function yn(e, t) {
1921
1945
  let n = t.command("login").description("login to yoyoclaw and register devices");
1922
1946
  return n = n.option("-u, --uid <userId>", "user ID for direct login").option("--token <token>", "token for direct login").action(async (t) => {
1923
1947
  let { uid: n, token: r } = t;
1924
- e.logger.debug?.("honor login CLI command called"), await hn({
1948
+ e.logger.debug?.("honor login CLI command called"), await vn({
1925
1949
  userId: n,
1926
1950
  token: r
1927
1951
  });
@@ -1929,11 +1953,11 @@ function gn(e, t) {
1929
1953
  }
1930
1954
  //#endregion
1931
1955
  //#region src/commands/logout/impl.ts
1932
- function _n(e, t) {
1956
+ function bn(e, t) {
1933
1957
  return t.command("logout").description("Logout and clear user configuration").action(async () => {
1934
1958
  e.logger.info("logout CLI command called");
1935
1959
  try {
1936
- await mn(), console.log("✅ Logout successful, gateway will automatically restart to handle new configuration");
1960
+ await _n(), console.log("✅ Logout successful, gateway will automatically restart to handle new configuration");
1937
1961
  } catch (e) {
1938
1962
  let t = e instanceof Error ? e.message : String(e);
1939
1963
  console.error("❌ Logout failed:", t);
@@ -1944,26 +1968,26 @@ function _n(e, t) {
1944
1968
  //#region src/services/connection/status-tracker/events.ts
1945
1969
  var G = /* @__PURE__ */ function(e) {
1946
1970
  return e.CLOUD_SOCKET_CONNECTING = "cloud_socket_connecting", e.CLOUD_SOCKET_CONNECTED = "cloud_socket_connected", e.CLOUD_SOCKET_DISCONNECTED = "cloud_socket_disconnected", e.CLOUD_SOCKET_ERROR = "cloud_socket_error", e.CLOUD_SOCKET_RETRY = "cloud_socket_retry", e.GATEWAY_CLIENT_CONNECTED = "gateway_client_connected", e.GATEWAY_CLIENT_DISCONNECTED = "gateway_client_disconnected", e.ADMIN_CLIENT_RECONNECT_FAILED = "admin_client_reconnect_failed", e.DEVICE_PAIRING = "device_pairing", e.DEVICE_UNPAIRING = "device_unpairing", e.CONNECTION_STATUS_CHANGED = "connection_status_changed", e;
1947
- }({}), vn = class {
1971
+ }({}), xn = class {
1948
1972
  statusFilePath;
1949
1973
  statusDir;
1950
1974
  constructor() {
1951
- let e = Dt();
1952
- this.statusDir = r.join(e, ".yoyo-cache"), this.statusFilePath = r.join(this.statusDir, "yoyo-status.json");
1975
+ let e = Ct();
1976
+ this.statusDir = ne.join(e, ".yoyo-cache"), this.statusFilePath = ne.join(this.statusDir, "yoyo-status.json");
1953
1977
  }
1954
1978
  async save(e) {
1955
1979
  try {
1956
- await t.mkdir(this.statusDir, { recursive: !0 });
1957
- let n = JSON.stringify(e, null, 2);
1958
- await t.writeFile(this.statusFilePath, n, "utf-8");
1980
+ await x.mkdir(this.statusDir, { recursive: !0 });
1981
+ let t = JSON.stringify(e, null, 2);
1982
+ await x.writeFile(this.statusFilePath, t, "utf-8");
1959
1983
  } catch (e) {
1960
1984
  throw console.error(`[StatusStorage] Failed to save status: ${e instanceof Error ? e.message : String(e)}`), e;
1961
1985
  }
1962
1986
  }
1963
1987
  async load() {
1964
1988
  try {
1965
- await t.access(this.statusFilePath);
1966
- let e = await t.readFile(this.statusFilePath, "utf-8");
1989
+ await x.access(this.statusFilePath);
1990
+ let e = await x.readFile(this.statusFilePath, "utf-8");
1967
1991
  return JSON.parse(e);
1968
1992
  } catch (e) {
1969
1993
  return e.code === "ENOENT" || console.error(`[StatusStorage] Failed to load status: ${e instanceof Error ? e.message : String(e)}`), null;
@@ -1971,7 +1995,7 @@ var G = /* @__PURE__ */ function(e) {
1971
1995
  }
1972
1996
  async clear() {
1973
1997
  try {
1974
- await t.unlink(this.statusFilePath);
1998
+ await x.unlink(this.statusFilePath);
1975
1999
  } catch (e) {
1976
2000
  if (e.code !== "ENOENT") throw console.error(`[StatusStorage] Failed to clear status: ${e instanceof Error ? e.message : String(e)}`), e;
1977
2001
  }
@@ -1981,7 +2005,7 @@ var G = /* @__PURE__ */ function(e) {
1981
2005
  }
1982
2006
  async exists() {
1983
2007
  try {
1984
- return await t.access(this.statusFilePath), !0;
2008
+ return await x.access(this.statusFilePath), !0;
1985
2009
  } catch {
1986
2010
  return !1;
1987
2011
  }
@@ -1989,7 +2013,7 @@ var G = /* @__PURE__ */ function(e) {
1989
2013
  };
1990
2014
  //#endregion
1991
2015
  //#region src/services/connection/status-tracker/types.ts
1992
- function yn() {
2016
+ function Sn() {
1993
2017
  return {
1994
2018
  status: "idle",
1995
2019
  updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
@@ -2024,13 +2048,13 @@ function yn() {
2024
2048
  }
2025
2049
  //#endregion
2026
2050
  //#region src/services/connection/status-tracker/tracker.ts
2027
- var bn = class {
2051
+ var Cn = class {
2028
2052
  currentStatus;
2029
2053
  storage;
2030
2054
  autoSave;
2031
2055
  saveTimer;
2032
2056
  constructor(e = !0) {
2033
- this.currentStatus = yn(), this.storage = new vn(), this.autoSave = e, this.saveTimer = null;
2057
+ this.currentStatus = Sn(), this.storage = new xn(), this.autoSave = e, this.saveTimer = null;
2034
2058
  }
2035
2059
  async handleEvent(e) {
2036
2060
  let { type: t, timestamp: n, data: r } = e;
@@ -2081,7 +2105,7 @@ var bn = class {
2081
2105
  let e = await this.storage.load();
2082
2106
  if (e) {
2083
2107
  let t = e.cloudSocket, n = e.history;
2084
- this.currentStatus = yn(), this.currentStatus.cloudSocket = t, this.currentStatus.history = n, this.currentStatus.cloudSocket.connected = !1, this.currentStatus.cloudSocket.readyState = 3, await this.saveStatus();
2108
+ this.currentStatus = Sn(), this.currentStatus.cloudSocket = t, this.currentStatus.history = n, this.currentStatus.cloudSocket.connected = !1, this.currentStatus.cloudSocket.readyState = 3, await this.saveStatus();
2085
2109
  }
2086
2110
  return this.getStatus();
2087
2111
  }
@@ -2089,7 +2113,7 @@ var bn = class {
2089
2113
  await this.storage.save(this.currentStatus);
2090
2114
  }
2091
2115
  async clearStatus() {
2092
- this.currentStatus = yn(), await this.storage.clear();
2116
+ this.currentStatus = Sn(), await this.storage.clear();
2093
2117
  }
2094
2118
  handleCloudSocketConnecting(e, t) {
2095
2119
  this.currentStatus.cloudSocket.url = e.url || "", this.currentStatus.cloudSocket.connected = !1;
@@ -2162,21 +2186,21 @@ var bn = class {
2162
2186
  };
2163
2187
  //#endregion
2164
2188
  //#region src/commands/status/index.ts
2165
- function xn(e, t) {
2189
+ function wn(e, t) {
2166
2190
  return t.command("status").description("Show YOYOClaw connection status").action(async () => {
2167
- if (e.logger.debug?.("YOYOClaw status CLI command called"), !await dn()) {
2191
+ if (e.logger.debug?.("YOYOClaw status CLI command called"), !await mn()) {
2168
2192
  console.log("❌ You need to login first. Please run: openclaw honor login");
2169
2193
  return;
2170
2194
  }
2171
- let t = await new vn().load(), n = null;
2195
+ let t = await new xn().load(), n = null;
2172
2196
  try {
2173
2197
  n = await W();
2174
2198
  } catch {}
2175
2199
  let r = j().getEnvInfo();
2176
- Sn(t, n, r);
2200
+ Tn(t, n, r);
2177
2201
  });
2178
2202
  }
2179
- function Sn(e, t, n) {
2203
+ function Tn(e, t, n) {
2180
2204
  if (!e) {
2181
2205
  console.log("\n❌ No status data available");
2182
2206
  return;
@@ -2186,7 +2210,7 @@ function Sn(e, t, n) {
2186
2210
  if (console.log(` Status: ${i} ${r.connected ? "Connected" : "Disconnected"}`), r.connectedAt && console.log(` Connected at: ${K(r.connectedAt)}`), r.lastDisconnectedAt && console.log(` Last disconnected: ${K(r.lastDisconnectedAt)}`), console.log(` Retry count: ${r.retryCount}`), console.log(` Last error: ${r.lastError || "None"}`), console.log("\n🌐 Gateway Connections:"), console.log(` Total connections: ${e.gateway.totalConnections}`), console.log(` Active connections: ${e.gateway.activeConnections}`), e.gateway.connections.length > 0) {
2187
2211
  console.log(" ┌────────────────────────────┬────────────────────────────┬────────────┐"), console.log(" │ Session ID │ Hardware Device ID │ Connected │"), console.log(" ├────────────────────────────┼────────────────────────────┼────────────┤");
2188
2212
  for (let t of e.gateway.connections) {
2189
- let e = wn(t.sessionId, 26), n = wn(t.hardwareDeviceId, 26), r = Cn(t.connectedAt);
2213
+ let e = Dn(t.sessionId, 26), n = Dn(t.hardwareDeviceId, 26), r = En(t.connectedAt);
2190
2214
  console.log(` │ ${e.padEnd(28)}│ ${n.padEnd(28)}│ ${r.padEnd(12)}│`);
2191
2215
  }
2192
2216
  console.log(" └────────────────────────────┴────────────────────────────┴────────────┘");
@@ -2194,7 +2218,7 @@ function Sn(e, t, n) {
2194
2218
  if (console.log("\n📱 Physical Devices:"), console.log(` Unique devices: ${e.devices.uniqueHardwareDevices}`), e.devices.devices.length > 0) {
2195
2219
  console.log(" ┌────────────────────────────┬─────────┬────────────┐"), console.log(" │ Hardware Device ID │ Sessions │ Last Active│"), console.log(" ├────────────────────────────┼─────────┼────────────┤");
2196
2220
  for (let t of e.devices.devices) {
2197
- let e = wn(t.hardwareDeviceId, 26), n = String(t.sessions).padEnd(9), r = Cn(t.lastActiveAt);
2221
+ let e = Dn(t.hardwareDeviceId, 26), n = String(t.sessions).padEnd(9), r = En(t.lastActiveAt);
2198
2222
  console.log(` │ ${e.padEnd(28)}│ ${n}│ ${r.padEnd(12)}│`);
2199
2223
  }
2200
2224
  console.log(" └────────────────────────────┴─────────┴────────────┘");
@@ -2205,60 +2229,60 @@ function K(e) {
2205
2229
  let t = new Date(e);
2206
2230
  return `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, "0")}-${String(t.getDate()).padStart(2, "0")} ${String(t.getHours()).padStart(2, "0")}:${String(t.getMinutes()).padStart(2, "0")}:${String(t.getSeconds()).padStart(2, "0")}`;
2207
2231
  }
2208
- function Cn(e) {
2232
+ function En(e) {
2209
2233
  let t = new Date(e);
2210
2234
  return `${String(t.getHours()).padStart(2, "0")}:${String(t.getMinutes()).padStart(2, "0")}:${String(t.getSeconds()).padStart(2, "0")}`;
2211
2235
  }
2212
- function wn(e, t) {
2236
+ function Dn(e, t) {
2213
2237
  return e.length <= t ? e : e.substring(0, t - 3) + "...";
2214
2238
  }
2215
2239
  //#endregion
2216
2240
  //#region src/commands/index.ts
2217
- function Tn(e) {
2241
+ function On(e) {
2218
2242
  e.registerCli((t) => {
2219
2243
  let n = t.program.command("honor").description("Commands for honor yoyoclaw");
2220
- gn(e, n), xn(e, n), _n(e, n), de() && Re(e, n);
2244
+ yn(e, n), wn(e, n), bn(e, n), oe() && Pe(e, n);
2221
2245
  }, { commands: ["honor"] });
2222
2246
  }
2223
2247
  //#endregion
2224
2248
  //#region src/modules/prompt/index.ts
2225
- var En = " ## 手机控制规则\n\n - 涉及手机控制的任务时,必须强制调用 yoyo_phone_control 技能完成任务。\n - 手机是可直接操控的设备,你的职责是执行操作,而不是向用户解释如何操作。 \n - 多步骤任务需**按顺序多次调用**,不得合并。 \n", Dn = x.object({
2226
- token: x.string().optional(),
2227
- expired: x.number().optional(),
2228
- userId: x.string().optional(),
2229
- userName: x.string().optional()
2230
- }), On = x.object({
2231
- type: x.string().optional(),
2232
- manufacture: x.string().optional(),
2233
- brand: x.string().optional(),
2234
- name: x.string().optional(),
2235
- model: x.string().optional()
2236
- }), kn = x.object({
2237
- user: Dn.optional(),
2238
- device: On.optional(),
2239
- envInfo: x.object({
2240
- env: x.enum([
2249
+ var kn = " ## 手机控制规则\n\n - 涉及手机控制的任务时,必须强制调用 yoyo_phone_control 技能完成任务。\n - 手机是可直接操控的设备,你的职责是执行操作,而不是向用户解释如何操作。 \n - 多步骤任务需**按顺序多次调用**,不得合并。 \n", An = w.object({
2250
+ token: w.string().optional(),
2251
+ expired: w.number().optional(),
2252
+ userId: w.string().optional(),
2253
+ userName: w.string().optional()
2254
+ }), jn = w.object({
2255
+ type: w.string().optional(),
2256
+ manufacture: w.string().optional(),
2257
+ brand: w.string().optional(),
2258
+ name: w.string().optional(),
2259
+ model: w.string().optional()
2260
+ }), Mn = w.object({
2261
+ user: An.optional(),
2262
+ device: jn.optional(),
2263
+ envInfo: w.object({
2264
+ env: w.enum([
2241
2265
  "dev",
2242
2266
  "test",
2243
2267
  "production"
2244
2268
  ]),
2245
- source: x.enum(["env", "manual"])
2269
+ source: w.enum(["env", "manual"])
2246
2270
  }).optional(),
2247
- env: x.enum([
2271
+ env: w.enum([
2248
2272
  "dev",
2249
2273
  "test",
2250
2274
  "production"
2251
2275
  ]).optional(),
2252
- gray: x.string().optional()
2276
+ gray: w.string().optional()
2253
2277
  });
2254
2278
  //#endregion
2255
2279
  //#region src/utils/ws.ts
2256
- function An(e, t = "utf8") {
2257
- return typeof e == "string" ? e : C.isBuffer(e) ? e.toString(t) : Array.isArray(e) ? C.concat(e).toString(t) : e instanceof ArrayBuffer ? C.from(e).toString(t) : C.from(String(e)).toString(t);
2280
+ function Nn(e, t = "utf8") {
2281
+ return typeof e == "string" ? e : ie.isBuffer(e) ? e.toString(t) : Array.isArray(e) ? ie.concat(e).toString(t) : e instanceof ArrayBuffer ? ie.from(e).toString(t) : ie.from(String(e)).toString(t);
2258
2282
  }
2259
2283
  //#endregion
2260
2284
  //#region src/gateway-client/client.ts
2261
- var jn = class {
2285
+ var Pn = class {
2262
2286
  ws = null;
2263
2287
  opts;
2264
2288
  closed = !1;
@@ -2269,18 +2293,18 @@ var jn = class {
2269
2293
  return `ws://127.0.0.1:${j().getGatewayPort()}`;
2270
2294
  }
2271
2295
  isConnected() {
2272
- return this.ws !== null && this.ws.readyState === ue.OPEN;
2296
+ return this.ws !== null && this.ws.readyState === re.OPEN;
2273
2297
  }
2274
2298
  connect() {
2275
2299
  if (this.closed) return;
2276
2300
  let e = this.getUrl();
2277
- this.ws = new ue(e, { maxPayload: 25 * 1024 * 1024 }), this.ws.on("open", () => {
2301
+ this.ws = new re(e, { maxPayload: 25 * 1024 * 1024 }), this.ws.on("open", () => {
2278
2302
  this.opts.onOpen?.(), this.onOpen();
2279
2303
  }), this.ws.on("message", async (e) => {
2280
- let t = An(e);
2304
+ let t = Nn(e);
2281
2305
  await this.opts.onMessage?.(t), await this.onMessage(t);
2282
2306
  }), this.ws.on("close", (e, t) => {
2283
- let n = An(t);
2307
+ let n = Nn(t);
2284
2308
  this.ws = null, this.onClose(e, n), this.opts.onClose?.(`code: ${e}, reason: ${n ?? ""}`);
2285
2309
  }), this.ws.on("error", (e) => {
2286
2310
  this.onError(e), this.opts.onClose?.(`socket error: ${e.message}`);
@@ -2290,14 +2314,14 @@ var jn = class {
2290
2314
  this.closed = !0, this.ws?.close(), this.ws = null;
2291
2315
  }
2292
2316
  send(e) {
2293
- if (!this.ws || this.ws.readyState !== ue.OPEN) throw Error("gateway not connected");
2317
+ if (!this.ws || this.ws.readyState !== re.OPEN) throw Error("gateway not connected");
2294
2318
  this.ws.send(e);
2295
2319
  }
2296
2320
  onOpen() {}
2297
2321
  onMessage(e) {}
2298
2322
  onClose(e, t) {}
2299
2323
  onError(e) {}
2300
- }, Mn = {
2324
+ }, Fn = {
2301
2325
  WEBCHAT_UI: "webchat-ui",
2302
2326
  CONTROL_UI: "openclaw-control-ui",
2303
2327
  WEBCHAT: "webchat",
@@ -2309,7 +2333,7 @@ var jn = class {
2309
2333
  NODE_HOST: "node-host",
2310
2334
  FINGERPRINT: "fingerprint",
2311
2335
  PROBE: "openclaw-probe"
2312
- }, Nn = {
2336
+ }, In = {
2313
2337
  WEBCHAT: "webchat",
2314
2338
  CLI: "cli",
2315
2339
  UI: "ui",
@@ -2325,13 +2349,13 @@ var jn = class {
2325
2349
  constructor(e, t, n, r) {
2326
2350
  super(t), this.name = "WebSocketClientError", this.code = e, this.details = n, this.retryable = r;
2327
2351
  }
2328
- }, Pn = {
2352
+ }, Ln = {
2329
2353
  role: "operator",
2330
2354
  scopes: [],
2331
- clientId: Mn.CLI,
2355
+ clientId: Fn.CLI,
2332
2356
  displayName: "Protocol Client",
2333
- clientMode: Nn.CLI
2334
- }, Fn = 3e4, In = "1.0.0", Ln = "server", Rn = 2, zn = 1e3, Bn = class extends jn {
2357
+ clientMode: In.CLI
2358
+ }, Rn = 3e4, zn = "1.0.0", Bn = "server", Vn = 2, Hn = 1e3, Un = class extends Pn {
2335
2359
  protocolOpts;
2336
2360
  config;
2337
2361
  pendingRequests = /* @__PURE__ */ new Map();
@@ -2347,7 +2371,7 @@ var jn = class {
2347
2371
  isReconnecting = !1;
2348
2372
  constructor(e = {}, t = {}) {
2349
2373
  super(e), this.protocolOpts = e, this.config = {
2350
- ...Pn,
2374
+ ...Ln,
2351
2375
  ...t
2352
2376
  }, this.debug = process.env.DEBUG_GATEWAY === "true";
2353
2377
  }
@@ -2373,7 +2397,7 @@ var jn = class {
2373
2397
  handleEvent(e) {
2374
2398
  if (e.event === "connect.challenge") {
2375
2399
  let t = e.payload;
2376
- t?.nonce ? (this.connectNonce = t.nonce, this.clearConnectNonceTimer(), this.sendConnect()) : D().error("[protocol-gateway] connect challenge missing nonce");
2400
+ t?.nonce ? (this.connectNonce = t.nonce, this.clearConnectNonceTimer(), this.sendConnect()) : O().error("[protocol-gateway] connect challenge missing nonce");
2377
2401
  }
2378
2402
  }
2379
2403
  clearConnectNonceTimer() {
@@ -2394,7 +2418,7 @@ var jn = class {
2394
2418
  }
2395
2419
  }
2396
2420
  async sendConnect() {
2397
- let e = this.config.clientMode ?? Nn.CLI, t = await Gt(), n = this.connectNonce ? cn({
2421
+ let e = this.config.clientMode ?? In.CLI, t = await Gt(), n = this.connectNonce ? dn({
2398
2422
  deviceIdentity: t,
2399
2423
  clientName: this.config.clientId,
2400
2424
  clientMode: e,
@@ -2403,21 +2427,24 @@ var jn = class {
2403
2427
  authToken: this.protocolOpts.token,
2404
2428
  nonce: this.connectNonce,
2405
2429
  platform: process.platform,
2406
- deviceFamily: Ln
2430
+ deviceFamily: Bn
2407
2431
  }) : void 0, r = {
2408
2432
  minProtocol: 3,
2409
2433
  maxProtocol: 3,
2410
2434
  client: {
2411
2435
  id: this.config.clientId,
2412
2436
  displayName: this.config.displayName,
2413
- version: In,
2437
+ version: zn,
2414
2438
  platform: process.platform,
2415
- deviceFamily: Ln,
2439
+ deviceFamily: Bn,
2416
2440
  mode: e
2417
2441
  },
2418
2442
  role: this.config.role,
2419
2443
  scopes: this.config.scopes,
2420
- auth: { token: this.protocolOpts.token },
2444
+ auth: {
2445
+ token: this.protocolOpts.token,
2446
+ password: this.protocolOpts.password
2447
+ },
2421
2448
  device: n
2422
2449
  };
2423
2450
  this.sendRequest("connect", r).then((e) => {
@@ -2427,7 +2454,7 @@ var jn = class {
2427
2454
  });
2428
2455
  }
2429
2456
  async sendRequest(e, t) {
2430
- let n = oe();
2457
+ let n = _();
2431
2458
  return this.logDebug("request", {
2432
2459
  id: n,
2433
2460
  method: e,
@@ -2455,7 +2482,7 @@ var jn = class {
2455
2482
  let t = this.pendingTimers.get(n);
2456
2483
  t && clearTimeout(t), this.pendingTimers.delete(n), i(new J(q.TIMEOUT, `Request timeout: ${e}`));
2457
2484
  }
2458
- }, Fn);
2485
+ }, Rn);
2459
2486
  this.pendingTimers.set(n, o);
2460
2487
  });
2461
2488
  }
@@ -2477,7 +2504,7 @@ var jn = class {
2477
2504
  this.pendingTimers.clear(), this.pendingRequests.clear();
2478
2505
  }
2479
2506
  logDebug(e, t) {
2480
- this.debug && D().info(`[yoyoclaw-protocolGatewayClient:${e}] ${JSON.stringify(t)}`);
2507
+ this.debug && O().info(`[yoyoclaw-protocolGatewayClient:${e}] ${JSON.stringify(t)}`);
2481
2508
  }
2482
2509
  connect() {
2483
2510
  this.closed || (this.isReconnecting = !1, super.connect());
@@ -2487,16 +2514,16 @@ var jn = class {
2487
2514
  }
2488
2515
  scheduleReconnect() {
2489
2516
  if (!(this.closed || this.isReconnecting)) {
2490
- if (this.reconnectAttempts >= Rn) {
2491
- D().error(`[protocol-gateway] max reconnect attempts (${Rn}) reached, giving up`), this.protocolOpts.onReconnectFailed?.();
2517
+ if (this.reconnectAttempts >= Vn) {
2518
+ O().error(`[protocol-gateway] max reconnect attempts (${Vn}) reached, giving up`), this.protocolOpts.onReconnectFailed?.();
2492
2519
  return;
2493
2520
  }
2494
- this.reconnectAttempts++, this.isReconnecting = !0, D().info(`[protocol-gateway] attempting to reconnect (attempt ${this.reconnectAttempts}/${Rn})`), this.reconnectTimer = setTimeout(() => {
2521
+ this.reconnectAttempts++, this.isReconnecting = !0, O().info(`[protocol-gateway] attempting to reconnect (attempt ${this.reconnectAttempts}/${Vn})`), this.reconnectTimer = setTimeout(() => {
2495
2522
  this.isReconnecting = !1, this.closed || super.connect();
2496
- }, zn);
2523
+ }, Hn);
2497
2524
  }
2498
2525
  }
2499
- }, Vn = {
2526
+ }, Wn = {
2500
2527
  role: "operator",
2501
2528
  scopes: [
2502
2529
  "operator.admin",
@@ -2506,12 +2533,12 @@ var jn = class {
2506
2533
  "operator.approvals",
2507
2534
  "operator.pairing"
2508
2535
  ],
2509
- clientId: Mn.CLI,
2536
+ clientId: Fn.CLI,
2510
2537
  displayName: "YOYO-Control",
2511
- clientMode: Nn.BACKEND
2512
- }, Hn = class extends Bn {
2538
+ clientMode: In.BACKEND
2539
+ }, Gn = class extends Un {
2513
2540
  constructor(e = {}) {
2514
- super(e, Vn);
2541
+ super(e, Wn);
2515
2542
  }
2516
2543
  async setAgentFile(e, t, n = "main") {
2517
2544
  return this.sendRequest("agents.files.set", {
@@ -2544,7 +2571,7 @@ var jn = class {
2544
2571
  async devicePairApprove(e) {
2545
2572
  return this.sendRequest("device.pair.approve", { requestId: e });
2546
2573
  }
2547
- }, Un = class {
2574
+ }, Kn = class {
2548
2575
  client = null;
2549
2576
  ready = !1;
2550
2577
  options;
@@ -2555,17 +2582,18 @@ var jn = class {
2555
2582
  }
2556
2583
  init() {
2557
2584
  if (this.client !== null) return;
2558
- let e = j().getGatewayAuthConfig()?.token || "";
2559
- this.client = new Hn({
2560
- token: e,
2585
+ let e = j().getGatewayAuthConfig(), t = typeof e?.token == "string" ? e.token : "", n = typeof e?.password == "string" ? e.password : "";
2586
+ this.client = new Gn({
2587
+ token: t,
2588
+ password: n,
2561
2589
  onAuthenticated: () => {
2562
- D().info("[yoyoclaw-channel] admin gateway client authenticated"), this.ready = !0, this.resolveAllPending(!0);
2590
+ O().info("[yoyoclaw-channel] admin gateway client authenticated"), this.ready = !0, this.resolveAllPending(!0);
2563
2591
  },
2564
2592
  onClose: (e) => {
2565
- D().info(`[yoyoclaw-channel] admin gateway client closed: ${e}`), this.ready = !1;
2593
+ O().info(`[yoyoclaw-channel] admin gateway client closed: ${e}`), this.ready = !1;
2566
2594
  },
2567
2595
  onReconnectFailed: () => {
2568
- D().error("[yoyoclaw-channel] admin gateway client reconnect failed, notifying status tracker"), this.options.onStatusEvent?.({
2596
+ O().error("[yoyoclaw-channel] admin gateway client reconnect failed, notifying status tracker"), this.options.onStatusEvent?.({
2569
2597
  type: G.ADMIN_CLIENT_RECONNECT_FAILED,
2570
2598
  timestamp: Date.now(),
2571
2599
  data: {}
@@ -2577,7 +2605,7 @@ var jn = class {
2577
2605
  this.client?.connect();
2578
2606
  }
2579
2607
  destroy() {
2580
- this.client &&= (this.client.stop(), null), this.ready = !1, this.cancelAllPending(), D().info("[yoyoclaw-channel] admin gateway client closed");
2608
+ this.client &&= (this.client.stop(), null), this.ready = !1, this.cancelAllPending(), O().info("[yoyoclaw-channel] admin gateway client closed");
2581
2609
  }
2582
2610
  cancelAllPending() {
2583
2611
  for (let [e, t] of this.pendingReadyRequests) clearTimeout(t.timeout), t.resolve(!1);
@@ -2593,12 +2621,12 @@ var jn = class {
2593
2621
  return this.client !== null && this.ready;
2594
2622
  }
2595
2623
  ensureConnected() {
2596
- return this.client === null && (D().info("[yoyoclaw-channel] admin gateway client is null, initializing"), this.init()), this.ready || (D().info("[yoyoclaw-channel] admin gateway client not ready, connecting"), this.connect()), this.canOperate();
2624
+ return this.client === null && (O().info("[yoyoclaw-channel] admin gateway client is null, initializing"), this.init()), this.ready || (O().info("[yoyoclaw-channel] admin gateway client not ready, connecting"), this.connect()), this.canOperate();
2597
2625
  }
2598
2626
  waitForReady(e = 5e3) {
2599
2627
  return this.canOperate() ? Promise.resolve(!0) : new Promise((t) => {
2600
2628
  let n = `req_${++this.requestIdCounter}`, r = setTimeout(() => {
2601
- this.pendingReadyRequests.delete(n), this.pendingReadyRequests.size === 0 && D().warn("[yoyoclaw-channel] admin gateway client waitForReady timeout, all requests rejected"), t(!1);
2629
+ this.pendingReadyRequests.delete(n), this.pendingReadyRequests.size === 0 && O().warn("[yoyoclaw-channel] admin gateway client waitForReady timeout, all requests rejected"), t(!1);
2602
2630
  }, e);
2603
2631
  this.pendingReadyRequests.set(n, {
2604
2632
  resolve: t,
@@ -2610,11 +2638,11 @@ var jn = class {
2610
2638
  for (let [t, n] of this.pendingReadyRequests) clearTimeout(n.timeout), n.resolve(e);
2611
2639
  this.pendingReadyRequests.clear();
2612
2640
  }
2613
- }, Wn = "/aicloud/yoyo-claw-service/v1/yoyoclaw/fullduplex", Gn = 25 * 1024 * 1024;
2614
- function Kn(e, t) {
2615
- let n = Ve(), r = n.grayTag ? { "x-gray": n.grayTag } : void 0, i = M(), a = `wss://${n.clawCloud}${Wn}`, o = qn(e, t, i, r), s = We(a), c = {
2641
+ }, qn = "/aicloud/yoyo-claw-service/v1/yoyoclaw/fullduplex", Jn = 25 * 1024 * 1024;
2642
+ function Yn(e, t) {
2643
+ let n = Le(), r = n.grayTag ? { "x-gray": n.grayTag } : void 0, i = M(), a = `wss://${n.clawCloud}${qn}`, o = Xn(e, t, i, r), s = Be(a), c = {
2616
2644
  headers: o,
2617
- maxPayload: Gn
2645
+ maxPayload: Jn
2618
2646
  };
2619
2647
  return s && (c.agent = s), {
2620
2648
  url: a,
@@ -2622,7 +2650,7 @@ function Kn(e, t) {
2622
2650
  wsOptions: c
2623
2651
  };
2624
2652
  }
2625
- function qn(e, t, n, r) {
2653
+ function Xn(e, t, n, r) {
2626
2654
  let i = {
2627
2655
  "x-role": "yoyoclaw",
2628
2656
  "x-trace-id": n,
@@ -2633,7 +2661,7 @@ function qn(e, t, n, r) {
2633
2661
  }
2634
2662
  //#endregion
2635
2663
  //#region src/cloud-channel/client.ts
2636
- var Jn = 3e4, Yn = 4e3, Xn = 1e3, Zn = 2, Qn = 999, $n = class {
2664
+ var Zn = 3e4, Qn = 4e3, $n = 1e3, er = 2, tr = 999, nr = class {
2637
2665
  ws = null;
2638
2666
  options;
2639
2667
  retryCount = 0;
@@ -2646,18 +2674,18 @@ var Jn = 3e4, Yn = 4e3, Xn = 1e3, Zn = 2, Qn = 999, $n = class {
2646
2674
  this.options = e;
2647
2675
  }
2648
2676
  connect(e = !1) {
2649
- if (this.ws?.readyState === S.OPEN) return;
2677
+ if (this.ws?.readyState === T.OPEN) return;
2650
2678
  this.clearRetryTimer();
2651
- let { deviceInfo: t, userInfo: n } = this.options, { url: r, traceId: i, wsOptions: a } = Kn(t, n);
2679
+ let { deviceInfo: t, userInfo: n } = this.options, { url: r, traceId: i, wsOptions: a } = Yn(t, n);
2652
2680
  this.currentTraceId = i, this.options.onStatusEvent?.({
2653
2681
  type: G.CLOUD_SOCKET_CONNECTING,
2654
2682
  timestamp: Date.now(),
2655
2683
  data: { url: r }
2656
- }), this.ws = new S(r, a), this.ws.on("open", this.handleOpen.bind(this, r, e)), this.ws.on("message", this.onMessage), this.ws.on("pong", this.handlePong), this.ws.on("close", this.handleClose), this.ws.on("error", this.handleError);
2684
+ }), this.ws = new T(r, a), this.ws.on("open", this.handleOpen.bind(this, r, e)), this.ws.on("message", this.onMessage), this.ws.on("pong", this.handlePong), this.ws.on("close", this.handleClose), this.ws.on("error", this.handleError);
2657
2685
  }
2658
2686
  handleOpen = (e, t) => {
2659
2687
  let n = t ? "reconnected" : "connected";
2660
- D().info(`[claw-cloud-socket][${this.currentTraceId}] ${n} to ${e.slice(0, 15)}`), this.clearRetryTimer(), this.isManualClose = !1, this.retryCount = 0, this.isRetryPaused = !1, this.startPingTimer(), this.options.onStatusEvent?.({
2688
+ O().info(`[claw-cloud-socket][${this.currentTraceId}] ${n} to ${e.slice(0, 15)}`), this.clearRetryTimer(), this.isManualClose = !1, this.retryCount = 0, this.isRetryPaused = !1, this.startPingTimer(), this.options.onStatusEvent?.({
2661
2689
  type: G.CLOUD_SOCKET_CONNECTED,
2662
2690
  timestamp: Date.now(),
2663
2691
  data: {
@@ -2667,11 +2695,11 @@ var Jn = 3e4, Yn = 4e3, Xn = 1e3, Zn = 2, Qn = 999, $n = class {
2667
2695
  }), this.options.onOpen?.();
2668
2696
  };
2669
2697
  handlePong = () => {
2670
- D().debug?.("[claw-cloud-socket] received pong from server");
2698
+ O().debug?.("[claw-cloud-socket] received pong from server");
2671
2699
  };
2672
2700
  handleClose = (e, t) => {
2673
2701
  let n = t.toString();
2674
- D().info(`[claw-cloud-socket][${this.currentTraceId}] connection closed: ${e} - ${n}`), this.options.onStatusEvent?.({
2702
+ O().info(`[claw-cloud-socket][${this.currentTraceId}] connection closed: ${e} - ${n}`), this.options.onStatusEvent?.({
2675
2703
  type: G.CLOUD_SOCKET_DISCONNECTED,
2676
2704
  timestamp: Date.now(),
2677
2705
  data: {
@@ -2682,7 +2710,7 @@ var Jn = 3e4, Yn = 4e3, Xn = 1e3, Zn = 2, Qn = 999, $n = class {
2682
2710
  }), this.isManualClose ? (this.stopPingTimer(), this.options.onClose?.()) : this.scheduleReconnect();
2683
2711
  };
2684
2712
  handleError = (e) => {
2685
- D().error(`[claw-cloud-socket][${this.currentTraceId}] connect errorred: ${e.message}`), e.message.includes("401") && (D().warn(`[claw-cloud-socket][${this.currentTraceId}] unauthorized connection (401), pausing retry and notifying client`), this.pauseRetry(), this.options.onUnauthorized?.()), this.options.onStatusEvent?.({
2713
+ O().error(`[claw-cloud-socket][${this.currentTraceId}] connect errorred: ${e.message}`), e.message.includes("401") && (O().warn(`[claw-cloud-socket][${this.currentTraceId}] unauthorized connection (401), pausing retry and notifying client`), this.pauseRetry(), this.options.onUnauthorized?.()), this.options.onStatusEvent?.({
2686
2714
  type: G.CLOUD_SOCKET_ERROR,
2687
2715
  timestamp: Date.now(),
2688
2716
  data: {
@@ -2692,12 +2720,12 @@ var Jn = 3e4, Yn = 4e3, Xn = 1e3, Zn = 2, Qn = 999, $n = class {
2692
2720
  });
2693
2721
  };
2694
2722
  send(e) {
2695
- if (!this.ws || this.ws.readyState !== S.OPEN) return D().error("[claw-cloud-socket] cannot send message: connection not open"), !1;
2723
+ if (!this.ws || this.ws.readyState !== T.OPEN) return O().error("[claw-cloud-socket] cannot send message: connection not open"), !1;
2696
2724
  try {
2697
2725
  let t = JSON.stringify(e);
2698
2726
  return this.ws.send(t), !0;
2699
2727
  } catch (t) {
2700
- return D().error(`[claw-cloud-socket] failed to send message to cloud session ${e.targetDeviceId},
2728
+ return O().error(`[claw-cloud-socket] failed to send message to cloud session ${e.targetDeviceId},
2701
2729
  ${t instanceof Error ? t.message : String(t)}`), !1;
2702
2730
  }
2703
2731
  }
@@ -2709,34 +2737,34 @@ var Jn = 3e4, Yn = 4e3, Xn = 1e3, Zn = 2, Qn = 999, $n = class {
2709
2737
  }
2710
2738
  onMessage = async (e) => {
2711
2739
  try {
2712
- let t = An(e), n = JSON.parse(t);
2713
- if (D().debug?.(`[yoyoclaw-channel] received cloud message from session ${n.wsOutputEvent?.sourceDeviceId}, deviceId ${n.wsOutputEvent?.sourceDeviceInfo?.deviceId || "nil"}, ${t.slice(0, 1e3)}`), n.code === "YOYO_CLAW_100000") {
2740
+ let t = Nn(e), n = JSON.parse(t);
2741
+ if (O().debug?.(`[yoyoclaw-channel] received cloud message from session ${n.wsOutputEvent?.sourceDeviceId}, deviceId ${n.wsOutputEvent?.sourceDeviceInfo?.deviceId || "nil"}, ${t.slice(0, 3e3)}`), n.code === "YOYO_CLAW_100000") {
2714
2742
  if (n.wsOutputEvent) {
2715
2743
  n.sessionInfo && (n.wsOutputEvent.sessionInfo = n.sessionInfo), this.options.onMessage?.(n.wsOutputEvent);
2716
2744
  return;
2717
2745
  }
2718
2746
  } else if (n.code === "YOYO_CLAW_100002") {
2719
2747
  if (n.extData?.offlineSocketId) {
2720
- D().info(`[claw-cloud-socket] remote device offline, session: ${n.extData.offlineSocketId}`), this.options.onRemoteDeviceOffline?.(n.extData.offlineSocketId);
2748
+ O().info(`[claw-cloud-socket] remote device offline, session: ${n.extData.offlineSocketId}`), this.options.onRemoteDeviceOffline?.(n.extData.offlineSocketId);
2721
2749
  return;
2722
2750
  }
2723
2751
  } else if (n.code === "YOYO_CLAW_100001") {
2724
- this.pauseRetry(), D().info("[claw-cloud-socket] device not registered, closing connection"), this.options.onDeviceNotRegistered?.();
2752
+ this.pauseRetry(), O().info("[claw-cloud-socket] device not registered, closing connection"), this.options.onDeviceNotRegistered?.();
2725
2753
  return;
2726
2754
  }
2727
- D().warn(`[claw-cloud-socket] unexpected message: ${n.cnMessage}, code: ${n.code}`);
2755
+ O().warn(`[claw-cloud-socket] unexpected message: ${n.cnMessage}, code: ${n.code}`);
2728
2756
  } catch (e) {
2729
- D().error(`[claw-cloud-socket] failed to parse message: ${e instanceof Error ? e.message : String(e)}`);
2757
+ O().error(`[claw-cloud-socket] failed to parse message: ${e instanceof Error ? e.message : String(e)}`);
2730
2758
  }
2731
2759
  };
2732
2760
  scheduleReconnect() {
2733
2761
  if (this.isRetryPaused) {
2734
- D().info("[claw-cloud-socket] retry paused, skipping reconnect"), this.reset(), this.options.onClose?.();
2762
+ O().info("[claw-cloud-socket] retry paused, skipping reconnect"), this.reset(), this.options.onClose?.();
2735
2763
  return;
2736
2764
  }
2737
2765
  this.clearRetryTimer();
2738
2766
  let e = this.calculateRetryDelay();
2739
- this.retryCount = Math.min(this.retryCount + 1, Qn), D().info(`[claw-cloud-socket] scheduling reconnect attempt ${this.retryCount} in ${e}ms`), this.options.onStatusEvent?.({
2767
+ this.retryCount = Math.min(this.retryCount + 1, tr), O().info(`[claw-cloud-socket] scheduling reconnect attempt ${this.retryCount} in ${e}ms`), this.options.onStatusEvent?.({
2740
2768
  type: G.CLOUD_SOCKET_RETRY,
2741
2769
  timestamp: Date.now(),
2742
2770
  data: {
@@ -2751,16 +2779,16 @@ var Jn = 3e4, Yn = 4e3, Xn = 1e3, Zn = 2, Qn = 999, $n = class {
2751
2779
  this.retryTimer &&= (clearTimeout(this.retryTimer), null);
2752
2780
  }
2753
2781
  calculateRetryDelay() {
2754
- let e = Xn * Zn ** +Math.min(this.retryCount, 2);
2755
- return Math.min(e, Yn);
2782
+ let e = $n * er ** +Math.min(this.retryCount, 2);
2783
+ return Math.min(e, Qn);
2756
2784
  }
2757
2785
  startPingTimer() {
2758
2786
  this.pingTimer = setInterval(() => {
2759
- if (!this.ws || this.ws.readyState !== S.OPEN) {
2787
+ if (!this.ws || this.ws.readyState !== T.OPEN) {
2760
2788
  this.stopPingTimer();
2761
2789
  return;
2762
2790
  }
2763
- this.ws.ping(), D().debug?.("[claw-cloud-socket] sent ping to server");
2791
+ this.ws.ping(), O().debug?.("[claw-cloud-socket] sent ping to server");
2764
2792
  let { deviceInfo: e } = this.options, t = {
2765
2793
  msgType: "pingMessage",
2766
2794
  sourceRole: "yoyoclaw",
@@ -2769,115 +2797,115 @@ var Jn = 3e4, Yn = 4e3, Xn = 1e3, Zn = 2, Qn = 999, $n = class {
2769
2797
  port: e.port
2770
2798
  };
2771
2799
  try {
2772
- this.ws.send(JSON.stringify(t)), D().debug?.("[claw-cloud-socket] sent pingMessage to server");
2800
+ this.ws.send(JSON.stringify(t)), O().debug?.("[claw-cloud-socket] sent pingMessage to server");
2773
2801
  } catch {
2774
- D().error("[claw-cloud-socket] failed to send pingMessage");
2802
+ O().error("[claw-cloud-socket] failed to send pingMessage");
2775
2803
  }
2776
- }, Jn);
2804
+ }, Zn);
2777
2805
  }
2778
2806
  stopPingTimer() {
2779
2807
  this.pingTimer &&= (clearInterval(this.pingTimer), null);
2780
2808
  }
2781
2809
  pauseRetry() {
2782
- this.isRetryPaused || (this.isRetryPaused = !0, this.clearRetryTimer(), D().info("[claw-cloud-socket] retry paused"));
2810
+ this.isRetryPaused || (this.isRetryPaused = !0, this.clearRetryTimer(), O().info("[claw-cloud-socket] retry paused"));
2783
2811
  }
2784
2812
  resumeRetry() {
2785
- this.isRetryPaused && (this.isRetryPaused = !1, D().info("[claw-cloud-socket] retry resumed"), (!this.ws || this.ws.readyState !== S.OPEN) && (this.retryCount = 0, this.connect(!0)));
2813
+ this.isRetryPaused && (this.isRetryPaused = !1, O().info("[claw-cloud-socket] retry resumed"), (!this.ws || this.ws.readyState !== T.OPEN) && (this.retryCount = 0, this.connect(!0)));
2786
2814
  }
2787
- }, er = ".openclaw/yoyo/tools", tr = /[<>:"/\\|?*]/;
2788
- async function nr(e, t) {
2789
- let n = 0, r = 0;
2790
- for (let i of t) {
2791
- let t = rr(i.name);
2815
+ }, rr = ".openclaw/yoyo/tools", ir = /[<>:"/\\|?*]/;
2816
+ async function ar(e, t) {
2817
+ let n = 0, i = 0;
2818
+ for (let a of t) {
2819
+ let t = or(a.name);
2792
2820
  if (!t) {
2793
- r += 1;
2821
+ i += 1;
2794
2822
  continue;
2795
2823
  }
2796
2824
  await B({
2797
2825
  rootDir: e,
2798
- relativePath: u.join(er, t),
2799
- data: JSON.stringify(i, null, 2),
2826
+ relativePath: r.join(rr, t),
2827
+ data: JSON.stringify(a, null, 2),
2800
2828
  encoding: "utf8",
2801
2829
  mkdir: !0
2802
2830
  }), n += 1;
2803
2831
  }
2804
2832
  return {
2805
- archiveDir: u.join(e, ".openclaw", "yoyo", "tools"),
2833
+ archiveDir: r.join(e, ".openclaw", "yoyo", "tools"),
2806
2834
  writtenCount: n,
2807
- skippedCount: r
2835
+ skippedCount: i
2808
2836
  };
2809
2837
  }
2810
- function rr(e) {
2838
+ function or(e) {
2811
2839
  let t = e.trim();
2812
- if (!(!t || tr.test(t) || ir(t))) return `${t}.json`;
2840
+ if (!(!t || ir.test(t) || sr(t))) return `${t}.json`;
2813
2841
  }
2814
- function ir(e) {
2842
+ function sr(e) {
2815
2843
  for (let t of e) if (t.codePointAt(0) < 32) return !0;
2816
2844
  return !1;
2817
2845
  }
2818
2846
  //#endregion
2819
2847
  //#region src/modules/device-toolset/copy-fallback.ts
2820
- var ar = ".yoyo-device-toolset-copy-fallback";
2821
- async function or(e, t) {
2822
- await cr(t), await v.rm(t, {
2848
+ var cr = ".yoyo-device-toolset-copy-fallback";
2849
+ async function lr(e, t) {
2850
+ await dr(t), await v.rm(t, {
2823
2851
  recursive: !0,
2824
2852
  force: !0
2825
- }), await v.mkdir(t, { recursive: !0 }), await lr(e, t), await v.writeFile(u.join(t, ar), "Managed copy fallback for DeviceToolSet MCP tools.\n", "utf8");
2853
+ }), await v.mkdir(t, { recursive: !0 }), await fr(e, t), await v.writeFile(r.join(t, cr), "Managed copy fallback for DeviceToolSet MCP tools.\n", "utf8");
2826
2854
  }
2827
- async function sr(e) {
2855
+ async function ur(e) {
2828
2856
  try {
2829
- return (await v.stat(u.join(e, ar))).isFile();
2857
+ return (await v.stat(r.join(e, cr))).isFile();
2830
2858
  } catch {
2831
2859
  return !1;
2832
2860
  }
2833
2861
  }
2834
- async function cr(e) {
2862
+ async function dr(e) {
2835
2863
  let t;
2836
2864
  try {
2837
2865
  t = await v.lstat(e);
2838
2866
  } catch (e) {
2839
- if (ur(e)) return;
2867
+ if (pr(e)) return;
2840
2868
  throw e;
2841
2869
  }
2842
2870
  if (!t.isSymbolicLink()) {
2843
2871
  if (!t.isDirectory()) throw Error(`Cannot replace unmanaged mcptools path: ${e}`);
2844
- if (!((await v.readdir(e)).length === 0 || await sr(e))) throw Error(`Cannot replace unmanaged mcptools directory: ${e}`);
2872
+ if (!((await v.readdir(e)).length === 0 || await ur(e))) throw Error(`Cannot replace unmanaged mcptools directory: ${e}`);
2845
2873
  }
2846
2874
  }
2847
- async function lr(e, t) {
2875
+ async function fr(e, t) {
2848
2876
  let n = await v.readdir(e, { withFileTypes: !0 });
2849
- for (let r of n) {
2850
- let n = u.join(e, r.name), i = u.join(t, r.name);
2851
- r.isDirectory() ? (await v.mkdir(i, { recursive: !0 }), await lr(n, i)) : r.isFile() && await v.copyFile(n, i);
2877
+ for (let i of n) {
2878
+ let n = r.join(e, i.name), a = r.join(t, i.name);
2879
+ i.isDirectory() ? (await v.mkdir(a, { recursive: !0 }), await fr(n, a)) : i.isFile() && await v.copyFile(n, a);
2852
2880
  }
2853
2881
  }
2854
- function ur(e) {
2882
+ function pr(e) {
2855
2883
  return !!(e && typeof e == "object" && "code" in e && e.code === "ENOENT");
2856
2884
  }
2857
2885
  //#endregion
2858
2886
  //#region src/modules/device-toolset/link.ts
2859
- async function dr(e, t, n = {}) {
2887
+ async function mr(e, t, n = {}) {
2860
2888
  await v.mkdir(e, { recursive: !0 });
2861
- let r = await v.realpath(e), i = await fr(t);
2862
- if (i.exists) {
2863
- if (i.isLink) {
2864
- if (await pr(t, r)) return { mode: "already-linked" };
2889
+ let i = await v.realpath(e), a = await hr(t);
2890
+ if (a.exists) {
2891
+ if (a.isLink) {
2892
+ if (await gr(t, i)) return { mode: "already-linked" };
2865
2893
  throw Error(`Cannot replace unmanaged mcptools link: ${t}`);
2866
2894
  }
2867
- if (!await mr(t, i.isDirectory)) throw Error(`Cannot replace unmanaged mcptools directory: ${t}`);
2895
+ if (!await _r(t, a.isDirectory)) throw Error(`Cannot replace unmanaged mcptools directory: ${t}`);
2868
2896
  await v.rm(t, {
2869
2897
  recursive: !0,
2870
2898
  force: !0
2871
2899
  });
2872
2900
  }
2873
- await v.mkdir(u.dirname(t), { recursive: !0 });
2901
+ await v.mkdir(r.dirname(t), { recursive: !0 });
2874
2902
  try {
2875
- return await (n.symlink ?? v.symlink)(r, t, process.platform === "win32" ? "junction" : "dir"), { mode: "linked" };
2903
+ return await (n.symlink ?? v.symlink)(i, t, process.platform === "win32" ? "junction" : "dir"), { mode: "linked" };
2876
2904
  } catch {
2877
- return await (n.copyFallback ?? or)(r, t), { mode: "copy-fallback" };
2905
+ return await (n.copyFallback ?? lr)(i, t), { mode: "copy-fallback" };
2878
2906
  }
2879
2907
  }
2880
- async function fr(e) {
2908
+ async function hr(e) {
2881
2909
  try {
2882
2910
  let t = await v.lstat(e);
2883
2911
  return {
@@ -2886,7 +2914,7 @@ async function fr(e) {
2886
2914
  isDirectory: t.isDirectory()
2887
2915
  };
2888
2916
  } catch (e) {
2889
- if (gr(e)) return {
2917
+ if (yr(e)) return {
2890
2918
  exists: !1,
2891
2919
  isLink: !1,
2892
2920
  isDirectory: !1
@@ -2894,66 +2922,66 @@ async function fr(e) {
2894
2922
  throw e;
2895
2923
  }
2896
2924
  }
2897
- async function pr(e, t) {
2925
+ async function gr(e, t) {
2898
2926
  try {
2899
- return hr(await v.realpath(e), t);
2927
+ return vr(await v.realpath(e), t);
2900
2928
  } catch {
2901
2929
  return !1;
2902
2930
  }
2903
2931
  }
2904
- async function mr(e, t) {
2905
- return t ? (await v.readdir(e)).length === 0 || await sr(e) : !1;
2932
+ async function _r(e, t) {
2933
+ return t ? (await v.readdir(e)).length === 0 || await ur(e) : !1;
2906
2934
  }
2907
- function hr(e, t) {
2935
+ function vr(e, t) {
2908
2936
  return process.platform === "win32" ? e.toLowerCase() === t.toLowerCase() : e === t;
2909
2937
  }
2910
- function gr(e) {
2938
+ function yr(e) {
2911
2939
  return !!(e && typeof e == "object" && "code" in e && e.code === "ENOENT");
2912
2940
  }
2913
2941
  //#endregion
2914
2942
  //#region src/modules/device-toolset/md5-index.ts
2915
- var _r = ".openclaw/yoyo/toolset-md5.json", vr = 1024 * 1024;
2916
- function yr() {
2943
+ var br = ".openclaw/yoyo/toolset-md5.json", xr = 1024 * 1024;
2944
+ function Sr() {
2917
2945
  return {
2918
2946
  version: 1,
2919
2947
  nodes: {}
2920
2948
  };
2921
2949
  }
2922
- function br(e) {
2923
- return JSON.stringify(Tr(e));
2950
+ function Cr(e) {
2951
+ return JSON.stringify(Or(e));
2924
2952
  }
2925
- function xr(e) {
2926
- return ae("md5").update(br(e)).digest("hex");
2953
+ function wr(e) {
2954
+ return g("md5").update(Cr(e)).digest("hex");
2927
2955
  }
2928
- async function Sr(e) {
2956
+ async function Tr(e) {
2929
2957
  try {
2930
- let t = await xt({
2958
+ let t = await _t({
2931
2959
  rootDir: e,
2932
- relativePath: _r,
2933
- maxBytes: vr
2960
+ relativePath: br,
2961
+ maxBytes: xr
2934
2962
  }), n = JSON.parse(t.buffer.toString("utf8"));
2935
2963
  return {
2936
2964
  version: 1,
2937
2965
  nodes: n && typeof n.nodes == "object" && n.nodes ? n.nodes : {}
2938
2966
  };
2939
2967
  } catch (e) {
2940
- if (e instanceof I && e.code === "not-found") return yr();
2968
+ if (e instanceof I && e.code === "not-found") return Sr();
2941
2969
  throw e;
2942
2970
  }
2943
2971
  }
2944
- async function Cr(e, t, n) {
2945
- let r = (await Sr(e)).nodes[t]?.md5;
2972
+ async function Er(e, t, n) {
2973
+ let r = (await Tr(e)).nodes[t]?.md5;
2946
2974
  return {
2947
2975
  changed: r !== n,
2948
2976
  md5: n,
2949
2977
  previousMd5: r
2950
2978
  };
2951
2979
  }
2952
- async function wr(e, t, n, r = Date.now()) {
2980
+ async function Dr(e, t, n, r = Date.now()) {
2953
2981
  let i = {
2954
2982
  version: 1,
2955
2983
  nodes: {
2956
- ...(await Sr(e)).nodes,
2984
+ ...(await Tr(e)).nodes,
2957
2985
  [t]: {
2958
2986
  md5: n,
2959
2987
  updatedAtMs: r
@@ -2962,19 +2990,19 @@ async function wr(e, t, n, r = Date.now()) {
2962
2990
  };
2963
2991
  return await B({
2964
2992
  rootDir: e,
2965
- relativePath: _r,
2993
+ relativePath: br,
2966
2994
  data: JSON.stringify(i, null, 2),
2967
2995
  encoding: "utf8",
2968
2996
  mkdir: !0
2969
2997
  }), i;
2970
2998
  }
2971
- function Tr(e) {
2972
- if (Array.isArray(e)) return e.map(Tr);
2999
+ function Or(e) {
3000
+ if (Array.isArray(e)) return e.map(Or);
2973
3001
  if (!e || typeof e != "object") return e;
2974
3002
  let t = {};
2975
3003
  for (let n of Object.keys(e).toSorted()) {
2976
3004
  let r = e[n];
2977
- r !== void 0 && (t[n] = Tr(r));
3005
+ r !== void 0 && (t[n] = Or(r));
2978
3006
  }
2979
3007
  return t;
2980
3008
  }
@@ -2983,17 +3011,17 @@ function Tr(e) {
2983
3011
  function Y(e) {
2984
3012
  return typeof e == "string" && e.trim() ? e : void 0;
2985
3013
  }
2986
- function Er(e) {
3014
+ function kr(e) {
2987
3015
  if (!e || typeof e != "object") throw Error("DeviceToolSet payload must be an object");
2988
3016
  let t = e;
2989
3017
  if (!Y(t.nodeId)) throw Error("DeviceToolSet payload missing nodeId");
2990
3018
  if (!Array.isArray(t.toolSet)) throw Error("DeviceToolSet payload toolSet must be an array");
2991
3019
  return e;
2992
3020
  }
2993
- function Dr(e) {
3021
+ function Ar(e) {
2994
3022
  let t = e.nodeId, n = [], r = 0;
2995
3023
  for (let t of e.toolSet) {
2996
- let e = Or(t);
3024
+ let e = jr(t);
2997
3025
  e ? n.push(e) : r += 1;
2998
3026
  }
2999
3027
  return {
@@ -3002,7 +3030,7 @@ function Dr(e) {
3002
3030
  skippedCount: r
3003
3031
  };
3004
3032
  }
3005
- function Or(e) {
3033
+ function jr(e) {
3006
3034
  let t = Y(e.tool?.id), n = Y(e.tool?.function?.name), r = Y(e.tool?.function?.description);
3007
3035
  if (!t || e.tool?.type !== "function" || !n || !r) return;
3008
3036
  let i = {
@@ -3017,48 +3045,48 @@ function Or(e) {
3017
3045
  }
3018
3046
  //#endregion
3019
3047
  //#region src/modules/device-toolset/persist.ts
3020
- var kr = ".openclaw/yoyo/device-toolsets.json", Ar = 10 * 1024 * 1024;
3021
- function jr() {
3048
+ var Mr = ".openclaw/yoyo/device-toolsets.json", Nr = 10 * 1024 * 1024;
3049
+ function Pr() {
3022
3050
  return {
3023
3051
  version: 1,
3024
3052
  tools: {}
3025
3053
  };
3026
3054
  }
3027
- async function Mr(e) {
3055
+ async function Fr(e) {
3028
3056
  try {
3029
- let t = await xt({
3057
+ let t = await _t({
3030
3058
  rootDir: e,
3031
- relativePath: kr,
3032
- maxBytes: Ar
3059
+ relativePath: Mr,
3060
+ maxBytes: Nr
3033
3061
  }), n = JSON.parse(t.buffer.toString("utf8"));
3034
3062
  return {
3035
3063
  version: 1,
3036
3064
  tools: n && typeof n.tools == "object" && n.tools ? n.tools : {}
3037
3065
  };
3038
3066
  } catch (e) {
3039
- if (e instanceof I && e.code === "not-found") return jr();
3067
+ if (e instanceof I && e.code === "not-found") return Pr();
3040
3068
  throw e;
3041
3069
  }
3042
3070
  }
3043
- async function Nr(e, t, n) {
3071
+ async function Ir(e, t, n) {
3044
3072
  let r = {
3045
3073
  version: 1,
3046
- tools: Pr((await Mr(e)).tools, t, n)
3074
+ tools: Lr((await Fr(e)).tools, t, n)
3047
3075
  };
3048
3076
  return await B({
3049
3077
  rootDir: e,
3050
- relativePath: kr,
3078
+ relativePath: Mr,
3051
3079
  data: JSON.stringify(r, null, 2),
3052
3080
  encoding: "utf8",
3053
3081
  mkdir: !0
3054
3082
  }), {
3055
3083
  changed: !0,
3056
- nodeCount: Ir(r.tools),
3084
+ nodeCount: zr(r.tools),
3057
3085
  toolCount: Object.keys(r.tools).length,
3058
3086
  cache: r
3059
3087
  };
3060
3088
  }
3061
- function Pr(e, t, n) {
3089
+ function Lr(e, t, n) {
3062
3090
  let r = { ...e };
3063
3091
  for (let e of n) {
3064
3092
  let n = r[e.id];
@@ -3066,98 +3094,98 @@ function Pr(e, t, n) {
3066
3094
  id: e.id,
3067
3095
  name: e.name,
3068
3096
  description: e.description,
3069
- supportedNodeIds: Fr(n?.supportedNodeIds ?? [], t)
3097
+ supportedNodeIds: Rr(n?.supportedNodeIds ?? [], t)
3070
3098
  };
3071
3099
  }
3072
3100
  return r;
3073
3101
  }
3074
- function Fr(e, t) {
3102
+ function Rr(e, t) {
3075
3103
  return [...new Set([...e, t])];
3076
3104
  }
3077
- function Ir(e) {
3105
+ function zr(e) {
3078
3106
  let t = /* @__PURE__ */ new Set();
3079
3107
  for (let n of Object.values(e)) for (let e of n.supportedNodeIds) t.add(e);
3080
3108
  return t.size;
3081
3109
  }
3082
3110
  //#endregion
3083
3111
  //#region src/modules/device-toolset/skill-inject.ts
3084
- var Lr = u.join("skills", "yoyo-control", "SKILL.md"), Rr = u.join("skills", "yoyo-control", "configs", "sub-skills.json"), zr = "{{full-mcp-tool-list}}", Br = "<!-- yoyo-mcp-tools:start -->", Vr = "<!-- yoyo-mcp-tools:end -->";
3085
- async function Hr(e, t) {
3086
- let n = u.join(e, Lr), r = await v.readFile(n, "utf8"), i = Wr(t, await Ur(e)), a = Kr(r, Gr(i));
3087
- return a !== r && await v.writeFile(n, a, "utf8"), {
3112
+ var Br = r.join("skills", "yoyo-control", "SKILL.md"), Vr = r.join("skills", "yoyo-control", "configs", "sub-skills.json"), Hr = "{{full-mcp-tool-list}}", Ur = "<!-- yoyo-mcp-tools:start -->", Wr = "<!-- yoyo-mcp-tools:end -->";
3113
+ async function Gr(e, t) {
3114
+ let n = r.join(e, Br), i = await v.readFile(n, "utf8"), a = qr(t, await Kr(e)), o = Yr(i, Jr(a));
3115
+ return o !== i && await v.writeFile(n, o, "utf8"), {
3088
3116
  skillPath: n,
3089
- rowCount: Object.keys(i).length
3117
+ rowCount: Object.keys(a).length
3090
3118
  };
3091
3119
  }
3092
- async function Ur(e) {
3093
- let t = u.join(e, Rr), n;
3120
+ async function Kr(e) {
3121
+ let t = r.join(e, Vr), n;
3094
3122
  try {
3095
3123
  n = await v.readFile(t, "utf8");
3096
3124
  } catch (e) {
3097
- if (Yr(e) && e.code === "ENOENT") return /* @__PURE__ */ new Set();
3125
+ if (Qr(e) && e.code === "ENOENT") return /* @__PURE__ */ new Set();
3098
3126
  throw e;
3099
3127
  }
3100
- let r = JSON.parse(n);
3101
- if (!Array.isArray(r) || r.some((e) => typeof e != "string")) throw Error("sub-skills config must be a JSON array of tool names");
3102
- return new Set(r.map((e) => e.trim()).filter(Boolean));
3128
+ let i = JSON.parse(n);
3129
+ if (!Array.isArray(i) || i.some((e) => typeof e != "string")) throw Error("sub-skills config must be a JSON array of tool names");
3130
+ return new Set(i.map((e) => e.trim()).filter(Boolean));
3103
3131
  }
3104
- function Wr(e, t) {
3132
+ function qr(e, t) {
3105
3133
  return t.size === 0 ? e : Object.fromEntries(Object.entries(e).filter(([e, n]) => !t.has(e) && !t.has(n.name)));
3106
3134
  }
3107
- function Gr(e) {
3135
+ function Jr(e) {
3108
3136
  return [
3109
- Br,
3110
- ...Object.values(e).toSorted((e, t) => e.name.localeCompare(t.name)).map((e) => `| ${qr(e.name)} | ${qr(e.description)} | ${qr(e.supportedNodeIds.join(", "))} |`),
3111
- Vr
3137
+ Ur,
3138
+ ...Object.values(e).toSorted((e, t) => e.name.localeCompare(t.name)).map((e) => `| ${Xr(e.name)} | ${Xr(e.description)} | ${Xr(e.supportedNodeIds.join(", "))} |`),
3139
+ Wr
3112
3140
  ].join("\n");
3113
3141
  }
3114
- function Kr(e, t) {
3115
- let n = RegExp(`${Jr(Br)}[\\s\\S]*?${Jr(Vr)}`);
3142
+ function Yr(e, t) {
3143
+ let n = RegExp(`${Zr(Ur)}[\\s\\S]*?${Zr(Wr)}`);
3116
3144
  if (n.test(e)) return e.replace(n, t);
3117
- if (e.includes(zr)) return e.replace(zr, t);
3145
+ if (e.includes(Hr)) return e.replace(Hr, t);
3118
3146
  throw Error("Unable to find MCP tools placeholder or generated block in yoyo-control skill");
3119
3147
  }
3120
- function qr(e) {
3148
+ function Xr(e) {
3121
3149
  return e.replaceAll("|", "\\|").replace(/\r?\n/g, " ");
3122
3150
  }
3123
- function Jr(e) {
3151
+ function Zr(e) {
3124
3152
  return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
3125
3153
  }
3126
- function Yr(e) {
3154
+ function Qr(e) {
3127
3155
  return e instanceof Error && "code" in e;
3128
3156
  }
3129
3157
  //#endregion
3130
3158
  //#region src/modules/device-toolset/processor.ts
3131
- var Xr = Dt();
3132
- async function Zr(e) {
3133
- let t = Er(e), n = Ot();
3159
+ var $r = Ct();
3160
+ async function ei(e) {
3161
+ let t = kr(e), n = wt();
3134
3162
  if (!n) throw Error("Unable to resolve home directory for DeviceToolSet persistence");
3135
- let r = Dr(t);
3136
- D().info(`[yoyoclaw-device-toolset] process start, nodeId: ${r.nodeId}, tools: ${r.tools.length}, skipped: ${r.skippedCount}`);
3137
- let i = xr(r.tools);
3138
- if (D().debug?.(`[yoyoclaw-device-toolset] computed md5, nodeId: ${r.nodeId}, md5: ${i}`), !(await Cr(n, r.nodeId, i)).changed) return D().info(`[yoyoclaw-device-toolset] unchanged, skip refresh, nodeId: ${r.nodeId}`), {
3163
+ let i = Ar(t);
3164
+ O().info(`[yoyoclaw-device-toolset] process start, nodeId: ${i.nodeId}, tools: ${i.tools.length}, skipped: ${i.skippedCount}`);
3165
+ let a = wr(i.tools);
3166
+ if (O().debug?.(`[yoyoclaw-device-toolset] computed md5, nodeId: ${i.nodeId}, md5: ${a}`), !(await Er(n, i.nodeId, a)).changed) return O().info(`[yoyoclaw-device-toolset] unchanged, skip refresh, nodeId: ${i.nodeId}`), {
3139
3167
  changed: !1,
3140
- nodeId: r.nodeId,
3141
- skippedCount: r.skippedCount
3168
+ nodeId: i.nodeId,
3169
+ skippedCount: i.skippedCount
3142
3170
  };
3143
- let a = await Nr(n, r.nodeId, r.tools);
3144
- D().info(`[yoyoclaw-device-toolset] cache merged, nodeId: ${r.nodeId}, supportedNodes: ${a.nodeCount}, tools: ${a.toolCount}`);
3145
- let o = a.cache.tools, s = await nr(n, r.tools);
3146
- D().info(`[yoyoclaw-device-toolset] archive refreshed, nodeId: ${r.nodeId}, written: ${s.writtenCount}, skipped: ${s.skippedCount}`);
3147
- let c = await Hr(Xr, o);
3148
- D().info(`[yoyoclaw-device-toolset] skill refreshed, nodeId: ${r.nodeId}, rows: ${c.rowCount}`);
3149
- let l = await dr(s.archiveDir, u.join(Xr, "skills", "yoyo-control", "mcptools"));
3150
- return D().info(`[yoyoclaw-device-toolset] mapping ready, nodeId: ${r.nodeId}, mode: ${l.mode}`), await wr(n, r.nodeId, i, Date.now()), D().info(`[yoyoclaw-device-toolset] process complete, nodeId: ${r.nodeId}`), {
3171
+ let o = await Ir(n, i.nodeId, i.tools);
3172
+ O().info(`[yoyoclaw-device-toolset] cache merged, nodeId: ${i.nodeId}, supportedNodes: ${o.nodeCount}, tools: ${o.toolCount}`);
3173
+ let s = o.cache.tools, c = await ar(n, i.tools);
3174
+ O().info(`[yoyoclaw-device-toolset] archive refreshed, nodeId: ${i.nodeId}, written: ${c.writtenCount}, skipped: ${c.skippedCount}`);
3175
+ let l = await Gr($r, s);
3176
+ O().info(`[yoyoclaw-device-toolset] skill refreshed, nodeId: ${i.nodeId}, rows: ${l.rowCount}`);
3177
+ let u = await mr(c.archiveDir, r.join($r, "skills", "yoyo-control", "mcptools"));
3178
+ return O().info(`[yoyoclaw-device-toolset] mapping ready, nodeId: ${i.nodeId}, mode: ${u.mode}`), await Dr(n, i.nodeId, a, Date.now()), O().info(`[yoyoclaw-device-toolset] process complete, nodeId: ${i.nodeId}`), {
3151
3179
  changed: !0,
3152
- nodeId: r.nodeId,
3153
- nodeCount: a.nodeCount,
3154
- toolCount: a.toolCount,
3155
- skippedCount: r.skippedCount
3180
+ nodeId: i.nodeId,
3181
+ nodeCount: o.nodeCount,
3182
+ toolCount: o.toolCount,
3183
+ skippedCount: i.skippedCount
3156
3184
  };
3157
3185
  }
3158
3186
  //#endregion
3159
3187
  //#region src/cloud-channel/message-handler.ts
3160
- var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3188
+ var ti = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", ni = class {
3161
3189
  sessionManager;
3162
3190
  adminClientManager;
3163
3191
  config;
@@ -3197,7 +3225,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3197
3225
  let { sourceDeviceId: t, sourceDeviceInfo: n, targetDeviceId: r, port: i, sessionInfo: a, traceInfo: o } = e;
3198
3226
  if (!t || !r || !i || !n?.deviceId) return;
3199
3227
  let s = n.deviceId, c = a?.nodeConnectTimestamp;
3200
- c ? (this.sessionManager.closePreviousNodeGatewayClients(s, c), this.flushPendingMessage(s), this.initializedDeviceIds.delete(s)) : D().warn(`${X} pair message missing timestamp for device: ${t}`), D().info(`${X} received pair message, creating gateway client for device: ${t}, hardware device: ${s}, timestamp: ${c}`);
3228
+ c ? (this.sessionManager.closePreviousNodeGatewayClients(s, c), this.flushPendingMessage(s), this.initializedDeviceIds.delete(s)) : O().warn(`${X} pair message missing timestamp for device: ${t}`), O().info(`${X} received pair message, creating gateway client for device: ${t}, hardware device: ${s}, timestamp: ${c}`);
3201
3229
  let l = {
3202
3230
  sessionId: t,
3203
3231
  timestamp: c || 0,
@@ -3229,11 +3257,11 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3229
3257
  handleUnPairMessage(e) {
3230
3258
  let { sourceDeviceId: t } = e;
3231
3259
  if (!t) {
3232
- D().warn(`${X} unpair message missing sourceDeviceId`);
3260
+ O().warn(`${X} unpair message missing sourceDeviceId`);
3233
3261
  return;
3234
3262
  }
3235
3263
  let n = this.sessionManager.getHardwareDeviceId(t);
3236
- D().info(`${X} received unpair message, session: ${t}, hardware device: ${n}`), this.config.onStatusEvent?.({
3264
+ O().info(`${X} received unpair message, session: ${t}, hardware device: ${n}`), this.config.onStatusEvent?.({
3237
3265
  type: G.DEVICE_UNPAIRING,
3238
3266
  timestamp: Date.now(),
3239
3267
  data: {
@@ -3247,27 +3275,27 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3247
3275
  handleUserMessage(e) {
3248
3276
  let { sourceDeviceId: t } = e || {};
3249
3277
  if (!t) {
3250
- D().warn(`${X} user message missing sourceDeviceId`);
3278
+ O().warn(`${X} user message missing sourceDeviceId`);
3251
3279
  return;
3252
3280
  }
3253
3281
  let n = this.sessionManager.getHardwareDeviceId(t);
3254
3282
  if (!n) {
3255
- D().warn(`${X} user message missing hardwareDeviceId, session: ${t}`);
3283
+ O().warn(`${X} user message missing hardwareDeviceId, session: ${t}`);
3256
3284
  return;
3257
3285
  }
3258
3286
  try {
3259
3287
  let r = this.sessionManager.getNodeGatewayClient(t);
3260
3288
  if (!r) {
3261
- D().warn(`${X} no node gateway client found for source device: ${n}, session: ${t}`);
3289
+ O().warn(`${X} no node gateway client found for source device: ${n}, session: ${t}`);
3262
3290
  return;
3263
3291
  }
3264
3292
  e.data && (this.initializedDeviceIds.has(n) || this.processMessageBuffer(t, n, e.data, r)) && this.forwardToNodeGateway(t, n, r, e.data);
3265
3293
  } catch (e) {
3266
- D().error(`${X} failed to send gateway message to device: ${n}, session: ${t}, ${String(e)}`);
3294
+ O().error(`${X} failed to send gateway message to device: ${n}, session: ${t}, ${String(e)}`);
3267
3295
  }
3268
3296
  }
3269
3297
  forwardToNodeGateway(e, t, n, r) {
3270
- D().info(`${X} forwarding user message to node gateway from ${t}, session: ${e}`), n.send(r);
3298
+ O().info(`${X} forwarding user message to node gateway from ${t}, session: ${e}`), n.send(r);
3271
3299
  }
3272
3300
  processMessageBuffer(e, t, n, r) {
3273
3301
  let i = this.pendingFirstMessages.get(t);
@@ -3295,22 +3323,22 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3295
3323
  handleNodeGatewayMessage = async (e, t, n) => {
3296
3324
  let r = this.sessionManager.getHardwareDeviceId(e), i = this.sessionManager.getSession(e), a = i?.sourceInfo.sourceDeviceInfo?.deviceId;
3297
3325
  if (!r || !i) {
3298
- D().warn(`${X} gateway source offline, session: ${e}`);
3326
+ O().warn(`${X} gateway source offline, session: ${e}`);
3299
3327
  return;
3300
3328
  }
3301
- D().info(`${X} received gateway message from ${a}`);
3329
+ O().info(`${X} received gateway message from ${a}`);
3302
3330
  try {
3303
3331
  let e = i.sourceInfo.sourceDeviceId, r;
3304
3332
  try {
3305
3333
  r = JSON.parse(n);
3306
3334
  } catch {
3307
- D().warn(`${X} gateway message is not valid JSON`);
3335
+ O().warn(`${X} gateway message is not valid JSON`);
3308
3336
  return;
3309
3337
  }
3310
3338
  if (!r.ok && r.error?.code === "NOT_PAIRED") {
3311
3339
  let n = r.error?.details?.requestId;
3312
3340
  if (!n) {
3313
- D().warn(`${X} NOT_PAIRED without requestId, ignoring...`);
3341
+ O().warn(`${X} NOT_PAIRED without requestId, ignoring...`);
3314
3342
  return;
3315
3343
  }
3316
3344
  await this.handleAutoPair(n);
@@ -3318,30 +3346,30 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3318
3346
  id: r.id,
3319
3347
  type: "reconnect-required"
3320
3348
  };
3321
- this.sendMessage("deviceControl", e, t, "", void 0, i), D().info(`${X} auto pair is completed, requestId: ${n}`);
3349
+ this.sendMessage("deviceControl", e, t, "", void 0, i), O().info(`${X} auto pair is completed, requestId: ${n}`);
3322
3350
  return;
3323
3351
  }
3324
- D().debug?.(`${X} trans gateway msg to cloud, session: ${e}, data: ${n.slice(0, 1e3)}`), this.sendMessage("userMessage", e, t, n) || (D().error(`${X} failed to send message, cloud socket closed, session ${e}, device ${a}`), this.sessionManager.closeNodeGatewayClient(e));
3352
+ O().debug?.(`${X} trans gateway msg to cloud, session: ${e}, data: ${n.slice(0, 1e3)}`), this.sendMessage("userMessage", e, t, n) || (O().error(`${X} failed to send message, cloud socket closed, session ${e}, device ${a}`), this.sessionManager.closeNodeGatewayClient(e));
3325
3353
  } catch (e) {
3326
- D().error(`${X} failed to handle gateway message: ${String(e)}`);
3354
+ O().error(`${X} failed to handle gateway message: ${String(e)}`);
3327
3355
  }
3328
3356
  };
3329
3357
  async handleAutoPair(e) {
3330
3358
  let t = this.adminClientManager.getClient();
3331
- if (!t) return D().warn(`${X} admin client not available for auto pair`), !1;
3359
+ if (!t) return O().warn(`${X} admin client not available for auto pair`), !1;
3332
3360
  try {
3333
- D().info(`${X} auto pair approve, requestId: ${e}`), await t.devicePairApprove(e);
3361
+ O().info(`${X} auto pair approve, requestId: ${e}`), await t.devicePairApprove(e);
3334
3362
  } catch (t) {
3335
- D().error(`${X} auto pair approve failed, requestId: ${e}, error: ${String(t)}, ignore...`);
3363
+ O().error(`${X} auto pair approve failed, requestId: ${e}, error: ${String(t)}, ignore...`);
3336
3364
  }
3337
3365
  }
3338
3366
  async handleContextRequest(e) {
3339
3367
  let { sourceDeviceId: t, traceInfo: n } = e, r = e.msgType, i = r === "updateContexts";
3340
3368
  if (!t) {
3341
- D().warn(`${X} context request missing sourceDeviceId`);
3369
+ O().warn(`${X} context request missing sourceDeviceId`);
3342
3370
  return;
3343
3371
  }
3344
- D().info(`${X} handling ${r} from ${t} traceInfo: ${JSON.stringify(n)}`);
3372
+ O().info(`${X} handling ${r} from ${t} traceInfo: ${JSON.stringify(n)}`);
3345
3373
  let a = e.contexts?.[0], o = this.validateContext(a);
3346
3374
  if (!o.valid) {
3347
3375
  this.replyContextError(r, t, n, a, o.error);
@@ -3357,13 +3385,13 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3357
3385
  if (this.contextHandlerRequiresAdminClient(i, c) && !await this.ensureAdminClientReady(r, t, n, s)) return;
3358
3386
  let o = this.adminClientManager.getClient(), l = i ? await e(o ?? void 0, s.payload, s) : await e(o);
3359
3387
  if (l.noReply) {
3360
- D().info(`${X} ${i ? "update" : "fetch"} context '${c}' processed (no reply)`);
3388
+ O().info(`${X} ${i ? "update" : "fetch"} context '${c}' processed (no reply)`);
3361
3389
  return;
3362
3390
  }
3363
- l.ok ? (D().info(`${X} ${i ? "update" : "fetch"} context successfully`), this.sendContextResponse(r, t, n, a, {
3391
+ l.ok ? (O().info(`${X} ${i ? "update" : "fetch"} context successfully`), this.sendContextResponse(r, t, n, a, {
3364
3392
  ok: !0,
3365
3393
  ...l.data
3366
- })) : (D().error(`${X} failed to ${i ? "update" : "fetch"} context: ${l.error}`), this.sendContextResponse(r, t, n, a, {
3394
+ })) : (O().error(`${X} failed to ${i ? "update" : "fetch"} context: ${l.error}`), this.sendContextResponse(r, t, n, a, {
3367
3395
  ok: !1,
3368
3396
  error: l.error,
3369
3397
  ...l?.data,
@@ -3371,7 +3399,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3371
3399
  }));
3372
3400
  } catch (e) {
3373
3401
  let o = e instanceof Error ? e.message : String(e);
3374
- D().error(`${X} error ${i ? "updating" : "fetching"} context '${c}': ${o}`), this.replyContextError(r, t, n, a, o);
3402
+ O().error(`${X} error ${i ? "updating" : "fetching"} context '${c}': ${o}`), this.replyContextError(r, t, n, a, o);
3375
3403
  }
3376
3404
  }
3377
3405
  sendMessage(e, t, n, r, i, a) {
@@ -3408,7 +3436,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3408
3436
  }];
3409
3437
  }
3410
3438
  replyContextError(e, t, n, r, i) {
3411
- D().error(`${X} ${i}`), this.sendContextResponse(e, t, n, r, {
3439
+ O().error(`${X} ${i}`), this.sendContextResponse(e, t, n, r, {
3412
3440
  ok: !1,
3413
3441
  error: i
3414
3442
  });
@@ -3434,7 +3462,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3434
3462
  ok: !1,
3435
3463
  error: "Missing content in context payload"
3436
3464
  };
3437
- let r = Qr.style, i = await e.setAgentFile(r, n);
3465
+ let r = ti.style, i = await e.setAgentFile(r, n);
3438
3466
  return i.ok ? {
3439
3467
  ok: !0,
3440
3468
  data: { name: "style" }
@@ -3454,21 +3482,21 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3454
3482
  error: "Missing provider or id in context payload"
3455
3483
  };
3456
3484
  try {
3457
- return (await e.switchPrimaryModel(n, r)).ok ? (D().info(`[yoyoclaw-channel] switchPrimaryModel success: ${n}/${r}`), {
3485
+ return (await e.switchPrimaryModel(n, r)).ok ? (O().info(`[yoyoclaw-channel] switchPrimaryModel success: ${n}/${r}`), {
3458
3486
  ok: !0,
3459
3487
  data: { resolved: {
3460
3488
  provider: n,
3461
3489
  id: r
3462
3490
  } }
3463
- }) : (D().error("[yoyoclaw-channel] switchPrimaryModel failed, try to fallback main session model"), this.getMainSessionModel(e));
3491
+ }) : (O().error("[yoyoclaw-channel] switchPrimaryModel failed, try to fallback main session model"), this.getMainSessionModel(e));
3464
3492
  } catch (t) {
3465
- return D().error(`[yoyoclaw-channel] updatePrimaryModel error: ${t}, try to fallback main session model`), this.getMainSessionModel(e);
3493
+ return O().error(`[yoyoclaw-channel] updatePrimaryModel error: ${t}, try to fallback main session model`), this.getMainSessionModel(e);
3466
3494
  }
3467
3495
  }
3468
3496
  async getMainSessionModel(e) {
3469
3497
  try {
3470
3498
  let t = await e.getMainSession(), { modelProvider: n = "", model: r = "" } = t;
3471
- return D().warn(`[yoyoclaw-channel] switchPrimaryModel failed, fallback to current: ${n}/${r}`), !n || !r ? {
3499
+ return O().warn(`[yoyoclaw-channel] switchPrimaryModel failed, fallback to current: ${n}/${r}`), !n || !r ? {
3472
3500
  ok: !1,
3473
3501
  error: `Missing primary model: mainSession-${JSON.stringify(t)}`
3474
3502
  } : {
@@ -3499,7 +3527,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3499
3527
  async fetchModelsList(e) {
3500
3528
  try {
3501
3529
  let t = await e.getModelList(), { modelProvider: n = "", model: r = "" } = await e.getMainSession();
3502
- return D().info(`[yoyoclaw-channel] current primary model: ${n}/${r}`), {
3530
+ return O().info(`[yoyoclaw-channel] current primary model: ${n}/${r}`), {
3503
3531
  ok: !0,
3504
3532
  data: { models: t?.models?.map((e) => {
3505
3533
  let t = e.provider === n && e.id === r;
@@ -3511,7 +3539,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3511
3539
  };
3512
3540
  } catch (e) {
3513
3541
  let t = e instanceof Error ? e.message : String(e);
3514
- return D().error(`[yoyoclaw-channel] fetchModelsList failed: ${t}`), {
3542
+ return O().error(`[yoyoclaw-channel] fetchModelsList failed: ${t}`), {
3515
3543
  ok: !1,
3516
3544
  error: `fetchModelsList error: ${t}`
3517
3545
  };
@@ -3523,14 +3551,14 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3523
3551
  async updateDeviceToolSetContext(e, t, n) {
3524
3552
  return n?.header.namespace === "yoyoclaw" ? {
3525
3553
  ok: !0,
3526
- data: await Zr(t),
3554
+ data: await ei(t),
3527
3555
  noReply: !0
3528
3556
  } : {
3529
3557
  ok: !1,
3530
3558
  error: `Unsupported DeviceToolSet namespace: ${n?.header.namespace ?? "unknown"}`
3531
3559
  };
3532
3560
  }
3533
- }, ei = class extends jn {
3561
+ }, ri = class extends Pn {
3534
3562
  nodeOpts;
3535
3563
  sessionId;
3536
3564
  hardwareDeviceId;
@@ -3546,7 +3574,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3546
3574
  return this.hardwareDeviceId;
3547
3575
  }
3548
3576
  onOpen() {
3549
- this.connectedAt = (/* @__PURE__ */ new Date()).toISOString(), D().info(`[yoyoclaw-nodeGatewayClient] connected for session: ${this.sessionId}, device: ${this.hardwareDeviceId}`), this.nodeOpts.onStatusEvent?.({
3577
+ this.connectedAt = (/* @__PURE__ */ new Date()).toISOString(), O().info(`[yoyoclaw-nodeGatewayClient] connected for session: ${this.sessionId}, device: ${this.hardwareDeviceId}`), this.nodeOpts.onStatusEvent?.({
3550
3578
  type: G.GATEWAY_CLIENT_CONNECTED,
3551
3579
  timestamp: Date.now(),
3552
3580
  data: {
@@ -3558,7 +3586,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3558
3586
  });
3559
3587
  }
3560
3588
  onClose(e, t) {
3561
- D().info(`[yoyoclaw-nodeGatewayClient] disconnected for session: ${this.sessionId}, device: ${this.hardwareDeviceId}, reason: ${t}`), this.nodeOpts.onStatusEvent?.({
3589
+ O().info(`[yoyoclaw-nodeGatewayClient] disconnected for session: ${this.sessionId}, device: ${this.hardwareDeviceId}, reason: ${t}`), this.nodeOpts.onStatusEvent?.({
3562
3590
  type: G.GATEWAY_CLIENT_DISCONNECTED,
3563
3591
  timestamp: Date.now(),
3564
3592
  data: {
@@ -3570,9 +3598,9 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3570
3598
  });
3571
3599
  }
3572
3600
  onError(e) {
3573
- D().error(`[yoyoclaw-nodeGatewayClient] error for session: ${this.sessionId}, device: ${this.hardwareDeviceId}: ${e.message}`);
3601
+ O().error(`[yoyoclaw-nodeGatewayClient] error for session: ${this.sessionId}, device: ${this.hardwareDeviceId}: ${e.message}`);
3574
3602
  }
3575
- }, ti = class {
3603
+ }, ii = class {
3576
3604
  nodeGatewayClientsMap = /* @__PURE__ */ new Map();
3577
3605
  deviceSessionsMap = /* @__PURE__ */ new Map();
3578
3606
  sessionIdToHardwareDeviceMap = /* @__PURE__ */ new Map();
@@ -3605,7 +3633,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3605
3633
  this.nodeGatewayClientsMap.set(e, t);
3606
3634
  }
3607
3635
  createNodeGatewayClient(e) {
3608
- let t = new ei({
3636
+ let t = new ri({
3609
3637
  sessionId: e.sessionId,
3610
3638
  hardwareDeviceId: e.hardwareDeviceId,
3611
3639
  deviceInfo: e.deviceInfo,
@@ -3616,19 +3644,19 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3616
3644
  }
3617
3645
  closeNodeGatewayClient(e) {
3618
3646
  let t = this.nodeGatewayClientsMap.get(e);
3619
- t && (t.stop(), this.nodeGatewayClientsMap.delete(e), this.removeSession(e), D().info(`[yoyoclaw-channel] closed node gateway client for session: ${e}`));
3647
+ t && (t.stop(), this.nodeGatewayClientsMap.delete(e), this.removeSession(e), O().info(`[yoyoclaw-channel] closed node gateway client for session: ${e}`));
3620
3648
  }
3621
3649
  closePreviousNodeGatewayClients(e, t) {
3622
3650
  let n = this.deviceSessionsMap.get(e);
3623
3651
  if (!n || n.length === 0) return;
3624
3652
  let r = n.filter((e) => e.timestamp < t);
3625
3653
  if (r.length > 0) {
3626
- D().info(`[yoyoclaw-channel] closing ${r.length} previous node gateway client(s) for hardware device: ${e}, new timestamp: ${t}`);
3654
+ O().info(`[yoyoclaw-channel] closing ${r.length} previous node gateway client(s) for hardware device: ${e}, new timestamp: ${t}`);
3627
3655
  for (let e of r) this.closeNodeGatewayClient(e.sessionId);
3628
3656
  }
3629
3657
  }
3630
3658
  closeAllNodeGatewayClients() {
3631
- for (let [e, t] of this.nodeGatewayClientsMap.entries()) t.stop(), D().info(`[yoyoclaw-channel] closed node gateway client for session: ${e}`);
3659
+ for (let [e, t] of this.nodeGatewayClientsMap.entries()) t.stop(), O().info(`[yoyoclaw-channel] closed node gateway client for session: ${e}`);
3632
3660
  this.nodeGatewayClientsMap.clear(), this.deviceSessionsMap.clear(), this.sessionIdToHardwareDeviceMap.clear();
3633
3661
  }
3634
3662
  hasSession(e) {
@@ -3637,14 +3665,14 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3637
3665
  getSessionCount() {
3638
3666
  return this.sessionIdToHardwareDeviceMap.size;
3639
3667
  }
3640
- }, ni = class {
3668
+ }, ai = class {
3641
3669
  cloudClient;
3642
3670
  sessionManager;
3643
3671
  adminClientManager;
3644
3672
  messageHandler;
3645
3673
  config;
3646
3674
  constructor(e) {
3647
- this.config = e, this.sessionManager = new ti(), this.adminClientManager = new Un({ onStatusEvent: this.handleStatusEvent }), this.messageHandler = new $r({
3675
+ this.config = e, this.sessionManager = new ii(), this.adminClientManager = new Kn({ onStatusEvent: this.handleStatusEvent }), this.messageHandler = new ni({
3648
3676
  sessionManager: this.sessionManager,
3649
3677
  adminClientManager: this.adminClientManager,
3650
3678
  config: {
@@ -3652,7 +3680,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3652
3680
  onStatusEvent: this.handleStatusEvent,
3653
3681
  onReply: (e) => this.cloudClient.send(e)
3654
3682
  }
3655
- }), this.cloudClient = new $n({
3683
+ }), this.cloudClient = new nr({
3656
3684
  deviceInfo: e.deviceInfo,
3657
3685
  userInfo: e.userInfo,
3658
3686
  onMessage: this.messageHandler.handleCloudMessage,
@@ -3665,72 +3693,74 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
3665
3693
  }), this.adminClientManager.init();
3666
3694
  }
3667
3695
  start() {
3668
- D().info("[yoyoclaw-channel] starting connection"), this.adminClientManager.ensureConnected(), this.cloudClient.connect();
3696
+ O().info("[yoyoclaw-channel] starting connection"), this.adminClientManager.ensureConnected(), this.cloudClient.connect();
3669
3697
  }
3670
3698
  destroy() {
3671
- D().info("[yoyoclaw-channel] closing connection"), this.sessionManager.closeAllNodeGatewayClients(), this.adminClientManager.destroy(), this.cloudClient.close();
3699
+ O().info("[yoyoclaw-channel] closing connection"), this.sessionManager.closeAllNodeGatewayClients(), this.adminClientManager.destroy(), this.cloudClient.close();
3672
3700
  }
3673
3701
  handleCloudOpen = () => {
3674
- D().info("[yoyoclaw-channel] cloud connection established"), this.config.onOpen?.();
3702
+ O().info("[yoyoclaw-channel] cloud connection established"), this.config.onOpen?.();
3675
3703
  };
3676
3704
  handleStatusEvent = (e) => {
3677
3705
  this.config.onStatusEvent?.(e);
3678
3706
  };
3679
3707
  handleCloudClose = () => {
3680
- D().info("[yoyoclaw-channel] cloud connection closed"), this.config.onClose?.();
3708
+ O().info("[yoyoclaw-channel] cloud connection closed"), this.config.onClose?.();
3681
3709
  };
3682
3710
  handleRemoteDeviceOffline = (e) => {
3683
3711
  this.sessionManager.closeNodeGatewayClient(e);
3684
3712
  };
3685
3713
  handleDeviceNotRegistered = () => {
3686
- D().info("[yoyoclaw-channel] device not registered, notifying connection layer"), this.config.onDeviceNotRegistered?.();
3714
+ O().info("[yoyoclaw-channel] device not registered, notifying connection layer"), this.config.onDeviceNotRegistered?.();
3687
3715
  };
3688
3716
  handleUnauthorized = () => {
3689
- D().info("[yoyoclaw-channel] unauthorized connection, notifying connection layer"), this.config.onUnauthorized?.();
3717
+ O().info("[yoyoclaw-channel] unauthorized connection, notifying connection layer"), this.config.onUnauthorized?.();
3690
3718
  };
3691
3719
  }, Z = {
3692
3720
  channel: null,
3693
3721
  status: "idle"
3694
- }, Q = null, ri = (e) => ({
3722
+ }, Q = null, oi = (e) => ({
3695
3723
  id: "yoyoclaw-connection",
3696
3724
  async start() {
3697
- D().info("[yoyoclaw] plugin service enabled"), Q = new bn(!0);
3725
+ O().info("[yoyoclaw] plugin service enabled"), Q = new Cn(!0);
3698
3726
  try {
3699
- await Q.loadAndCleanStatus(), D().info("[yoyoclaw-conn] status tracker initialized and cleaned");
3727
+ await Q.loadAndCleanStatus(), O().info("[yoyoclaw-conn] status tracker initialized and cleaned");
3700
3728
  } catch (e) {
3701
- D().warn(`[yoyoclaw-conn] failed to load saved status: ${String(e)}`);
3729
+ O().warn(`[yoyoclaw-conn] failed to load saved status: ${String(e)}`);
3702
3730
  }
3703
- D().debug?.(`[yoyoclaw] agents: ${JSON.stringify(e.config.agents?.defaults)}`);
3731
+ O().debug?.(`[yoyoclaw] agents: ${JSON.stringify(e.config.agents?.defaults)}`);
3704
3732
  try {
3705
- await j().initializePluginConfig("yoyo"), D().info("[yoyoclaw] plugin config initialized");
3733
+ await j().initializePluginConfig("yoyo"), O().info("[yoyoclaw] plugin config initialized");
3706
3734
  } catch (e) {
3707
- D().error(`[yoyoclaw] failed to initialize plugin config: ${String(e)}`);
3735
+ O().error(`[yoyoclaw] failed to initialize plugin config: ${String(e)}`);
3708
3736
  }
3709
3737
  try {
3710
- let e = await dn();
3711
- e?.token ? (D().info("[yoyoclaw-conn] token found, creating channel"), await ii(await W(), e)) : D().info("[yoyoclaw-conn] no token found, skipping channel creation");
3738
+ let e = await mn();
3739
+ e?.token ? (O().info("[yoyoclaw-conn] token found, creating channel"), await si(await W(), e)) : O().info("[yoyoclaw-conn] no token found, skipping channel creation");
3712
3740
  } catch (e) {
3713
- D().error(`[yoyoclaw-conn] failed to initialize connection: ${String(e)}`);
3741
+ O().error(`[yoyoclaw-conn] failed to initialize connection: ${String(e)}`);
3714
3742
  }
3715
3743
  },
3716
3744
  async stop(e) {
3717
- $(), D().info("[yoyoclaw-conn] stopping connection service"), Q &&= (await Q.destroy(), null);
3745
+ $(), O().info("[yoyoclaw-conn] stopping connection service"), Q &&= (await Q.destroy(), null);
3718
3746
  }
3719
3747
  });
3720
- async function ii(e, t) {
3721
- return Z.status = "connecting", D().info(`[yoyoclaw-conn] creating new channel for device: ${e.deviceId}`), Q && await Q.handleEvent({
3748
+ async function si(e, t) {
3749
+ O().info(`[yoyoclaw-conn] creating new channel for device: ${e.deviceId}`), await Xt(e, t);
3750
+ let n = Z.status;
3751
+ return Z.status = "connecting", Q && await Q.handleEvent({
3722
3752
  type: G.CONNECTION_STATUS_CHANGED,
3723
3753
  timestamp: Date.now(),
3724
3754
  data: {
3725
3755
  status: "connecting",
3726
- previousStatus: Z.status
3756
+ previousStatus: n
3727
3757
  }
3728
3758
  }), new Promise((n, r) => {
3729
- Z.channel = new ni({
3759
+ Z.channel = new ai({
3730
3760
  deviceInfo: e,
3731
3761
  userInfo: t,
3732
3762
  onOpen: () => {
3733
- Z.status = "connected", D().info("[yoyoclaw-conn] channel connected successfully"), Q && Q.handleEvent({
3763
+ Z.status = "connected", O().info("[yoyoclaw-conn] channel connected successfully"), Q && Q.handleEvent({
3734
3764
  type: G.CONNECTION_STATUS_CHANGED,
3735
3765
  timestamp: Date.now(),
3736
3766
  data: {
@@ -3740,7 +3770,7 @@ async function ii(e, t) {
3740
3770
  }), n(void 0);
3741
3771
  },
3742
3772
  onClose: () => {
3743
- Z.status = "idle", Z.channel = null, D().info("[yoyoclaw-conn] channel closed"), Q && Q.handleEvent({
3773
+ Z.status = "idle", Z.channel = null, O().info("[yoyoclaw-conn] channel closed"), Q && Q.handleEvent({
3744
3774
  type: G.CONNECTION_STATUS_CHANGED,
3745
3775
  timestamp: Date.now(),
3746
3776
  data: {
@@ -3750,30 +3780,30 @@ async function ii(e, t) {
3750
3780
  }), n(void 0);
3751
3781
  },
3752
3782
  onDeviceNotRegistered: async () => {
3753
- D().info("[yoyoclaw-conn] device not registered, handling...");
3754
- let t = await dn();
3783
+ O().info("[yoyoclaw-conn] device not registered, handling...");
3784
+ let t = await mn();
3755
3785
  if (!t?.token) {
3756
- D().info("[yoyoclaw-conn] no token available, treating as logout"), $();
3786
+ O().info("[yoyoclaw-conn] no token available, treating as logout"), $();
3757
3787
  return;
3758
3788
  }
3759
3789
  try {
3760
- D().info("[yoyoclaw-conn] attempting to register device"), await Bt(e, t), D().info("[yoyoclaw-conn] device registered successfully, reconnecting..."), $(), await ii(e, t);
3790
+ O().info("[yoyoclaw-conn] attempting to register device"), await Yt(e, t), O().info("[yoyoclaw-conn] device registered successfully, reconnecting..."), $(), await si(e, t);
3761
3791
  } catch (e) {
3762
- D().error(`[yoyoclaw-conn] device registration failed: ${String(e)}`), D().info("[yoyoclaw-conn] clearing token and destroying channel");
3792
+ O().error(`[yoyoclaw-conn] device registration failed: ${String(e)}`), O().info("[yoyoclaw-conn] clearing token and destroying channel");
3763
3793
  try {
3764
- await fn();
3794
+ await hn();
3765
3795
  } catch (e) {
3766
- D().error(`[yoyoclaw-conn] failed to clear token: ${String(e)}`);
3796
+ O().error(`[yoyoclaw-conn] failed to clear token: ${String(e)}`);
3767
3797
  }
3768
3798
  $();
3769
3799
  }
3770
3800
  },
3771
3801
  onUnauthorized: async () => {
3772
- D().warn("[yoyoclaw-conn] connection unauthorized (401), clearing token and destroying channel");
3802
+ O().warn("[yoyoclaw-conn] connection unauthorized (401), clearing token and destroying channel");
3773
3803
  try {
3774
- await fn();
3804
+ await hn();
3775
3805
  } catch (e) {
3776
- D().error(`[yoyoclaw-conn] failed to clear token: ${String(e)}`);
3806
+ O().error(`[yoyoclaw-conn] failed to clear token: ${String(e)}`);
3777
3807
  }
3778
3808
  $();
3779
3809
  },
@@ -3784,31 +3814,31 @@ async function ii(e, t) {
3784
3814
  try {
3785
3815
  Z.channel.start();
3786
3816
  } catch (e) {
3787
- Z.status = "idle", Z.channel = null, D().error(`[yoyoclaw-conn] failed to launch channel: ${String(e)}`), r(e);
3817
+ Z.status = "idle", Z.channel = null, O().error(`[yoyoclaw-conn] failed to launch channel: ${String(e)}`), r(e);
3788
3818
  }
3789
3819
  });
3790
3820
  }
3791
3821
  function $() {
3792
3822
  try {
3793
3823
  if (!Z.channel) {
3794
- D().warn("[yoyoclaw-conn] no channel to destroy");
3824
+ O().warn("[yoyoclaw-conn] no channel to destroy");
3795
3825
  return;
3796
3826
  }
3797
- D().info("[yoyoclaw-conn] destroying channel"), Z.channel.destroy(), Z.channel = null, Z.status = "idle", D().info("[yoyoclaw-conn] channel destroyed successfully");
3827
+ O().info("[yoyoclaw-conn] destroying channel"), Z.channel.destroy(), Z.channel = null, Z.status = "idle", O().info("[yoyoclaw-conn] channel destroyed successfully");
3798
3828
  } catch (e) {
3799
- D().error(`[yoyoclaw-conn] failed to destroy channel: ${String(e)}`);
3829
+ O().error(`[yoyoclaw-conn] failed to destroy channel: ${String(e)}`);
3800
3830
  }
3801
3831
  }
3802
3832
  //#endregion
3803
3833
  //#region index.ts
3804
- var ai = {
3834
+ var ci = {
3805
3835
  id: "yoyo",
3806
3836
  name: "YOYOClaw",
3807
3837
  description: "OpenClaw Honor Yoyo connection plugin",
3808
- configSchema: kn,
3838
+ configSchema: Mn,
3809
3839
  register(e) {
3810
- pe(e.runtime), Se(e.logger), e.registerService(ri(e)), e.on("before_prompt_build", async () => ({ prependSystemContext: En })), Tn(e);
3840
+ ce(e.runtime), _e(e.logger), e.registerService(oi(e)), e.on("before_prompt_build", async () => ({ prependSystemContext: kn })), On(e);
3811
3841
  }
3812
3842
  };
3813
3843
  //#endregion
3814
- export { ai as default };
3844
+ export { ci as default };