@honor-claw/yoyo 1.3.0-beta.2 → 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 +452 -413
  2. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -23,7 +23,7 @@ import { Buffer as ie } from "node:buffer";
23
23
  //#region src/utils/version.ts
24
24
  var ae = null;
25
25
  function oe() {
26
- return ae === null && (ae = "1.3.0-beta.2".includes("beta") || "1.3.0-beta.2".includes("alpha")), !!ae;
26
+ return ae === null && (ae = "1.3.0-beta.3".includes("beta") || "1.3.0-beta.3".includes("alpha")), !!ae;
27
27
  }
28
28
  //#endregion
29
29
  //#region src/runtime.ts
@@ -37,7 +37,7 @@ function le() {
37
37
  }
38
38
  function ue() {
39
39
  try {
40
- let e = M();
40
+ let e = j();
41
41
  return {
42
42
  env: e.getEnvInfo().env,
43
43
  grayTag: e.getGrayTag()
@@ -121,8 +121,8 @@ function ye(e, t) {
121
121
  }
122
122
  return n.agents &&= be(n.agents, t), n.auth?.profiles && (n.auth = {
123
123
  ...n.auth,
124
- profiles: Ce(n.auth.profiles, t)
125
- }, Ee(t)), n;
124
+ profiles: we(n.auth.profiles, t)
125
+ }, De(t)), n;
126
126
  }
127
127
  function be(e, t) {
128
128
  let n = { ...e };
@@ -133,7 +133,7 @@ function xe(e, t) {
133
133
  if (n.model &&= k(n.model, t), n.imageModel &&= k(n.imageModel, t), n.pdfModel &&= k(n.pdfModel, t), n.models) {
134
134
  let e = {};
135
135
  for (let [r, i] of Object.entries(n.models)) {
136
- let n = A(r, t);
136
+ let n = Ce(r, t);
137
137
  e[n] = i;
138
138
  }
139
139
  n.models = e;
@@ -151,14 +151,14 @@ function Se(e, t) {
151
151
  }), n;
152
152
  }
153
153
  function k(e, t) {
154
- if (typeof e == "string") return A(e, t);
154
+ if (typeof e == "string") return Ce(e, t);
155
155
  if (typeof e == "object" && e) {
156
156
  let n = { ...e };
157
- return n.primary &&= A(n.primary, t), n.fallbacks && Array.isArray(n.fallbacks) && (n.fallbacks = n.fallbacks.map((e) => A(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;
158
158
  }
159
159
  return e;
160
160
  }
161
- function A(e, t) {
161
+ function Ce(e, t) {
162
162
  let n = e.split("/");
163
163
  if (n.length > 0) {
164
164
  let e = t[n[0]];
@@ -166,7 +166,7 @@ function A(e, t) {
166
166
  }
167
167
  return e;
168
168
  }
169
- function Ce(e, t) {
169
+ function we(e, t) {
170
170
  let n = {};
171
171
  for (let [r, i] of Object.entries(e)) {
172
172
  let e = { ...i }, a = t[e.provider];
@@ -174,11 +174,11 @@ function Ce(e, t) {
174
174
  }
175
175
  return n;
176
176
  }
177
- function we() {
177
+ function Te() {
178
178
  return process.platform === "win32" ? process.env.USERPROFILE || "" : process.env.HOME || "";
179
179
  }
180
- function Te(t) {
181
- let n = [], i = we(), a = t || r.join(i, ".openclaw"), o = r.join(a, "agents", "main", "agent", "auth-profiles.json");
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
182
  e.existsSync(o) && n.push(o);
183
183
  let s = r.join(a, "agents");
184
184
  if (e.existsSync(s)) {
@@ -190,8 +190,8 @@ function Te(t) {
190
190
  }
191
191
  return n;
192
192
  }
193
- function Ee(t, n) {
194
- let r = Te(n), i = [], a = [], o = !1;
193
+ function De(t, n) {
194
+ let r = Ee(n), i = [], a = [], o = !1;
195
195
  for (let n of r) try {
196
196
  let r = e.readFileSync(n, "utf-8"), a = JSON.parse(r);
197
197
  if (!a.profiles || typeof a.profiles != "object") continue;
@@ -229,7 +229,7 @@ function Ee(t, n) {
229
229
  }
230
230
  //#endregion
231
231
  //#region src/modules/configs/config-manager.ts
232
- var j = "yoyo", De = { watch: !0 }, Oe = 250, ke = /* @__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(","), Ae = 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 {
233
233
  loadConfig() {
234
234
  try {
235
235
  return le().config.loadConfig();
@@ -248,11 +248,11 @@ var j = "yoyo", De = { watch: !0 }, Oe = 250, ke = /* @__PURE__ */ "alarm.create
248
248
  try {
249
249
  let e = this.loadConfig().gateway?.auth;
250
250
  if (!e) return;
251
- let t = {
252
- token: "",
253
- password: ""
251
+ let t = e.token ?? "", n = e.password ?? "";
252
+ return !t && !n ? void 0 : {
253
+ token: t,
254
+ password: n
254
255
  };
255
- return e.token && (t.token = e.token), e.password && (t.password = e.password), Object.keys(t).length === 0 ? void 0 : t;
256
256
  } catch (e) {
257
257
  console.error(`[claw-configs] Failed to read gateway auth config: ${e}`);
258
258
  return;
@@ -267,7 +267,7 @@ var j = "yoyo", De = { watch: !0 }, Oe = 250, ke = /* @__PURE__ */ "alarm.create
267
267
  }
268
268
  getUserConfig() {
269
269
  try {
270
- return this.loadConfig().plugins?.entries?.[j]?.config?.user;
270
+ return this.loadConfig().plugins?.entries?.[A]?.config?.user;
271
271
  } catch (e) {
272
272
  console.error(`[claw-configs] Failed to read user config: ${e}`);
273
273
  return;
@@ -275,7 +275,7 @@ var j = "yoyo", De = { watch: !0 }, Oe = 250, ke = /* @__PURE__ */ "alarm.create
275
275
  }
276
276
  getEnvInfo() {
277
277
  try {
278
- let e = this.loadConfig().plugins?.entries?.[j]?.config, t = e?.envInfo;
278
+ let e = this.loadConfig().plugins?.entries?.[A]?.config, t = e?.envInfo;
279
279
  if (t?.env) return t;
280
280
  let n = e?.env;
281
281
  if (n) return {
@@ -299,7 +299,7 @@ var j = "yoyo", De = { watch: !0 }, Oe = 250, ke = /* @__PURE__ */ "alarm.create
299
299
  }
300
300
  getGrayTag() {
301
301
  try {
302
- return this.loadConfig().plugins?.entries?.[j]?.config?.gray;
302
+ return this.loadConfig().plugins?.entries?.[A]?.config?.gray;
303
303
  } catch (e) {
304
304
  console.error(`[claw-configs] Failed to read gray tag config: ${e}`);
305
305
  return;
@@ -307,7 +307,7 @@ var j = "yoyo", De = { watch: !0 }, Oe = 250, ke = /* @__PURE__ */ "alarm.create
307
307
  }
308
308
  getDeviceConfig() {
309
309
  try {
310
- return this.loadConfig().plugins?.entries?.[j]?.config?.device;
310
+ return this.loadConfig().plugins?.entries?.[A]?.config?.device;
311
311
  } catch (e) {
312
312
  console.error(`[claw-configs] Failed to read device config: ${e}`);
313
313
  return;
@@ -315,17 +315,17 @@ var j = "yoyo", De = { watch: !0 }, Oe = 250, ke = /* @__PURE__ */ "alarm.create
315
315
  }
316
316
  async updateDeviceConfig(e) {
317
317
  try {
318
- let t = this.loadConfig(), n = t.plugins?.entries?.[j]?.config?.device || {}, r = {
318
+ let t = this.loadConfig(), n = t.plugins?.entries?.[A]?.config?.device || {}, r = {
319
319
  ...t,
320
320
  plugins: {
321
321
  ...t.plugins,
322
322
  entries: {
323
323
  ...t.plugins?.entries,
324
- [j]: {
325
- ...t.plugins?.entries?.[j],
324
+ [A]: {
325
+ ...t.plugins?.entries?.[A],
326
326
  enabled: !0,
327
327
  config: {
328
- ...t.plugins?.entries?.[j]?.config,
328
+ ...t.plugins?.entries?.[A]?.config,
329
329
  device: {
330
330
  ...n,
331
331
  ...e
@@ -348,11 +348,11 @@ var j = "yoyo", De = { watch: !0 }, Oe = 250, ke = /* @__PURE__ */ "alarm.create
348
348
  ...t.plugins,
349
349
  entries: {
350
350
  ...t.plugins?.entries,
351
- [j]: {
352
- ...t.plugins?.entries?.[j],
351
+ [A]: {
352
+ ...t.plugins?.entries?.[A],
353
353
  enabled: !0,
354
354
  config: {
355
- ...t.plugins?.entries?.[j]?.config,
355
+ ...t.plugins?.entries?.[A]?.config,
356
356
  envInfo: {
357
357
  env: e,
358
358
  source: "manual"
@@ -370,7 +370,7 @@ var j = "yoyo", De = { watch: !0 }, Oe = 250, ke = /* @__PURE__ */ "alarm.create
370
370
  }
371
371
  async resetEnv() {
372
372
  try {
373
- let e = this.loadConfig(), t = e.plugins?.entries?.[j]?.config?.envInfo;
373
+ let e = this.loadConfig(), t = e.plugins?.entries?.[A]?.config?.envInfo;
374
374
  if (!t?.env) return;
375
375
  let n = {
376
376
  ...e,
@@ -378,11 +378,11 @@ var j = "yoyo", De = { watch: !0 }, Oe = 250, ke = /* @__PURE__ */ "alarm.create
378
378
  ...e.plugins,
379
379
  entries: {
380
380
  ...e.plugins?.entries,
381
- [j]: {
382
- ...e.plugins?.entries?.[j],
381
+ [A]: {
382
+ ...e.plugins?.entries?.[A],
383
383
  enabled: !0,
384
384
  config: {
385
- ...e.plugins?.entries?.[j]?.config,
385
+ ...e.plugins?.entries?.[A]?.config,
386
386
  envInfo: {
387
387
  env: t.env,
388
388
  source: "env"
@@ -405,11 +405,11 @@ var j = "yoyo", De = { watch: !0 }, Oe = 250, ke = /* @__PURE__ */ "alarm.create
405
405
  ...t.plugins,
406
406
  entries: {
407
407
  ...t.plugins?.entries,
408
- [j]: {
409
- ...t.plugins?.entries?.[j],
408
+ [A]: {
409
+ ...t.plugins?.entries?.[A],
410
410
  enabled: !0,
411
411
  config: {
412
- ...t.plugins?.entries?.[j]?.config,
412
+ ...t.plugins?.entries?.[A]?.config,
413
413
  ...e && { gray: e }
414
414
  }
415
415
  }
@@ -429,11 +429,11 @@ var j = "yoyo", De = { watch: !0 }, Oe = 250, ke = /* @__PURE__ */ "alarm.create
429
429
  ...t.plugins,
430
430
  entries: {
431
431
  ...t.plugins?.entries,
432
- [j]: {
433
- ...t.plugins?.entries?.[j],
432
+ [A]: {
433
+ ...t.plugins?.entries?.[A],
434
434
  enabled: !0,
435
435
  config: {
436
- ...t.plugins?.entries?.[j]?.config,
436
+ ...t.plugins?.entries?.[A]?.config,
437
437
  user: e
438
438
  }
439
439
  }
@@ -453,10 +453,10 @@ var j = "yoyo", De = { watch: !0 }, Oe = 250, ke = /* @__PURE__ */ "alarm.create
453
453
  ...e.plugins,
454
454
  entries: {
455
455
  ...e.plugins?.entries,
456
- [j]: {
457
- ...e.plugins?.entries?.[j],
456
+ [A]: {
457
+ ...e.plugins?.entries?.[A],
458
458
  config: {
459
- ...e.plugins?.entries?.[j]?.config,
459
+ ...e.plugins?.entries?.[A]?.config,
460
460
  user: void 0
461
461
  }
462
462
  }
@@ -470,10 +470,10 @@ var j = "yoyo", De = { watch: !0 }, Oe = 250, ke = /* @__PURE__ */ "alarm.create
470
470
  }
471
471
  async initializePluginConfig(e) {
472
472
  try {
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, ...ke])), o = t.skills || {}, s = o.load || {}, c = s.watch === De.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 : {
474
474
  ...s,
475
- ...De,
476
- watchDebounceMs: s.watchDebounceMs ?? Oe
475
+ ...Oe,
476
+ watchDebounceMs: s.watchDebounceMs ?? ke
477
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
478
  env: f || u || (oe() ? "test" : "production"),
479
479
  source: "env"
@@ -514,21 +514,21 @@ var j = "yoyo", De = { watch: !0 }, Oe = 250, ke = /* @__PURE__ */ "alarm.create
514
514
  throw D(e, "failed to initialize plugin config");
515
515
  }
516
516
  }
517
- }, je = null;
518
- function M() {
519
- return je ||= new Ae(), je;
517
+ }, Me = null;
518
+ function j() {
519
+ return Me ||= new je(), Me;
520
520
  }
521
521
  //#endregion
522
522
  //#region src/commands/env/impl.ts
523
- var Me = {
523
+ var Ne = {
524
524
  env: "environment variable",
525
525
  manual: "manual config"
526
526
  };
527
- function Ne(e, t) {
527
+ function Pe(e, t) {
528
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) => {
529
529
  let { set: t, gray: n, reset: r } = e, i = O();
530
530
  try {
531
- let e = M();
531
+ let e = j();
532
532
  if (r && (await e.resetEnv(), i.info("✅ Environment source reset to environment variable")), t) {
533
533
  if (t !== "test" && t !== "dev" && t !== "production") {
534
534
  i.error("❌ Invalid environment. Use 'test' or 'production'.");
@@ -538,7 +538,7 @@ function Ne(e, t) {
538
538
  }
539
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) {
540
540
  let t = e.getEnvInfo(), n = e.getGrayTag();
541
- i.info(`📋 Current environment: ${t.env} (source: ${Me[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");
542
542
  }
543
543
  } catch (e) {
544
544
  let t = e instanceof Error ? e.message : String(e);
@@ -548,18 +548,18 @@ function Ne(e, t) {
548
548
  }
549
549
  //#endregion
550
550
  //#region src/utils/id.ts
551
- var Pe = a("0123456789abcdefghijklmnopqrstuvwxyz", 32);
552
- function N(e) {
553
- return Pe(e);
551
+ var Fe = a("0123456789abcdefghijklmnopqrstuvwxyz", 32);
552
+ function M(e) {
553
+ return Fe(e);
554
554
  }
555
555
  //#endregion
556
556
  //#region src/apis/helpers.ts
557
- function Fe(e) {
557
+ function Ie(e) {
558
558
  return e.status >= 200 && e.status < 300 && e.data.code === "1";
559
559
  }
560
560
  //#endregion
561
561
  //#region src/apis/hosts.ts
562
- function Ie() {
562
+ function Le() {
563
563
  let e = ue(), t;
564
564
  switch (e.env) {
565
565
  case "dev":
@@ -585,14 +585,14 @@ function Ie() {
585
585
  }
586
586
  //#endregion
587
587
  //#region src/utils/proxy.ts
588
- function Le(e) {
588
+ function Re(e) {
589
589
  return e || process.env.HTTP_PROXY || process.env.http_proxy || process.env.HTTPS_PROXY || process.env.https_proxy;
590
590
  }
591
- function Re(e, t) {
591
+ function ze(e, t) {
592
592
  return !t && !!e;
593
593
  }
594
- function ze(e, t) {
595
- let n = Le(t);
594
+ function Be(e, t) {
595
+ let n = Re(t);
596
596
  if (n) {
597
597
  if (e.startsWith("wss://")) return new l(n);
598
598
  if (e.startsWith("ws://")) return new c(n);
@@ -600,18 +600,18 @@ function ze(e, t) {
600
600
  }
601
601
  //#endregion
602
602
  //#region src/apis/http-client.ts
603
- var Be = class extends Error {
603
+ var Ve = class extends Error {
604
604
  constructor(e, t, n) {
605
605
  super(n), this.status = e, this.data = t, this.name = "HttpError";
606
606
  }
607
- }, Ve = class {
607
+ }, He = class {
608
608
  baseUrl;
609
609
  defaultHeaders;
610
610
  defaultTimeout;
611
611
  proxyAgent;
612
612
  constructor(e, t) {
613
613
  this.baseUrl = e.replace(/\/$/, ""), this.defaultHeaders = t?.defaultHeaders || {}, this.defaultTimeout = t?.defaultTimeout || 3e4;
614
- let n = Le(t?.proxy);
614
+ let n = Re(t?.proxy);
615
615
  n && (this.proxyAgent = new o(n));
616
616
  }
617
617
  async request(e) {
@@ -632,7 +632,7 @@ var Be = class extends Error {
632
632
  let l;
633
633
  r != null && (l = typeof r == "string" ? r : JSON.stringify(r));
634
634
  try {
635
- let n = Re(Le(), e.disableProxy) && this.proxyAgent ? this.proxyAgent : void 0, r = await s(o, {
635
+ let n = ze(Re(), e.disableProxy) && this.proxyAgent ? this.proxyAgent : void 0, r = await s(o, {
636
636
  method: t,
637
637
  headers: c,
638
638
  body: l,
@@ -650,9 +650,9 @@ var Be = class extends Error {
650
650
  status: r.statusCode,
651
651
  headers: r.headers
652
652
  };
653
- throw new Be(r.statusCode, u, `HTTP request failed with status ${r.statusCode}`);
653
+ throw new Ve(r.statusCode, u, `HTTP request failed with status ${r.statusCode}`);
654
654
  } catch (e) {
655
- throw e instanceof Be ? e : D(e, "HTTP request failed");
655
+ throw e instanceof Ve ? e : D(e, "HTTP request failed");
656
656
  }
657
657
  }
658
658
  async get(e, t) {
@@ -690,14 +690,14 @@ var Be = class extends Error {
690
690
  method: "PATCH"
691
691
  });
692
692
  }
693
- }, He = class {
693
+ }, Ue = class {
694
694
  httpClient;
695
695
  constructor(e, t) {
696
- this.httpClient = new Ve(e, t);
696
+ this.httpClient = new He(e, t);
697
697
  }
698
698
  async registerDevice(e, t, n) {
699
699
  let r = {
700
- "x-trace-id": N(),
700
+ "x-trace-id": M(),
701
701
  "x-jwt-token": t.token,
702
702
  "x-device-id": e.deviceId
703
703
  }, i = {
@@ -717,7 +717,7 @@ var Be = class extends Error {
717
717
  }
718
718
  async logoutDevice(e, t) {
719
719
  let n = {
720
- "x-trace-id": N(),
720
+ "x-trace-id": M(),
721
721
  "x-jwt-token": t.token,
722
722
  "x-device-id": e.deviceId
723
723
  }, r = {
@@ -734,7 +734,7 @@ var Be = class extends Error {
734
734
  });
735
735
  }
736
736
  async exchangeToken(e, t) {
737
- let n = N(), r = {
737
+ let n = M(), r = {
738
738
  "Content-Type": "application/json",
739
739
  "x-device-id": e.deviceId,
740
740
  "x-trace-id": n
@@ -749,32 +749,32 @@ var Be = class extends Error {
749
749
  headers: r,
750
750
  timeout: 15e3
751
751
  });
752
- if (Fe(a) && a.data.data) return a.data.data;
752
+ if (Ie(a) && a.data.data) return a.data.data;
753
753
  throw Error(`failed to get token: ${JSON.stringify(a.data)}, traceId: ${n}`);
754
754
  }
755
755
  };
756
- function P() {
757
- let e = Ie();
758
- return new He(`https://${e.clawCloud}/aicloud/yoyo-claw-service`, e.grayTag ? { defaultHeaders: { "x-gray": e.grayTag } } : void 0);
756
+ function N() {
757
+ let e = Le();
758
+ return new Ue(`https://${e.clawCloud}/aicloud/yoyo-claw-service`, e.grayTag ? { defaultHeaders: { "x-gray": e.grayTag } } : void 0);
759
759
  }
760
760
  //#endregion
761
761
  //#region src/honor-auth/assets/favicon.png
762
- var Ue = "data:image/png;base64,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", We = "<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>", 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=\"M24.5 24.5L39.5 39.5M39.5 24.5L24.5 39.5\" stroke=\"white\" stroke-width=\"4.5\" stroke-linecap=\"round\"/></svg>", Ke = { favicon: "/favicon.png" };
763
- function F(e) {
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" };
763
+ function P(e) {
764
764
  return e.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\"", "&quot;").replaceAll("'", "&#39;");
765
765
  }
766
- function qe(e) {
767
- return !e || e.length === 0 ? "" : `<div class="details">${e.map((e) => `<div class="detail-item"><span class="detail-key">${F(e.key)}</span><span class="detail-value">${F(e.value)}</span></div>`).join("")}</div>`;
766
+ function Je(e) {
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>`;
768
768
  }
769
- function I(e) {
770
- let t = e.statusClass === "success" ? We : Ge;
769
+ function F(e) {
770
+ let t = e.statusClass === "success" ? Ge : Ke;
771
771
  return `<!doctype html>
772
772
  <html lang="zh-CN">
773
773
  <head>
774
774
  <meta charset="UTF-8" />
775
775
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
776
776
  <link rel="icon" type="image/png" href="data:image/png;base64,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" />
777
- <title>${F(e.pageTitle)}</title>
777
+ <title>${P(e.pageTitle)}</title>
778
778
  <style>
779
779
  :root {
780
780
  color-scheme: light;
@@ -958,10 +958,10 @@ function I(e) {
958
958
  <span>YOYOClaw</span>
959
959
  </div>
960
960
  <div class="icon-wrap ${e.statusClass}">${t}</div>
961
- <h1>${F(e.title)}</h1>
962
- ${qe(e.details)}
961
+ <h1>${P(e.title)}</h1>
962
+ ${Je(e.details)}
963
963
  <div class="footer">
964
- <p class="hint">${F(e.hintText)}</p>
964
+ <p class="hint">${P(e.hintText)}</p>
965
965
  <p class="caption">浏览器不会自动关闭当前页面,保留或稍后关闭都不影响登录结果。</p>
966
966
  </div>
967
967
  </main>
@@ -970,9 +970,9 @@ function I(e) {
970
970
  }
971
971
  //#endregion
972
972
  //#region src/honor-auth/callback-server.ts
973
- var Je = { "favicon.png": Ue };
974
- function Ye(e, t) {
975
- let n = Je[t];
973
+ var Ye = { "favicon.png": We };
974
+ function Xe(e, t) {
975
+ let n = Ye[t];
976
976
  if (!n) {
977
977
  e.writeHead(404), e.end();
978
978
  return;
@@ -983,7 +983,7 @@ function Ye(e, t) {
983
983
  "Cache-Control": "public, max-age=3600"
984
984
  }), e.end(i);
985
985
  }
986
- function Xe(e) {
986
+ function Ze(e) {
987
987
  return new Promise((t, n) => {
988
988
  let { port: r, timeout: i = 6e5, onCodeReceived: a, onError: o } = e, s = null, c = !1, l = !1, f = !1, p = () => {
989
989
  c || (c = !0, s && clearTimeout(s), g.close());
@@ -997,7 +997,7 @@ function Xe(e) {
997
997
  try {
998
998
  let n = new d(e.url || "", `http://localhost:${r}`);
999
999
  if (e.method !== "GET") {
1000
- t.writeHead(405, { "Content-Type": "text/html; charset=utf-8" }), t.end(I({
1000
+ t.writeHead(405, { "Content-Type": "text/html; charset=utf-8" }), t.end(F({
1001
1001
  pageTitle: "请求方式不支持",
1002
1002
  statusClass: "error",
1003
1003
  title: "不支持的请求方式",
@@ -1005,17 +1005,17 @@ function Xe(e) {
1005
1005
  }));
1006
1006
  return;
1007
1007
  }
1008
- if (n.pathname === "/favicon.ico" || n.pathname === Ke.favicon) {
1009
- Ye(t, "favicon.png");
1008
+ if (n.pathname === "/favicon.ico" || n.pathname === qe.favicon) {
1009
+ Xe(t, "favicon.png");
1010
1010
  return;
1011
1011
  }
1012
1012
  let i = n.searchParams.get("code") || "", o = n.searchParams.get("error") || "", s = n.searchParams.get("error_description") || n.searchParams.get("error_message") || "";
1013
- i && !l ? (l = !0, t.writeHead(200, { "Content-Type": "text/html; charset=utf-8" }), t.end(I({
1013
+ i && !l ? (l = !0, t.writeHead(200, { "Content-Type": "text/html; charset=utf-8" }), t.end(F({
1014
1014
  pageTitle: "授权成功",
1015
1015
  statusClass: "success",
1016
1016
  title: "登录已完成",
1017
1017
  hintText: "请返回 OpenClaw,登录流程会继续完成。"
1018
- })), h(), a(i)) : o && !l ? (t.writeHead(400, { "Content-Type": "text/html; charset=utf-8" }), t.end(I({
1018
+ })), h(), a(i)) : o && !l ? (t.writeHead(400, { "Content-Type": "text/html; charset=utf-8" }), t.end(F({
1019
1019
  pageTitle: "授权失败",
1020
1020
  statusClass: "error",
1021
1021
  title: "未能完成授权",
@@ -1029,12 +1029,12 @@ function Xe(e) {
1029
1029
  }] : []]
1030
1030
  })), setTimeout(() => {
1031
1031
  m(/* @__PURE__ */ Error(s ? `authorization failed: ${o} (${s})` : `authorization failed: ${o}`));
1032
- }, 120)) : l ? (t.writeHead(200, { "Content-Type": "text/html; charset=utf-8" }), t.end(I({
1032
+ }, 120)) : l ? (t.writeHead(200, { "Content-Type": "text/html; charset=utf-8" }), t.end(F({
1033
1033
  pageTitle: "登录已完成",
1034
1034
  statusClass: "success",
1035
1035
  title: "授权已经处理完成",
1036
1036
  hintText: "请返回 OpenClaw,登录流程会继续完成。"
1037
- }))) : (t.writeHead(400, { "Content-Type": "text/html; charset=utf-8" }), t.end(I({
1037
+ }))) : (t.writeHead(400, { "Content-Type": "text/html; charset=utf-8" }), t.end(F({
1038
1038
  pageTitle: "授权失败",
1039
1039
  statusClass: "error",
1040
1040
  title: "回调参数不完整",
@@ -1043,7 +1043,7 @@ function Xe(e) {
1043
1043
  m(/* @__PURE__ */ Error("authorization failed: no code in callback"));
1044
1044
  }, 120));
1045
1045
  } catch (e) {
1046
- console.error("authorize callback error:", e), t.writeHead(500, { "Content-Type": "text/html; charset=utf-8" }), t.end(I({
1046
+ console.error("authorize callback error:", e), t.writeHead(500, { "Content-Type": "text/html; charset=utf-8" }), t.end(F({
1047
1047
  pageTitle: "服务异常",
1048
1048
  statusClass: "error",
1049
1049
  title: "回调服务出现异常",
@@ -1066,7 +1066,7 @@ function Xe(e) {
1066
1066
  }
1067
1067
  //#endregion
1068
1068
  //#region src/honor-auth/config.ts
1069
- var Ze = {
1069
+ var Qe = {
1070
1070
  authHost: "https://hnoauth-login-test-drcn.cloud.honor.com",
1071
1071
  clientId: "221641491",
1072
1072
  redirectUri: "http://127.0.0.1:8081/deepLink",
@@ -1074,7 +1074,7 @@ var Ze = {
1074
1074
  scope: "openid profile",
1075
1075
  reqClientType: "110",
1076
1076
  loginChannel: "99011000"
1077
- }, Qe = {
1077
+ }, $e = {
1078
1078
  authHost: "https://hnoauth-login-drcn.cloud.honor.com",
1079
1079
  clientId: "221000597",
1080
1080
  redirectUri: "http://127.0.0.1:8081/deepLink",
@@ -1083,15 +1083,15 @@ var Ze = {
1083
1083
  reqClientType: "110",
1084
1084
  loginChannel: "99011000"
1085
1085
  };
1086
- function $e(e) {
1086
+ function et(e) {
1087
1087
  return {
1088
- ...ue()?.env === "production" ? Qe : Ze,
1088
+ ...ue()?.env === "production" ? $e : Qe,
1089
1089
  ...e
1090
1090
  };
1091
1091
  }
1092
1092
  //#endregion
1093
1093
  //#region src/honor-auth/honor-auth-client.ts
1094
- var et = class {
1094
+ var tt = class {
1095
1095
  config;
1096
1096
  constructor(e) {
1097
1097
  this.config = e;
@@ -1135,48 +1135,48 @@ var et = class {
1135
1135
  return { ...this.config };
1136
1136
  }
1137
1137
  };
1138
- function tt(e) {
1139
- return new et(e);
1138
+ function nt(e) {
1139
+ return new tt(e);
1140
1140
  }
1141
1141
  //#endregion
1142
1142
  //#region src/utils/fs-safe.ts
1143
- var L = class extends Error {
1143
+ var I = class extends Error {
1144
1144
  code;
1145
1145
  constructor(e, t, n) {
1146
1146
  super(t, n), this.code = e, this.name = "SafeFsError";
1147
1147
  }
1148
- }, nt = new Set(["ENOENT", "ENOTDIR"]), rt = new Set([
1148
+ }, rt = new Set(["ENOENT", "ENOTDIR"]), it = new Set([
1149
1149
  "ELOOP",
1150
1150
  "EINVAL",
1151
1151
  "ENOTSUP"
1152
1152
  ]);
1153
- function it(e) {
1153
+ function at(e) {
1154
1154
  return !!(e && typeof e == "object" && "code" in e);
1155
1155
  }
1156
- function R(e) {
1157
- return it(e) && typeof e.code == "string" && nt.has(e.code);
1158
- }
1159
- function at(e) {
1160
- return it(e) && typeof e.code == "string" && rt.has(e.code);
1156
+ function L(e) {
1157
+ return at(e) && typeof e.code == "string" && rt.has(e.code);
1161
1158
  }
1162
1159
  function ot(e) {
1160
+ return at(e) && typeof e.code == "string" && it.has(e.code);
1161
+ }
1162
+ function st(e) {
1163
1163
  let t = r.win32.normalize(e);
1164
1164
  return t.startsWith("\\\\?\\") && (t = t.slice(4), t.toUpperCase().startsWith("UNC\\") && (t = `\\\\${t.slice(4)}`)), t.replaceAll("/", "\\").toLowerCase();
1165
1165
  }
1166
- function z(e, t) {
1166
+ function R(e, t) {
1167
1167
  let n = r.resolve(e), i = r.resolve(t);
1168
1168
  if (process.platform === "win32") {
1169
- let e = ot(n), t = ot(i), a = r.win32.relative(e, t);
1169
+ let e = st(n), t = st(i), a = r.win32.relative(e, t);
1170
1170
  return a === "" || !a.startsWith("..") && !r.win32.isAbsolute(a);
1171
1171
  }
1172
1172
  let a = r.relative(n, i);
1173
1173
  return a === "" || !a.startsWith("..") && !r.isAbsolute(a);
1174
1174
  }
1175
- function st(e) {
1175
+ function ct(e) {
1176
1176
  return e === 0 || e === 0n;
1177
1177
  }
1178
- function ct(e, t, n = process.platform) {
1179
- return e.ino === t.ino ? e.dev === t.dev ? !0 : n === "win32" && (st(e.dev) || st(t.dev)) : !1;
1178
+ function z(e, t, n = process.platform) {
1179
+ return e.ino === t.ino ? e.dev === t.dev ? !0 : n === "win32" && (ct(e.dev) || ct(t.dev)) : !1;
1180
1180
  }
1181
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
1182
  function mt(e, t) {
@@ -1189,10 +1189,10 @@ async function ht(e) {
1189
1189
  try {
1190
1190
  t = await v.realpath(e.rootDir);
1191
1191
  } catch (e) {
1192
- throw R(e) ? new L("not-found", "root dir not found") : e;
1192
+ throw L(e) ? new I("not-found", "root dir not found") : e;
1193
1193
  }
1194
1194
  let n = pt(t), i = mt(e.relativePath), a = r.resolve(n, i);
1195
- if (!z(n, a)) throw new L("outside-root", "file is outside workspace root");
1195
+ if (!R(n, a)) throw new I("outside-root", "file is outside workspace root");
1196
1196
  return {
1197
1197
  rootReal: t,
1198
1198
  rootWithSep: n,
@@ -1201,39 +1201,39 @@ async function ht(e) {
1201
1201
  }
1202
1202
  async function gt(e, t) {
1203
1203
  try {
1204
- if ((await v.lstat(e)).isDirectory()) throw new L("not-file", "not a file");
1204
+ if ((await v.lstat(e)).isDirectory()) throw new I("not-file", "not a file");
1205
1205
  } catch (e) {
1206
- if (e instanceof L) throw e;
1206
+ if (e instanceof I) throw e;
1207
1207
  }
1208
1208
  let n;
1209
1209
  try {
1210
1210
  n = await v.open(e, ut);
1211
1211
  } catch (e) {
1212
- throw R(e) ? new L("not-found", "file not found") : at(e) ? new L("symlink", "symlink open blocked", { cause: e }) : it(e) && e.code === "EISDIR" ? new L("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;
1213
1213
  }
1214
1214
  try {
1215
1215
  let [r, i] = await Promise.all([n.stat(), v.lstat(e)]);
1216
- if (i.isSymbolicLink()) throw new L("symlink", "symlink not allowed");
1217
- if (!r.isFile()) throw new L("not-file", "not a file");
1218
- if (t?.rejectHardlinks && r.nlink > 1) throw new L("invalid-path", "hardlinked path not allowed");
1219
- if (process.platform !== "win32" && !ct(r, i)) throw new L("path-mismatch", "path changed during read");
1216
+ if (i.isSymbolicLink()) throw new I("symlink", "symlink not allowed");
1217
+ if (!r.isFile()) throw new I("not-file", "not a file");
1218
+ if (t?.rejectHardlinks && r.nlink > 1) throw new I("invalid-path", "hardlinked path not allowed");
1219
+ if (process.platform !== "win32" && !z(r, i)) throw new I("path-mismatch", "path changed during read");
1220
1220
  let a = await v.realpath(e), o = await v.stat(a);
1221
- if (t?.rejectHardlinks && o.nlink > 1) throw new L("invalid-path", "hardlinked path not allowed");
1222
- if (process.platform !== "win32" && !ct(r, o)) throw new L("path-mismatch", "path mismatch");
1221
+ if (t?.rejectHardlinks && o.nlink > 1) throw new I("invalid-path", "hardlinked path not allowed");
1222
+ if (process.platform !== "win32" && !z(r, o)) throw new I("path-mismatch", "path mismatch");
1223
1223
  return {
1224
1224
  handle: n,
1225
1225
  realPath: a,
1226
1226
  stat: r
1227
1227
  };
1228
1228
  } catch (e) {
1229
- throw await n.close().catch(() => {}), e instanceof L ? e : R(e) ? new L("not-found", "file not found") : e;
1229
+ throw await n.close().catch(() => {}), e instanceof I ? e : L(e) ? new I("not-found", "file not found") : e;
1230
1230
  }
1231
1231
  }
1232
1232
  async function _t(e) {
1233
1233
  let { rootWithSep: t, resolved: n } = await ht(e), r = await gt(n);
1234
- if (!z(t, r.realPath)) throw await r.handle.close().catch(() => {}), new L("outside-root", "file is outside workspace root");
1234
+ if (!R(t, r.realPath)) throw await r.handle.close().catch(() => {}), new I("outside-root", "file is outside workspace root");
1235
1235
  try {
1236
- if (e.maxBytes !== void 0 && r.stat.size > e.maxBytes) throw new L("too-large", `file exceeds limit of ${e.maxBytes} bytes (got ${r.stat.size})`);
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})`);
1237
1237
  return {
1238
1238
  buffer: await r.handle.readFile(),
1239
1239
  realPath: r.realPath,
@@ -1258,8 +1258,8 @@ async function yt(e) {
1258
1258
  async function bt(e) {
1259
1259
  let t = pt(await v.realpath(e.rootDir)), n = await gt(e.targetPath, { rejectHardlinks: !0 });
1260
1260
  try {
1261
- if (process.platform !== "win32" && !ct(n.stat, e.expectedStat)) throw new L("path-mismatch", "path changed during write");
1262
- if (!z(t, n.realPath)) throw new L("outside-root", "file is outside workspace root");
1261
+ if (process.platform !== "win32" && !z(n.stat, e.expectedStat)) throw new I("path-mismatch", "path changed during write");
1262
+ if (!R(t, n.realPath)) throw new I("outside-root", "file is outside workspace root");
1263
1263
  } finally {
1264
1264
  await n.handle.close().catch(() => {});
1265
1265
  }
@@ -1270,13 +1270,13 @@ async function B(e) {
1270
1270
  let i = n, a = !1;
1271
1271
  try {
1272
1272
  let e = await v.realpath(n);
1273
- if (!z(t, e)) throw new L("outside-root", "file is outside workspace root");
1273
+ if (!R(t, e)) throw new I("outside-root", "file is outside workspace root");
1274
1274
  i = e, a = !0;
1275
1275
  } catch (e) {
1276
- if (e instanceof L || !R(e)) throw e;
1276
+ if (e instanceof I || !L(e)) throw e;
1277
1277
  }
1278
1278
  let o = e.mode === "append";
1279
- if (o && !a) throw new L("not-found", "cannot append to non-existent file");
1279
+ if (o && !a) throw new I("not-found", "cannot append to non-existent file");
1280
1280
  return o ? await xt({
1281
1281
  ioPath: i,
1282
1282
  rootWithSep: t,
@@ -1298,18 +1298,18 @@ async function xt(e) {
1298
1298
  try {
1299
1299
  t = await v.open(e.ioPath, ft);
1300
1300
  } catch (e) {
1301
- throw R(e) ? new L("not-found", "file not found") : at(e) ? new L("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;
1302
1302
  }
1303
1303
  try {
1304
1304
  let n = await t.stat();
1305
- if (!n.isFile()) throw new L("not-file", "path is not a regular file");
1305
+ if (!n.isFile()) throw new I("not-file", "path is not a regular file");
1306
1306
  let r = await v.lstat(e.ioPath);
1307
- if (r.isSymbolicLink()) throw new L("symlink", "path is a symlink");
1308
- if (!ct(n, r)) throw new L("path-mismatch", "path changed during write");
1307
+ if (r.isSymbolicLink()) throw new I("symlink", "path is a symlink");
1308
+ if (!z(n, r)) throw new I("path-mismatch", "path changed during write");
1309
1309
  let i = await v.realpath(e.ioPath);
1310
- if (!z(e.rootWithSep, i)) throw new L("outside-root", "file is outside workspace root");
1310
+ if (!R(e.rootWithSep, i)) throw new I("outside-root", "file is outside workspace root");
1311
1311
  let a = typeof e.data == "string" ? Buffer.byteLength(e.data, e.encoding ?? "utf8") : e.data.length;
1312
- if (e.maxBytes !== void 0 && n.size + a > e.maxBytes) throw new L("too-large", `file would exceed limit of ${e.maxBytes} bytes`);
1312
+ if (e.maxBytes !== void 0 && n.size + a > e.maxBytes) throw new I("too-large", `file would exceed limit of ${e.maxBytes} bytes`);
1313
1313
  return typeof e.data == "string" ? await t.writeFile(e.data, e.encoding ?? "utf8") : await t.writeFile(e.data), {
1314
1314
  realPath: i,
1315
1315
  bytesWritten: a,
@@ -1337,7 +1337,7 @@ async function St(e) {
1337
1337
  expectedStat: r
1338
1338
  });
1339
1339
  } catch (e) {
1340
- throw e instanceof L ? e : new L("write-failed", "atomic write verification failed", { cause: e });
1340
+ throw e instanceof I ? e : new I("write-failed", "atomic write verification failed", { cause: e });
1341
1341
  }
1342
1342
  return {
1343
1343
  realPath: n,
@@ -1418,7 +1418,7 @@ async function Pt(e) {
1418
1418
  ...n,
1419
1419
  version: n?.version || Dt.NEW
1420
1420
  };
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), 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({
1422
1422
  rootDir: t,
1423
1423
  relativePath: jt(),
1424
1424
  data: JSON.stringify(r, null, 2),
@@ -1430,30 +1430,45 @@ function Ft() {
1430
1430
  return { version: Dt.NEW };
1431
1431
  }
1432
1432
  //#endregion
1433
- //#region src/modules/device/registry.ts
1434
- async function It(e, t) {
1435
- if (!e || !t) throw Error("设备信息或用户信息缺失");
1436
- let n = M().getGatewayAuthConfig(), r = await P().registerDevice(e, t, n);
1437
- if (!Fe(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;
1438
1453
  }
1439
1454
  //#endregion
1440
1455
  //#region src/modules/device/identity.ts
1441
1456
  var H = Buffer.from("302a300506032b6570032100", "hex");
1442
- function Lt(e) {
1457
+ function Vt(e) {
1443
1458
  return e.toString("base64").replaceAll("+", "-").replaceAll("/", "_").replace(/=+$/g, "");
1444
1459
  }
1445
- function Rt(e) {
1460
+ function Ht(e) {
1446
1461
  let t = h.createPublicKey(e).export({
1447
1462
  type: "spki",
1448
1463
  format: "der"
1449
1464
  });
1450
1465
  return t.length === H.length + 32 && t.subarray(0, H.length).equals(H) ? t.subarray(H.length) : t;
1451
1466
  }
1452
- function zt(e) {
1453
- let t = Rt(e);
1467
+ function Ut(e) {
1468
+ let t = Ht(e);
1454
1469
  return h.createHash("sha256").update(t).digest("hex");
1455
1470
  }
1456
- async function Bt() {
1471
+ async function Wt() {
1457
1472
  let { publicKey: e, privateKey: t } = h.generateKeyPairSync("ed25519"), n = e.export({
1458
1473
  type: "spki",
1459
1474
  format: "pem"
@@ -1462,16 +1477,16 @@ async function Bt() {
1462
1477
  format: "pem"
1463
1478
  }).toString();
1464
1479
  return {
1465
- deviceId: zt(n),
1480
+ deviceId: Ut(n),
1466
1481
  publicKeyPem: n,
1467
1482
  privateKeyPem: r,
1468
1483
  createdAtMs: Date.now()
1469
1484
  };
1470
1485
  }
1471
- async function Vt() {
1486
+ async function Gt() {
1472
1487
  let e = await Nt();
1473
1488
  if (e && e.deviceId && e.publicKeyPem && e.privateKeyPem && e.createdAtMs) {
1474
- let t = e.deviceId, n = zt(e.publicKeyPem);
1489
+ let t = e.deviceId, n = Ut(e.publicKeyPem);
1475
1490
  return n && n !== e.deviceId && (await Pt({
1476
1491
  ...e,
1477
1492
  deviceId: n
@@ -1483,29 +1498,47 @@ async function Vt() {
1483
1498
  createdAtMs: e.createdAtMs
1484
1499
  };
1485
1500
  }
1486
- let t = await Bt();
1501
+ let t = await Wt();
1487
1502
  return await Pt(t), t;
1488
1503
  }
1489
- function Ht(e, t) {
1504
+ async function Kt() {
1505
+ return (await Nt())?.gatewayAuthMd5;
1506
+ }
1507
+ function qt(e, t) {
1490
1508
  let n = h.createPrivateKey(e);
1491
- return Lt(h.sign(null, Buffer.from(t, "utf8"), n));
1509
+ return Vt(h.sign(null, Buffer.from(t, "utf8"), n));
1492
1510
  }
1493
- function Ut(e) {
1494
- return Lt(Rt(e));
1511
+ function Jt(e) {
1512
+ return Vt(Ht(e));
1513
+ }
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");
1495
1528
  }
1496
1529
  //#endregion
1497
1530
  //#region src/modules/device/providers/linux.ts
1498
- function Wt(e) {
1531
+ function Zt(e) {
1499
1532
  try {
1500
1533
  return b.existsSync(e) ? b.readFileSync(e, "utf-8").trim() : "";
1501
1534
  } catch {
1502
1535
  return "";
1503
1536
  }
1504
1537
  }
1505
- var Gt = class {
1538
+ var Qt = class {
1506
1539
  async ensureInitialized() {}
1507
1540
  getLinuxDeviceModel() {
1508
- return Wt("/sys/class/dmi/id/product_name") || Wt("/sys/class/dmi/id/board_name") || `${S.cpus()[0]?.model || "Linux PC"} (${S.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()})`;
1509
1542
  }
1510
1543
  getLinuxDeviceName() {
1511
1544
  return `${S.hostname()} (${this.getLinuxDeviceModel()})`;
@@ -1522,7 +1555,7 @@ var Gt = class {
1522
1555
  getDeviceType() {
1523
1556
  return "pc";
1524
1557
  }
1525
- }, Kt = class {
1558
+ }, $t = class {
1526
1559
  async ensureInitialized() {}
1527
1560
  getMacOSDeviceModel() {
1528
1561
  return `${S.cpus()[0]?.model || "Mac"} (${S.machine?.() || S.arch()})`;
@@ -1542,7 +1575,7 @@ var Gt = class {
1542
1575
  getDeviceType() {
1543
1576
  return "pc";
1544
1577
  }
1545
- }, qt = te(ee), Jt = class {
1578
+ }, en = te(ee), tn = class {
1546
1579
  cache = {
1547
1580
  brand: "",
1548
1581
  model: "",
@@ -1557,7 +1590,7 @@ var Gt = class {
1557
1590
  }
1558
1591
  async execAndroidCmd(e, t = 5e3) {
1559
1592
  try {
1560
- let { stdout: n } = await qt("/system/bin/sh", ["-c", e], {
1593
+ let { stdout: n } = await en("/system/bin/sh", ["-c", e], {
1561
1594
  timeout: t,
1562
1595
  encoding: "utf-8"
1563
1596
  });
@@ -1619,7 +1652,7 @@ function U(e, t, n) {
1619
1652
  }
1620
1653
  });
1621
1654
  }
1622
- function Yt(e, t) {
1655
+ function nn(e, t) {
1623
1656
  return new Promise((n) => {
1624
1657
  try {
1625
1658
  new C({
@@ -1633,7 +1666,7 @@ function Yt(e, t) {
1633
1666
  }
1634
1667
  });
1635
1668
  }
1636
- var Xt = class {
1669
+ var rn = class {
1637
1670
  cache = { deviceBrand: "" };
1638
1671
  initPromise;
1639
1672
  constructor() {
@@ -1655,7 +1688,7 @@ var Xt = class {
1655
1688
  t,
1656
1689
  n,
1657
1690
  r
1658
- ].find((e) => e && e.toLowerCase().includes("honor")) || await Yt(C.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 = "";
1659
1692
  } catch {
1660
1693
  this.cache.deviceBrand = "";
1661
1694
  }
@@ -1681,7 +1714,7 @@ var Xt = class {
1681
1714
  };
1682
1715
  //#endregion
1683
1716
  //#region src/modules/device/providers/index.ts
1684
- function Zt() {
1717
+ function an() {
1685
1718
  let t = process.platform;
1686
1719
  if (t === "win32") return "windows";
1687
1720
  if (t === "linux") {
@@ -1692,21 +1725,21 @@ function Zt() {
1692
1725
  }
1693
1726
  return t === "darwin" ? "macos" : "linux";
1694
1727
  }
1695
- function Qt() {
1696
- switch (Zt()) {
1697
- case "pad": return new Jt();
1698
- case "windows": return new Xt();
1699
- case "linux": return new Gt();
1700
- case "macos": return new Kt();
1701
- default: return new Gt();
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();
1702
1735
  }
1703
1736
  }
1704
1737
  //#endregion
1705
1738
  //#region src/modules/device/device-info.ts
1706
1739
  async function W() {
1707
- let e = Qt(), t = M();
1740
+ let e = on(), t = j();
1708
1741
  await e.ensureInitialized();
1709
- let n = await Vt(), r = n.legacyDeviceId ?? n.deviceId, i = pe(), a = t.getDeviceConfig();
1742
+ let n = await Gt(), r = n.legacyDeviceId ?? n.deviceId, i = pe(), a = t.getDeviceConfig();
1710
1743
  O().debug?.(`[yoyoclaw-device] env: ${JSON.stringify(i)}, config: ${JSON.stringify(a)}`);
1711
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 = {
1712
1745
  deviceId: r,
@@ -1735,20 +1768,20 @@ async function W() {
1735
1768
  }
1736
1769
  //#endregion
1737
1770
  //#region src/modules/device/helpers.ts
1738
- function $t(e) {
1771
+ function sn(e) {
1739
1772
  return typeof e == "string" && e.trim() || "";
1740
1773
  }
1741
- function en(e) {
1774
+ function cn(e) {
1742
1775
  return e.replace(/[A-Z]/g, (e) => String.fromCharCode(e.charCodeAt(0) + 32));
1743
1776
  }
1744
- function tn(e) {
1745
- let t = $t(e);
1746
- return t ? en(t) : "";
1777
+ function ln(e) {
1778
+ let t = sn(e);
1779
+ return t ? cn(t) : "";
1747
1780
  }
1748
1781
  //#endregion
1749
1782
  //#region src/modules/device/auth.ts
1750
- function nn(e) {
1751
- let t = e.scopes.join(","), n = e.token ?? "", r = tn(e.platform), i = tn(e.deviceFamily);
1783
+ function un(e) {
1784
+ let t = e.scopes.join(","), n = e.token ?? "", r = ln(e.platform), i = ln(e.deviceFamily);
1752
1785
  return [
1753
1786
  "v3",
1754
1787
  e.deviceId,
@@ -1765,10 +1798,10 @@ function nn(e) {
1765
1798
  }
1766
1799
  //#endregion
1767
1800
  //#region src/modules/device/credential-builder.ts
1768
- function rn(e) {
1801
+ function dn(e) {
1769
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;
1770
1803
  if (!t) return;
1771
- let d = nn({
1804
+ let d = un({
1772
1805
  deviceId: t.deviceId,
1773
1806
  clientId: n,
1774
1807
  clientMode: r,
@@ -1779,10 +1812,10 @@ function rn(e) {
1779
1812
  nonce: l,
1780
1813
  platform: o,
1781
1814
  deviceFamily: s
1782
- }), f = Ht(t.privateKeyPem, d);
1815
+ }), f = qt(t.privateKeyPem, d);
1783
1816
  return {
1784
1817
  id: t.deviceId,
1785
- publicKey: Ut(t.publicKeyPem),
1818
+ publicKey: Jt(t.publicKeyPem),
1786
1819
  signature: f,
1787
1820
  signedAt: u,
1788
1821
  nonce: l
@@ -1790,12 +1823,12 @@ function rn(e) {
1790
1823
  }
1791
1824
  //#endregion
1792
1825
  //#region src/honor-auth/token-manager.ts
1793
- async function an(e, t = !0) {
1826
+ async function fn(e, t = !0) {
1794
1827
  try {
1795
- let n = M(), r = e.jwtToken;
1828
+ let n = j(), r = e.jwtToken;
1796
1829
  if (!r && e.userId) {
1797
1830
  let t = e.deviceInfo || await W();
1798
- r = (await P().exchangeToken(t, { userId: e.userId })).jwtToken;
1831
+ r = (await N().exchangeToken(t, { userId: e.userId })).jwtToken;
1799
1832
  }
1800
1833
  if (!r) throw Error("no token available");
1801
1834
  if (!t) return O().info("💾 token got, but not to save"), { token: r };
@@ -1809,46 +1842,46 @@ async function an(e, t = !0) {
1809
1842
  throw D(e, "保存Token失败");
1810
1843
  }
1811
1844
  }
1812
- async function on(e) {
1813
- let t = await W(), n = await P().exchangeToken(t, { userId: e });
1845
+ async function pn(e) {
1846
+ let t = await W(), n = await N().exchangeToken(t, { userId: e });
1814
1847
  if (n.jwtToken) {
1815
1848
  let e = Math.floor(Date.now() / 1e3) + 720 * 60 * 60;
1816
- return await M().updateUserConfig({
1849
+ return await j().updateUserConfig({
1817
1850
  token: n.jwtToken,
1818
1851
  userId: void 0,
1819
1852
  userName: void 0,
1820
1853
  expired: e
1821
1854
  }), { token: n.jwtToken };
1822
1855
  }
1823
- return await M().clearUserConfig(), null;
1856
+ return await j().clearUserConfig(), null;
1824
1857
  }
1825
- async function sn() {
1858
+ async function mn() {
1826
1859
  let e = O();
1827
1860
  try {
1828
- let t = M(), n = t.getUserConfig(), r = me();
1829
- 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 on(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);
1830
1863
  if (n?.token) {
1831
1864
  if (!n.expired || n.expired >= Math.floor(Date.now() / 1e3)) return { token: n.token };
1832
1865
  e.debug?.("[yoyoclaw-auth] cached token expired");
1833
1866
  }
1834
- return r ? (e.debug?.("[yoyoclaw-auth] token expired, using env userId to exchange token"), await on(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);
1835
1868
  } catch (e) {
1836
1869
  throw D(e, "加载Token失败");
1837
1870
  }
1838
1871
  }
1839
- async function cn() {
1872
+ async function hn() {
1840
1873
  try {
1841
- await M().clearUserConfig(), O().info("[yoyoclaw-auth] token cleared");
1874
+ await j().clearUserConfig(), O().info("[yoyoclaw-auth] token cleared");
1842
1875
  } catch (e) {
1843
1876
  throw D(e, "清除Token失败");
1844
1877
  }
1845
1878
  }
1846
1879
  //#endregion
1847
1880
  //#region src/honor-auth/browser.ts
1848
- async function ln(e, t) {
1849
- let n = $e(t);
1881
+ async function gn(e, t) {
1882
+ let n = et(t);
1850
1883
  O().debug?.("Starting Honor login flow...");
1851
- let r = tt(n), a = r.generatePKCEParams(), o = r.buildAuthUrl(a), s = null, c = Xe({
1884
+ let r = nt(n), a = r.generatePKCEParams(), o = r.buildAuthUrl(a), s = null, c = Ze({
1852
1885
  port: n.localPort,
1853
1886
  timeout: 6e5,
1854
1887
  onCodeReceived: (e) => {
@@ -1871,36 +1904,36 @@ async function ln(e, t) {
1871
1904
  }
1872
1905
  if (!s) throw Error("no auth code");
1873
1906
  try {
1874
- let t = await P().exchangeToken(e, {
1907
+ let t = await N().exchangeToken(e, {
1875
1908
  code: s,
1876
1909
  authConfig: n
1877
1910
  });
1878
1911
  if (!t?.jwtToken) throw Error("failed to get jwt token");
1879
- return await an({ jwtToken: t.jwtToken }, n.saveToFile !== !1), { token: t.jwtToken };
1912
+ return await fn({ jwtToken: t.jwtToken }, n.saveToFile !== !1), { token: t.jwtToken };
1880
1913
  } catch (e) {
1881
1914
  throw D(e, "get token failed");
1882
1915
  }
1883
1916
  }
1884
1917
  //#endregion
1885
1918
  //#region src/honor-auth/cloud.ts
1886
- async function un() {
1887
- let e = M().getUserConfig();
1919
+ async function _n() {
1920
+ let e = j().getUserConfig();
1888
1921
  if (!e?.token) throw Error("⚠️ Not logged in");
1889
- let t = await W(), n = P(), r = { token: e.token }, i = await n.logoutDevice(t, r);
1890
- if (!Fe(i)) throw Error(i.data?.cnMessage || "Unknown error");
1891
- await cn();
1922
+ let t = await W(), n = N(), r = { token: e.token }, i = await n.logoutDevice(t, r);
1923
+ if (!Ie(i)) throw Error(i.data?.cnMessage || "Unknown error");
1924
+ await hn();
1892
1925
  }
1893
1926
  //#endregion
1894
1927
  //#region src/modules/login/impl.ts
1895
- async function dn(e = {}) {
1928
+ async function vn(e = {}) {
1896
1929
  let { userId: t } = e, n = O();
1897
1930
  try {
1898
1931
  n.debug?.("Starting login process...");
1899
1932
  let e = await W(), r;
1900
- t ? (r = await an({
1933
+ t ? (r = await fn({
1901
1934
  userId: t,
1902
1935
  deviceInfo: e
1903
- }), n.debug?.("Using provided user info"), n.debug?.(`User: ${t}`), n.debug?.(`Device ID: ${e?.deviceId}`)) : (n.debug?.("Starting OAuth2 authentication..."), r = await ln(e), n.debug?.("OAuth2 authentication successful"), n.debug?.(`Device ID: ${e?.deviceId}`)), console.log("📡 Registering device to Claw Cloud..."), await It(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");
1904
1937
  } catch (e) {
1905
1938
  let t = e instanceof Error ? e.message : String(e);
1906
1939
  console.error("❌ Login process failed:", t);
@@ -1908,11 +1941,11 @@ async function dn(e = {}) {
1908
1941
  }
1909
1942
  //#endregion
1910
1943
  //#region src/commands/login/impl.ts
1911
- function fn(e, t) {
1944
+ function yn(e, t) {
1912
1945
  let n = t.command("login").description("login to yoyoclaw and register devices");
1913
1946
  return n = n.option("-u, --uid <userId>", "user ID for direct login").option("--token <token>", "token for direct login").action(async (t) => {
1914
1947
  let { uid: n, token: r } = t;
1915
- e.logger.debug?.("honor login CLI command called"), await dn({
1948
+ e.logger.debug?.("honor login CLI command called"), await vn({
1916
1949
  userId: n,
1917
1950
  token: r
1918
1951
  });
@@ -1920,11 +1953,11 @@ function fn(e, t) {
1920
1953
  }
1921
1954
  //#endregion
1922
1955
  //#region src/commands/logout/impl.ts
1923
- function pn(e, t) {
1956
+ function bn(e, t) {
1924
1957
  return t.command("logout").description("Logout and clear user configuration").action(async () => {
1925
1958
  e.logger.info("logout CLI command called");
1926
1959
  try {
1927
- await un(), 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");
1928
1961
  } catch (e) {
1929
1962
  let t = e instanceof Error ? e.message : String(e);
1930
1963
  console.error("❌ Logout failed:", t);
@@ -1935,7 +1968,7 @@ function pn(e, t) {
1935
1968
  //#region src/services/connection/status-tracker/events.ts
1936
1969
  var G = /* @__PURE__ */ function(e) {
1937
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;
1938
- }({}), mn = class {
1971
+ }({}), xn = class {
1939
1972
  statusFilePath;
1940
1973
  statusDir;
1941
1974
  constructor() {
@@ -1980,7 +2013,7 @@ var G = /* @__PURE__ */ function(e) {
1980
2013
  };
1981
2014
  //#endregion
1982
2015
  //#region src/services/connection/status-tracker/types.ts
1983
- function hn() {
2016
+ function Sn() {
1984
2017
  return {
1985
2018
  status: "idle",
1986
2019
  updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
@@ -2015,13 +2048,13 @@ function hn() {
2015
2048
  }
2016
2049
  //#endregion
2017
2050
  //#region src/services/connection/status-tracker/tracker.ts
2018
- var gn = class {
2051
+ var Cn = class {
2019
2052
  currentStatus;
2020
2053
  storage;
2021
2054
  autoSave;
2022
2055
  saveTimer;
2023
2056
  constructor(e = !0) {
2024
- this.currentStatus = hn(), this.storage = new mn(), this.autoSave = e, this.saveTimer = null;
2057
+ this.currentStatus = Sn(), this.storage = new xn(), this.autoSave = e, this.saveTimer = null;
2025
2058
  }
2026
2059
  async handleEvent(e) {
2027
2060
  let { type: t, timestamp: n, data: r } = e;
@@ -2072,7 +2105,7 @@ var gn = class {
2072
2105
  let e = await this.storage.load();
2073
2106
  if (e) {
2074
2107
  let t = e.cloudSocket, n = e.history;
2075
- this.currentStatus = hn(), 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();
2076
2109
  }
2077
2110
  return this.getStatus();
2078
2111
  }
@@ -2080,7 +2113,7 @@ var gn = class {
2080
2113
  await this.storage.save(this.currentStatus);
2081
2114
  }
2082
2115
  async clearStatus() {
2083
- this.currentStatus = hn(), await this.storage.clear();
2116
+ this.currentStatus = Sn(), await this.storage.clear();
2084
2117
  }
2085
2118
  handleCloudSocketConnecting(e, t) {
2086
2119
  this.currentStatus.cloudSocket.url = e.url || "", this.currentStatus.cloudSocket.connected = !1;
@@ -2153,21 +2186,21 @@ var gn = class {
2153
2186
  };
2154
2187
  //#endregion
2155
2188
  //#region src/commands/status/index.ts
2156
- function _n(e, t) {
2189
+ function wn(e, t) {
2157
2190
  return t.command("status").description("Show YOYOClaw connection status").action(async () => {
2158
- if (e.logger.debug?.("YOYOClaw status CLI command called"), !await sn()) {
2191
+ if (e.logger.debug?.("YOYOClaw status CLI command called"), !await mn()) {
2159
2192
  console.log("❌ You need to login first. Please run: openclaw honor login");
2160
2193
  return;
2161
2194
  }
2162
- let t = await new mn().load(), n = null;
2195
+ let t = await new xn().load(), n = null;
2163
2196
  try {
2164
2197
  n = await W();
2165
2198
  } catch {}
2166
- let r = M().getEnvInfo();
2167
- vn(t, n, r);
2199
+ let r = j().getEnvInfo();
2200
+ Tn(t, n, r);
2168
2201
  });
2169
2202
  }
2170
- function vn(e, t, n) {
2203
+ function Tn(e, t, n) {
2171
2204
  if (!e) {
2172
2205
  console.log("\n❌ No status data available");
2173
2206
  return;
@@ -2177,7 +2210,7 @@ function vn(e, t, n) {
2177
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) {
2178
2211
  console.log(" ┌────────────────────────────┬────────────────────────────┬────────────┐"), console.log(" │ Session ID │ Hardware Device ID │ Connected │"), console.log(" ├────────────────────────────┼────────────────────────────┼────────────┤");
2179
2212
  for (let t of e.gateway.connections) {
2180
- let e = bn(t.sessionId, 26), n = bn(t.hardwareDeviceId, 26), r = yn(t.connectedAt);
2213
+ let e = Dn(t.sessionId, 26), n = Dn(t.hardwareDeviceId, 26), r = En(t.connectedAt);
2181
2214
  console.log(` │ ${e.padEnd(28)}│ ${n.padEnd(28)}│ ${r.padEnd(12)}│`);
2182
2215
  }
2183
2216
  console.log(" └────────────────────────────┴────────────────────────────┴────────────┘");
@@ -2185,7 +2218,7 @@ function vn(e, t, n) {
2185
2218
  if (console.log("\n📱 Physical Devices:"), console.log(` Unique devices: ${e.devices.uniqueHardwareDevices}`), e.devices.devices.length > 0) {
2186
2219
  console.log(" ┌────────────────────────────┬─────────┬────────────┐"), console.log(" │ Hardware Device ID │ Sessions │ Last Active│"), console.log(" ├────────────────────────────┼─────────┼────────────┤");
2187
2220
  for (let t of e.devices.devices) {
2188
- let e = bn(t.hardwareDeviceId, 26), n = String(t.sessions).padEnd(9), r = yn(t.lastActiveAt);
2221
+ let e = Dn(t.hardwareDeviceId, 26), n = String(t.sessions).padEnd(9), r = En(t.lastActiveAt);
2189
2222
  console.log(` │ ${e.padEnd(28)}│ ${n}│ ${r.padEnd(12)}│`);
2190
2223
  }
2191
2224
  console.log(" └────────────────────────────┴─────────┴────────────┘");
@@ -2196,37 +2229,37 @@ function K(e) {
2196
2229
  let t = new Date(e);
2197
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")}`;
2198
2231
  }
2199
- function yn(e) {
2232
+ function En(e) {
2200
2233
  let t = new Date(e);
2201
2234
  return `${String(t.getHours()).padStart(2, "0")}:${String(t.getMinutes()).padStart(2, "0")}:${String(t.getSeconds()).padStart(2, "0")}`;
2202
2235
  }
2203
- function bn(e, t) {
2236
+ function Dn(e, t) {
2204
2237
  return e.length <= t ? e : e.substring(0, t - 3) + "...";
2205
2238
  }
2206
2239
  //#endregion
2207
2240
  //#region src/commands/index.ts
2208
- function xn(e) {
2241
+ function On(e) {
2209
2242
  e.registerCli((t) => {
2210
2243
  let n = t.program.command("honor").description("Commands for honor yoyoclaw");
2211
- fn(e, n), _n(e, n), pn(e, n), oe() && Ne(e, n);
2244
+ yn(e, n), wn(e, n), bn(e, n), oe() && Pe(e, n);
2212
2245
  }, { commands: ["honor"] });
2213
2246
  }
2214
2247
  //#endregion
2215
2248
  //#region src/modules/prompt/index.ts
2216
- var Sn = " ## 手机控制规则\n\n - 涉及手机控制的任务时,必须强制调用 yoyo_phone_control 技能完成任务。\n - 手机是可直接操控的设备,你的职责是执行操作,而不是向用户解释如何操作。 \n - 多步骤任务需**按顺序多次调用**,不得合并。 \n", Cn = w.object({
2249
+ var kn = " ## 手机控制规则\n\n - 涉及手机控制的任务时,必须强制调用 yoyo_phone_control 技能完成任务。\n - 手机是可直接操控的设备,你的职责是执行操作,而不是向用户解释如何操作。 \n - 多步骤任务需**按顺序多次调用**,不得合并。 \n", An = w.object({
2217
2250
  token: w.string().optional(),
2218
2251
  expired: w.number().optional(),
2219
2252
  userId: w.string().optional(),
2220
2253
  userName: w.string().optional()
2221
- }), wn = w.object({
2254
+ }), jn = w.object({
2222
2255
  type: w.string().optional(),
2223
2256
  manufacture: w.string().optional(),
2224
2257
  brand: w.string().optional(),
2225
2258
  name: w.string().optional(),
2226
2259
  model: w.string().optional()
2227
- }), Tn = w.object({
2228
- user: Cn.optional(),
2229
- device: wn.optional(),
2260
+ }), Mn = w.object({
2261
+ user: An.optional(),
2262
+ device: jn.optional(),
2230
2263
  envInfo: w.object({
2231
2264
  env: w.enum([
2232
2265
  "dev",
@@ -2244,12 +2277,12 @@ var Sn = " ## 手机控制规则\n\n - 涉及手机控制的任务时,必须
2244
2277
  });
2245
2278
  //#endregion
2246
2279
  //#region src/utils/ws.ts
2247
- function En(e, t = "utf8") {
2280
+ function Nn(e, t = "utf8") {
2248
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);
2249
2282
  }
2250
2283
  //#endregion
2251
2284
  //#region src/gateway-client/client.ts
2252
- var Dn = class {
2285
+ var Pn = class {
2253
2286
  ws = null;
2254
2287
  opts;
2255
2288
  closed = !1;
@@ -2257,7 +2290,7 @@ var Dn = class {
2257
2290
  this.opts = e;
2258
2291
  }
2259
2292
  getUrl() {
2260
- return `ws://127.0.0.1:${M().getGatewayPort()}`;
2293
+ return `ws://127.0.0.1:${j().getGatewayPort()}`;
2261
2294
  }
2262
2295
  isConnected() {
2263
2296
  return this.ws !== null && this.ws.readyState === re.OPEN;
@@ -2268,10 +2301,10 @@ var Dn = class {
2268
2301
  this.ws = new re(e, { maxPayload: 25 * 1024 * 1024 }), this.ws.on("open", () => {
2269
2302
  this.opts.onOpen?.(), this.onOpen();
2270
2303
  }), this.ws.on("message", async (e) => {
2271
- let t = En(e);
2304
+ let t = Nn(e);
2272
2305
  await this.opts.onMessage?.(t), await this.onMessage(t);
2273
2306
  }), this.ws.on("close", (e, t) => {
2274
- let n = En(t);
2307
+ let n = Nn(t);
2275
2308
  this.ws = null, this.onClose(e, n), this.opts.onClose?.(`code: ${e}, reason: ${n ?? ""}`);
2276
2309
  }), this.ws.on("error", (e) => {
2277
2310
  this.onError(e), this.opts.onClose?.(`socket error: ${e.message}`);
@@ -2288,7 +2321,7 @@ var Dn = class {
2288
2321
  onMessage(e) {}
2289
2322
  onClose(e, t) {}
2290
2323
  onError(e) {}
2291
- }, On = {
2324
+ }, Fn = {
2292
2325
  WEBCHAT_UI: "webchat-ui",
2293
2326
  CONTROL_UI: "openclaw-control-ui",
2294
2327
  WEBCHAT: "webchat",
@@ -2300,7 +2333,7 @@ var Dn = class {
2300
2333
  NODE_HOST: "node-host",
2301
2334
  FINGERPRINT: "fingerprint",
2302
2335
  PROBE: "openclaw-probe"
2303
- }, kn = {
2336
+ }, In = {
2304
2337
  WEBCHAT: "webchat",
2305
2338
  CLI: "cli",
2306
2339
  UI: "ui",
@@ -2316,13 +2349,13 @@ var Dn = class {
2316
2349
  constructor(e, t, n, r) {
2317
2350
  super(t), this.name = "WebSocketClientError", this.code = e, this.details = n, this.retryable = r;
2318
2351
  }
2319
- }, An = {
2352
+ }, Ln = {
2320
2353
  role: "operator",
2321
2354
  scopes: [],
2322
- clientId: On.CLI,
2355
+ clientId: Fn.CLI,
2323
2356
  displayName: "Protocol Client",
2324
- clientMode: kn.CLI
2325
- }, jn = 3e4, Mn = "1.0.0", Nn = "server", Pn = 2, Fn = 1e3, In = class extends Dn {
2357
+ clientMode: In.CLI
2358
+ }, Rn = 3e4, zn = "1.0.0", Bn = "server", Vn = 2, Hn = 1e3, Un = class extends Pn {
2326
2359
  protocolOpts;
2327
2360
  config;
2328
2361
  pendingRequests = /* @__PURE__ */ new Map();
@@ -2338,7 +2371,7 @@ var Dn = class {
2338
2371
  isReconnecting = !1;
2339
2372
  constructor(e = {}, t = {}) {
2340
2373
  super(e), this.protocolOpts = e, this.config = {
2341
- ...An,
2374
+ ...Ln,
2342
2375
  ...t
2343
2376
  }, this.debug = process.env.DEBUG_GATEWAY === "true";
2344
2377
  }
@@ -2385,7 +2418,7 @@ var Dn = class {
2385
2418
  }
2386
2419
  }
2387
2420
  async sendConnect() {
2388
- let e = this.config.clientMode ?? kn.CLI, t = await Vt(), n = this.connectNonce ? rn({
2421
+ let e = this.config.clientMode ?? In.CLI, t = await Gt(), n = this.connectNonce ? dn({
2389
2422
  deviceIdentity: t,
2390
2423
  clientName: this.config.clientId,
2391
2424
  clientMode: e,
@@ -2394,21 +2427,24 @@ var Dn = class {
2394
2427
  authToken: this.protocolOpts.token,
2395
2428
  nonce: this.connectNonce,
2396
2429
  platform: process.platform,
2397
- deviceFamily: Nn
2430
+ deviceFamily: Bn
2398
2431
  }) : void 0, r = {
2399
2432
  minProtocol: 3,
2400
2433
  maxProtocol: 3,
2401
2434
  client: {
2402
2435
  id: this.config.clientId,
2403
2436
  displayName: this.config.displayName,
2404
- version: Mn,
2437
+ version: zn,
2405
2438
  platform: process.platform,
2406
- deviceFamily: Nn,
2439
+ deviceFamily: Bn,
2407
2440
  mode: e
2408
2441
  },
2409
2442
  role: this.config.role,
2410
2443
  scopes: this.config.scopes,
2411
- auth: { token: this.protocolOpts.token },
2444
+ auth: {
2445
+ token: this.protocolOpts.token,
2446
+ password: this.protocolOpts.password
2447
+ },
2412
2448
  device: n
2413
2449
  };
2414
2450
  this.sendRequest("connect", r).then((e) => {
@@ -2446,7 +2482,7 @@ var Dn = class {
2446
2482
  let t = this.pendingTimers.get(n);
2447
2483
  t && clearTimeout(t), this.pendingTimers.delete(n), i(new J(q.TIMEOUT, `Request timeout: ${e}`));
2448
2484
  }
2449
- }, jn);
2485
+ }, Rn);
2450
2486
  this.pendingTimers.set(n, o);
2451
2487
  });
2452
2488
  }
@@ -2478,16 +2514,16 @@ var Dn = class {
2478
2514
  }
2479
2515
  scheduleReconnect() {
2480
2516
  if (!(this.closed || this.isReconnecting)) {
2481
- if (this.reconnectAttempts >= Pn) {
2482
- O().error(`[protocol-gateway] max reconnect attempts (${Pn}) 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?.();
2483
2519
  return;
2484
2520
  }
2485
- this.reconnectAttempts++, this.isReconnecting = !0, O().info(`[protocol-gateway] attempting to reconnect (attempt ${this.reconnectAttempts}/${Pn})`), this.reconnectTimer = setTimeout(() => {
2521
+ this.reconnectAttempts++, this.isReconnecting = !0, O().info(`[protocol-gateway] attempting to reconnect (attempt ${this.reconnectAttempts}/${Vn})`), this.reconnectTimer = setTimeout(() => {
2486
2522
  this.isReconnecting = !1, this.closed || super.connect();
2487
- }, Fn);
2523
+ }, Hn);
2488
2524
  }
2489
2525
  }
2490
- }, Ln = {
2526
+ }, Wn = {
2491
2527
  role: "operator",
2492
2528
  scopes: [
2493
2529
  "operator.admin",
@@ -2497,12 +2533,12 @@ var Dn = class {
2497
2533
  "operator.approvals",
2498
2534
  "operator.pairing"
2499
2535
  ],
2500
- clientId: On.CLI,
2536
+ clientId: Fn.CLI,
2501
2537
  displayName: "YOYO-Control",
2502
- clientMode: kn.BACKEND
2503
- }, Rn = class extends In {
2538
+ clientMode: In.BACKEND
2539
+ }, Gn = class extends Un {
2504
2540
  constructor(e = {}) {
2505
- super(e, Ln);
2541
+ super(e, Wn);
2506
2542
  }
2507
2543
  async setAgentFile(e, t, n = "main") {
2508
2544
  return this.sendRequest("agents.files.set", {
@@ -2535,7 +2571,7 @@ var Dn = class {
2535
2571
  async devicePairApprove(e) {
2536
2572
  return this.sendRequest("device.pair.approve", { requestId: e });
2537
2573
  }
2538
- }, zn = class {
2574
+ }, Kn = class {
2539
2575
  client = null;
2540
2576
  ready = !1;
2541
2577
  options;
@@ -2546,9 +2582,10 @@ var Dn = class {
2546
2582
  }
2547
2583
  init() {
2548
2584
  if (this.client !== null) return;
2549
- let e = M().getGatewayAuthConfig()?.token || "";
2550
- this.client = new Rn({
2551
- 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,
2552
2589
  onAuthenticated: () => {
2553
2590
  O().info("[yoyoclaw-channel] admin gateway client authenticated"), this.ready = !0, this.resolveAllPending(!0);
2554
2591
  },
@@ -2601,11 +2638,11 @@ var Dn = class {
2601
2638
  for (let [t, n] of this.pendingReadyRequests) clearTimeout(n.timeout), n.resolve(e);
2602
2639
  this.pendingReadyRequests.clear();
2603
2640
  }
2604
- }, Bn = "/aicloud/yoyo-claw-service/v1/yoyoclaw/fullduplex", Vn = 25 * 1024 * 1024;
2605
- function Hn(e, t) {
2606
- let n = Ie(), r = n.grayTag ? { "x-gray": n.grayTag } : void 0, i = N(), a = `wss://${n.clawCloud}${Bn}`, o = Un(e, t, i, r), s = ze(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 = {
2607
2644
  headers: o,
2608
- maxPayload: Vn
2645
+ maxPayload: Jn
2609
2646
  };
2610
2647
  return s && (c.agent = s), {
2611
2648
  url: a,
@@ -2613,7 +2650,7 @@ function Hn(e, t) {
2613
2650
  wsOptions: c
2614
2651
  };
2615
2652
  }
2616
- function Un(e, t, n, r) {
2653
+ function Xn(e, t, n, r) {
2617
2654
  let i = {
2618
2655
  "x-role": "yoyoclaw",
2619
2656
  "x-trace-id": n,
@@ -2624,7 +2661,7 @@ function Un(e, t, n, r) {
2624
2661
  }
2625
2662
  //#endregion
2626
2663
  //#region src/cloud-channel/client.ts
2627
- var Wn = 3e4, Gn = 4e3, Kn = 1e3, qn = 2, Jn = 999, Yn = class {
2664
+ var Zn = 3e4, Qn = 4e3, $n = 1e3, er = 2, tr = 999, nr = class {
2628
2665
  ws = null;
2629
2666
  options;
2630
2667
  retryCount = 0;
@@ -2639,7 +2676,7 @@ var Wn = 3e4, Gn = 4e3, Kn = 1e3, qn = 2, Jn = 999, Yn = class {
2639
2676
  connect(e = !1) {
2640
2677
  if (this.ws?.readyState === T.OPEN) return;
2641
2678
  this.clearRetryTimer();
2642
- let { deviceInfo: t, userInfo: n } = this.options, { url: r, traceId: i, wsOptions: a } = Hn(t, n);
2679
+ let { deviceInfo: t, userInfo: n } = this.options, { url: r, traceId: i, wsOptions: a } = Yn(t, n);
2643
2680
  this.currentTraceId = i, this.options.onStatusEvent?.({
2644
2681
  type: G.CLOUD_SOCKET_CONNECTING,
2645
2682
  timestamp: Date.now(),
@@ -2700,8 +2737,8 @@ var Wn = 3e4, Gn = 4e3, Kn = 1e3, qn = 2, Jn = 999, Yn = class {
2700
2737
  }
2701
2738
  onMessage = async (e) => {
2702
2739
  try {
2703
- let t = En(e), n = JSON.parse(t);
2704
- if (O().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") {
2705
2742
  if (n.wsOutputEvent) {
2706
2743
  n.sessionInfo && (n.wsOutputEvent.sessionInfo = n.sessionInfo), this.options.onMessage?.(n.wsOutputEvent);
2707
2744
  return;
@@ -2727,7 +2764,7 @@ var Wn = 3e4, Gn = 4e3, Kn = 1e3, qn = 2, Jn = 999, Yn = class {
2727
2764
  }
2728
2765
  this.clearRetryTimer();
2729
2766
  let e = this.calculateRetryDelay();
2730
- this.retryCount = Math.min(this.retryCount + 1, Jn), O().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?.({
2731
2768
  type: G.CLOUD_SOCKET_RETRY,
2732
2769
  timestamp: Date.now(),
2733
2770
  data: {
@@ -2742,8 +2779,8 @@ var Wn = 3e4, Gn = 4e3, Kn = 1e3, qn = 2, Jn = 999, Yn = class {
2742
2779
  this.retryTimer &&= (clearTimeout(this.retryTimer), null);
2743
2780
  }
2744
2781
  calculateRetryDelay() {
2745
- let e = Kn * qn ** +Math.min(this.retryCount, 2);
2746
- return Math.min(e, Gn);
2782
+ let e = $n * er ** +Math.min(this.retryCount, 2);
2783
+ return Math.min(e, Qn);
2747
2784
  }
2748
2785
  startPingTimer() {
2749
2786
  this.pingTimer = setInterval(() => {
@@ -2764,7 +2801,7 @@ var Wn = 3e4, Gn = 4e3, Kn = 1e3, qn = 2, Jn = 999, Yn = class {
2764
2801
  } catch {
2765
2802
  O().error("[claw-cloud-socket] failed to send pingMessage");
2766
2803
  }
2767
- }, Wn);
2804
+ }, Zn);
2768
2805
  }
2769
2806
  stopPingTimer() {
2770
2807
  this.pingTimer &&= (clearInterval(this.pingTimer), null);
@@ -2775,18 +2812,18 @@ var Wn = 3e4, Gn = 4e3, Kn = 1e3, qn = 2, Jn = 999, Yn = class {
2775
2812
  resumeRetry() {
2776
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)));
2777
2814
  }
2778
- }, Xn = ".openclaw/yoyo/tools", Zn = /[<>:"/\\|?*]/;
2779
- async function Qn(e, t) {
2815
+ }, rr = ".openclaw/yoyo/tools", ir = /[<>:"/\\|?*]/;
2816
+ async function ar(e, t) {
2780
2817
  let n = 0, i = 0;
2781
2818
  for (let a of t) {
2782
- let t = $n(a.name);
2819
+ let t = or(a.name);
2783
2820
  if (!t) {
2784
2821
  i += 1;
2785
2822
  continue;
2786
2823
  }
2787
2824
  await B({
2788
2825
  rootDir: e,
2789
- relativePath: r.join(Xn, t),
2826
+ relativePath: r.join(rr, t),
2790
2827
  data: JSON.stringify(a, null, 2),
2791
2828
  encoding: "utf8",
2792
2829
  mkdir: !0
@@ -2798,64 +2835,64 @@ async function Qn(e, t) {
2798
2835
  skippedCount: i
2799
2836
  };
2800
2837
  }
2801
- function $n(e) {
2838
+ function or(e) {
2802
2839
  let t = e.trim();
2803
- if (!(!t || Zn.test(t) || er(t))) return `${t}.json`;
2840
+ if (!(!t || ir.test(t) || sr(t))) return `${t}.json`;
2804
2841
  }
2805
- function er(e) {
2842
+ function sr(e) {
2806
2843
  for (let t of e) if (t.codePointAt(0) < 32) return !0;
2807
2844
  return !1;
2808
2845
  }
2809
2846
  //#endregion
2810
2847
  //#region src/modules/device-toolset/copy-fallback.ts
2811
- var tr = ".yoyo-device-toolset-copy-fallback";
2812
- async function nr(e, t) {
2813
- await ir(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, {
2814
2851
  recursive: !0,
2815
2852
  force: !0
2816
- }), await v.mkdir(t, { recursive: !0 }), await ar(e, t), await v.writeFile(r.join(t, tr), "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");
2817
2854
  }
2818
- async function rr(e) {
2855
+ async function ur(e) {
2819
2856
  try {
2820
- return (await v.stat(r.join(e, tr))).isFile();
2857
+ return (await v.stat(r.join(e, cr))).isFile();
2821
2858
  } catch {
2822
2859
  return !1;
2823
2860
  }
2824
2861
  }
2825
- async function ir(e) {
2862
+ async function dr(e) {
2826
2863
  let t;
2827
2864
  try {
2828
2865
  t = await v.lstat(e);
2829
2866
  } catch (e) {
2830
- if (or(e)) return;
2867
+ if (pr(e)) return;
2831
2868
  throw e;
2832
2869
  }
2833
2870
  if (!t.isSymbolicLink()) {
2834
2871
  if (!t.isDirectory()) throw Error(`Cannot replace unmanaged mcptools path: ${e}`);
2835
- if (!((await v.readdir(e)).length === 0 || await rr(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}`);
2836
2873
  }
2837
2874
  }
2838
- async function ar(e, t) {
2875
+ async function fr(e, t) {
2839
2876
  let n = await v.readdir(e, { withFileTypes: !0 });
2840
2877
  for (let i of n) {
2841
2878
  let n = r.join(e, i.name), a = r.join(t, i.name);
2842
- i.isDirectory() ? (await v.mkdir(a, { recursive: !0 }), await ar(n, a)) : i.isFile() && await v.copyFile(n, a);
2879
+ i.isDirectory() ? (await v.mkdir(a, { recursive: !0 }), await fr(n, a)) : i.isFile() && await v.copyFile(n, a);
2843
2880
  }
2844
2881
  }
2845
- function or(e) {
2882
+ function pr(e) {
2846
2883
  return !!(e && typeof e == "object" && "code" in e && e.code === "ENOENT");
2847
2884
  }
2848
2885
  //#endregion
2849
2886
  //#region src/modules/device-toolset/link.ts
2850
- async function sr(e, t, n = {}) {
2887
+ async function mr(e, t, n = {}) {
2851
2888
  await v.mkdir(e, { recursive: !0 });
2852
- let i = await v.realpath(e), a = await cr(t);
2889
+ let i = await v.realpath(e), a = await hr(t);
2853
2890
  if (a.exists) {
2854
2891
  if (a.isLink) {
2855
- if (await lr(t, i)) return { mode: "already-linked" };
2892
+ if (await gr(t, i)) return { mode: "already-linked" };
2856
2893
  throw Error(`Cannot replace unmanaged mcptools link: ${t}`);
2857
2894
  }
2858
- if (!await ur(t, a.isDirectory)) throw Error(`Cannot replace unmanaged mcptools directory: ${t}`);
2895
+ if (!await _r(t, a.isDirectory)) throw Error(`Cannot replace unmanaged mcptools directory: ${t}`);
2859
2896
  await v.rm(t, {
2860
2897
  recursive: !0,
2861
2898
  force: !0
@@ -2865,10 +2902,10 @@ async function sr(e, t, n = {}) {
2865
2902
  try {
2866
2903
  return await (n.symlink ?? v.symlink)(i, t, process.platform === "win32" ? "junction" : "dir"), { mode: "linked" };
2867
2904
  } catch {
2868
- return await (n.copyFallback ?? nr)(i, t), { mode: "copy-fallback" };
2905
+ return await (n.copyFallback ?? lr)(i, t), { mode: "copy-fallback" };
2869
2906
  }
2870
2907
  }
2871
- async function cr(e) {
2908
+ async function hr(e) {
2872
2909
  try {
2873
2910
  let t = await v.lstat(e);
2874
2911
  return {
@@ -2877,7 +2914,7 @@ async function cr(e) {
2877
2914
  isDirectory: t.isDirectory()
2878
2915
  };
2879
2916
  } catch (e) {
2880
- if (fr(e)) return {
2917
+ if (yr(e)) return {
2881
2918
  exists: !1,
2882
2919
  isLink: !1,
2883
2920
  isDirectory: !1
@@ -2885,66 +2922,66 @@ async function cr(e) {
2885
2922
  throw e;
2886
2923
  }
2887
2924
  }
2888
- async function lr(e, t) {
2925
+ async function gr(e, t) {
2889
2926
  try {
2890
- return dr(await v.realpath(e), t);
2927
+ return vr(await v.realpath(e), t);
2891
2928
  } catch {
2892
2929
  return !1;
2893
2930
  }
2894
2931
  }
2895
- async function ur(e, t) {
2896
- return t ? (await v.readdir(e)).length === 0 || await rr(e) : !1;
2932
+ async function _r(e, t) {
2933
+ return t ? (await v.readdir(e)).length === 0 || await ur(e) : !1;
2897
2934
  }
2898
- function dr(e, t) {
2935
+ function vr(e, t) {
2899
2936
  return process.platform === "win32" ? e.toLowerCase() === t.toLowerCase() : e === t;
2900
2937
  }
2901
- function fr(e) {
2938
+ function yr(e) {
2902
2939
  return !!(e && typeof e == "object" && "code" in e && e.code === "ENOENT");
2903
2940
  }
2904
2941
  //#endregion
2905
2942
  //#region src/modules/device-toolset/md5-index.ts
2906
- var pr = ".openclaw/yoyo/toolset-md5.json", mr = 1024 * 1024;
2907
- function hr() {
2943
+ var br = ".openclaw/yoyo/toolset-md5.json", xr = 1024 * 1024;
2944
+ function Sr() {
2908
2945
  return {
2909
2946
  version: 1,
2910
2947
  nodes: {}
2911
2948
  };
2912
2949
  }
2913
- function gr(e) {
2914
- return JSON.stringify(xr(e));
2950
+ function Cr(e) {
2951
+ return JSON.stringify(Or(e));
2915
2952
  }
2916
- function _r(e) {
2917
- return g("md5").update(gr(e)).digest("hex");
2953
+ function wr(e) {
2954
+ return g("md5").update(Cr(e)).digest("hex");
2918
2955
  }
2919
- async function vr(e) {
2956
+ async function Tr(e) {
2920
2957
  try {
2921
2958
  let t = await _t({
2922
2959
  rootDir: e,
2923
- relativePath: pr,
2924
- maxBytes: mr
2960
+ relativePath: br,
2961
+ maxBytes: xr
2925
2962
  }), n = JSON.parse(t.buffer.toString("utf8"));
2926
2963
  return {
2927
2964
  version: 1,
2928
2965
  nodes: n && typeof n.nodes == "object" && n.nodes ? n.nodes : {}
2929
2966
  };
2930
2967
  } catch (e) {
2931
- if (e instanceof L && e.code === "not-found") return hr();
2968
+ if (e instanceof I && e.code === "not-found") return Sr();
2932
2969
  throw e;
2933
2970
  }
2934
2971
  }
2935
- async function yr(e, t, n) {
2936
- let r = (await vr(e)).nodes[t]?.md5;
2972
+ async function Er(e, t, n) {
2973
+ let r = (await Tr(e)).nodes[t]?.md5;
2937
2974
  return {
2938
2975
  changed: r !== n,
2939
2976
  md5: n,
2940
2977
  previousMd5: r
2941
2978
  };
2942
2979
  }
2943
- async function br(e, t, n, r = Date.now()) {
2980
+ async function Dr(e, t, n, r = Date.now()) {
2944
2981
  let i = {
2945
2982
  version: 1,
2946
2983
  nodes: {
2947
- ...(await vr(e)).nodes,
2984
+ ...(await Tr(e)).nodes,
2948
2985
  [t]: {
2949
2986
  md5: n,
2950
2987
  updatedAtMs: r
@@ -2953,19 +2990,19 @@ async function br(e, t, n, r = Date.now()) {
2953
2990
  };
2954
2991
  return await B({
2955
2992
  rootDir: e,
2956
- relativePath: pr,
2993
+ relativePath: br,
2957
2994
  data: JSON.stringify(i, null, 2),
2958
2995
  encoding: "utf8",
2959
2996
  mkdir: !0
2960
2997
  }), i;
2961
2998
  }
2962
- function xr(e) {
2963
- if (Array.isArray(e)) return e.map(xr);
2999
+ function Or(e) {
3000
+ if (Array.isArray(e)) return e.map(Or);
2964
3001
  if (!e || typeof e != "object") return e;
2965
3002
  let t = {};
2966
3003
  for (let n of Object.keys(e).toSorted()) {
2967
3004
  let r = e[n];
2968
- r !== void 0 && (t[n] = xr(r));
3005
+ r !== void 0 && (t[n] = Or(r));
2969
3006
  }
2970
3007
  return t;
2971
3008
  }
@@ -2974,17 +3011,17 @@ function xr(e) {
2974
3011
  function Y(e) {
2975
3012
  return typeof e == "string" && e.trim() ? e : void 0;
2976
3013
  }
2977
- function Sr(e) {
3014
+ function kr(e) {
2978
3015
  if (!e || typeof e != "object") throw Error("DeviceToolSet payload must be an object");
2979
3016
  let t = e;
2980
3017
  if (!Y(t.nodeId)) throw Error("DeviceToolSet payload missing nodeId");
2981
3018
  if (!Array.isArray(t.toolSet)) throw Error("DeviceToolSet payload toolSet must be an array");
2982
3019
  return e;
2983
3020
  }
2984
- function Cr(e) {
3021
+ function Ar(e) {
2985
3022
  let t = e.nodeId, n = [], r = 0;
2986
3023
  for (let t of e.toolSet) {
2987
- let e = wr(t);
3024
+ let e = jr(t);
2988
3025
  e ? n.push(e) : r += 1;
2989
3026
  }
2990
3027
  return {
@@ -2993,7 +3030,7 @@ function Cr(e) {
2993
3030
  skippedCount: r
2994
3031
  };
2995
3032
  }
2996
- function wr(e) {
3033
+ function jr(e) {
2997
3034
  let t = Y(e.tool?.id), n = Y(e.tool?.function?.name), r = Y(e.tool?.function?.description);
2998
3035
  if (!t || e.tool?.type !== "function" || !n || !r) return;
2999
3036
  let i = {
@@ -3008,48 +3045,48 @@ function wr(e) {
3008
3045
  }
3009
3046
  //#endregion
3010
3047
  //#region src/modules/device-toolset/persist.ts
3011
- var Tr = ".openclaw/yoyo/device-toolsets.json", Er = 10 * 1024 * 1024;
3012
- function Dr() {
3048
+ var Mr = ".openclaw/yoyo/device-toolsets.json", Nr = 10 * 1024 * 1024;
3049
+ function Pr() {
3013
3050
  return {
3014
3051
  version: 1,
3015
3052
  tools: {}
3016
3053
  };
3017
3054
  }
3018
- async function Or(e) {
3055
+ async function Fr(e) {
3019
3056
  try {
3020
3057
  let t = await _t({
3021
3058
  rootDir: e,
3022
- relativePath: Tr,
3023
- maxBytes: Er
3059
+ relativePath: Mr,
3060
+ maxBytes: Nr
3024
3061
  }), n = JSON.parse(t.buffer.toString("utf8"));
3025
3062
  return {
3026
3063
  version: 1,
3027
3064
  tools: n && typeof n.tools == "object" && n.tools ? n.tools : {}
3028
3065
  };
3029
3066
  } catch (e) {
3030
- if (e instanceof L && e.code === "not-found") return Dr();
3067
+ if (e instanceof I && e.code === "not-found") return Pr();
3031
3068
  throw e;
3032
3069
  }
3033
3070
  }
3034
- async function kr(e, t, n) {
3071
+ async function Ir(e, t, n) {
3035
3072
  let r = {
3036
3073
  version: 1,
3037
- tools: Ar((await Or(e)).tools, t, n)
3074
+ tools: Lr((await Fr(e)).tools, t, n)
3038
3075
  };
3039
3076
  return await B({
3040
3077
  rootDir: e,
3041
- relativePath: Tr,
3078
+ relativePath: Mr,
3042
3079
  data: JSON.stringify(r, null, 2),
3043
3080
  encoding: "utf8",
3044
3081
  mkdir: !0
3045
3082
  }), {
3046
3083
  changed: !0,
3047
- nodeCount: Mr(r.tools),
3084
+ nodeCount: zr(r.tools),
3048
3085
  toolCount: Object.keys(r.tools).length,
3049
3086
  cache: r
3050
3087
  };
3051
3088
  }
3052
- function Ar(e, t, n) {
3089
+ function Lr(e, t, n) {
3053
3090
  let r = { ...e };
3054
3091
  for (let e of n) {
3055
3092
  let n = r[e.id];
@@ -3057,88 +3094,88 @@ function Ar(e, t, n) {
3057
3094
  id: e.id,
3058
3095
  name: e.name,
3059
3096
  description: e.description,
3060
- supportedNodeIds: jr(n?.supportedNodeIds ?? [], t)
3097
+ supportedNodeIds: Rr(n?.supportedNodeIds ?? [], t)
3061
3098
  };
3062
3099
  }
3063
3100
  return r;
3064
3101
  }
3065
- function jr(e, t) {
3102
+ function Rr(e, t) {
3066
3103
  return [...new Set([...e, t])];
3067
3104
  }
3068
- function Mr(e) {
3105
+ function zr(e) {
3069
3106
  let t = /* @__PURE__ */ new Set();
3070
3107
  for (let n of Object.values(e)) for (let e of n.supportedNodeIds) t.add(e);
3071
3108
  return t.size;
3072
3109
  }
3073
3110
  //#endregion
3074
3111
  //#region src/modules/device-toolset/skill-inject.ts
3075
- var Nr = r.join("skills", "yoyo-control", "SKILL.md"), Pr = r.join("skills", "yoyo-control", "configs", "sub-skills.json"), Fr = "{{full-mcp-tool-list}}", Ir = "<!-- yoyo-mcp-tools:start -->", Lr = "<!-- yoyo-mcp-tools:end -->";
3076
- async function Rr(e, t) {
3077
- let n = r.join(e, Nr), i = await v.readFile(n, "utf8"), a = Br(t, await zr(e)), o = Hr(i, Vr(a));
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));
3078
3115
  return o !== i && await v.writeFile(n, o, "utf8"), {
3079
3116
  skillPath: n,
3080
3117
  rowCount: Object.keys(a).length
3081
3118
  };
3082
3119
  }
3083
- async function zr(e) {
3084
- let t = r.join(e, Pr), n;
3120
+ async function Kr(e) {
3121
+ let t = r.join(e, Vr), n;
3085
3122
  try {
3086
3123
  n = await v.readFile(t, "utf8");
3087
3124
  } catch (e) {
3088
- if (Gr(e) && e.code === "ENOENT") return /* @__PURE__ */ new Set();
3125
+ if (Qr(e) && e.code === "ENOENT") return /* @__PURE__ */ new Set();
3089
3126
  throw e;
3090
3127
  }
3091
3128
  let i = JSON.parse(n);
3092
3129
  if (!Array.isArray(i) || i.some((e) => typeof e != "string")) throw Error("sub-skills config must be a JSON array of tool names");
3093
3130
  return new Set(i.map((e) => e.trim()).filter(Boolean));
3094
3131
  }
3095
- function Br(e, t) {
3132
+ function qr(e, t) {
3096
3133
  return t.size === 0 ? e : Object.fromEntries(Object.entries(e).filter(([e, n]) => !t.has(e) && !t.has(n.name)));
3097
3134
  }
3098
- function Vr(e) {
3135
+ function Jr(e) {
3099
3136
  return [
3100
- Ir,
3101
- ...Object.values(e).toSorted((e, t) => e.name.localeCompare(t.name)).map((e) => `| ${Ur(e.name)} | ${Ur(e.description)} | ${Ur(e.supportedNodeIds.join(", "))} |`),
3102
- Lr
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
3103
3140
  ].join("\n");
3104
3141
  }
3105
- function Hr(e, t) {
3106
- let n = RegExp(`${Wr(Ir)}[\\s\\S]*?${Wr(Lr)}`);
3142
+ function Yr(e, t) {
3143
+ let n = RegExp(`${Zr(Ur)}[\\s\\S]*?${Zr(Wr)}`);
3107
3144
  if (n.test(e)) return e.replace(n, t);
3108
- if (e.includes(Fr)) return e.replace(Fr, t);
3145
+ if (e.includes(Hr)) return e.replace(Hr, t);
3109
3146
  throw Error("Unable to find MCP tools placeholder or generated block in yoyo-control skill");
3110
3147
  }
3111
- function Ur(e) {
3148
+ function Xr(e) {
3112
3149
  return e.replaceAll("|", "\\|").replace(/\r?\n/g, " ");
3113
3150
  }
3114
- function Wr(e) {
3151
+ function Zr(e) {
3115
3152
  return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
3116
3153
  }
3117
- function Gr(e) {
3154
+ function Qr(e) {
3118
3155
  return e instanceof Error && "code" in e;
3119
3156
  }
3120
3157
  //#endregion
3121
3158
  //#region src/modules/device-toolset/processor.ts
3122
- var Kr = Ct();
3123
- async function qr(e) {
3124
- let t = Sr(e), n = wt();
3159
+ var $r = Ct();
3160
+ async function ei(e) {
3161
+ let t = kr(e), n = wt();
3125
3162
  if (!n) throw Error("Unable to resolve home directory for DeviceToolSet persistence");
3126
- let i = Cr(t);
3163
+ let i = Ar(t);
3127
3164
  O().info(`[yoyoclaw-device-toolset] process start, nodeId: ${i.nodeId}, tools: ${i.tools.length}, skipped: ${i.skippedCount}`);
3128
- let a = _r(i.tools);
3129
- if (O().debug?.(`[yoyoclaw-device-toolset] computed md5, nodeId: ${i.nodeId}, md5: ${a}`), !(await yr(n, i.nodeId, a)).changed) return O().info(`[yoyoclaw-device-toolset] unchanged, skip refresh, nodeId: ${i.nodeId}`), {
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}`), {
3130
3167
  changed: !1,
3131
3168
  nodeId: i.nodeId,
3132
3169
  skippedCount: i.skippedCount
3133
3170
  };
3134
- let o = await kr(n, i.nodeId, i.tools);
3171
+ let o = await Ir(n, i.nodeId, i.tools);
3135
3172
  O().info(`[yoyoclaw-device-toolset] cache merged, nodeId: ${i.nodeId}, supportedNodes: ${o.nodeCount}, tools: ${o.toolCount}`);
3136
- let s = o.cache.tools, c = await Qn(n, i.tools);
3173
+ let s = o.cache.tools, c = await ar(n, i.tools);
3137
3174
  O().info(`[yoyoclaw-device-toolset] archive refreshed, nodeId: ${i.nodeId}, written: ${c.writtenCount}, skipped: ${c.skippedCount}`);
3138
- let l = await Rr(Kr, s);
3175
+ let l = await Gr($r, s);
3139
3176
  O().info(`[yoyoclaw-device-toolset] skill refreshed, nodeId: ${i.nodeId}, rows: ${l.rowCount}`);
3140
- let u = await sr(c.archiveDir, r.join(Kr, "skills", "yoyo-control", "mcptools"));
3141
- return O().info(`[yoyoclaw-device-toolset] mapping ready, nodeId: ${i.nodeId}, mode: ${u.mode}`), await br(n, i.nodeId, a, Date.now()), O().info(`[yoyoclaw-device-toolset] process complete, nodeId: ${i.nodeId}`), {
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}`), {
3142
3179
  changed: !0,
3143
3180
  nodeId: i.nodeId,
3144
3181
  nodeCount: o.nodeCount,
@@ -3148,7 +3185,7 @@ async function qr(e) {
3148
3185
  }
3149
3186
  //#endregion
3150
3187
  //#region src/cloud-channel/message-handler.ts
3151
- var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
3188
+ var ti = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", ni = class {
3152
3189
  sessionManager;
3153
3190
  adminClientManager;
3154
3191
  config;
@@ -3425,7 +3462,7 @@ var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
3425
3462
  ok: !1,
3426
3463
  error: "Missing content in context payload"
3427
3464
  };
3428
- let r = Jr.style, i = await e.setAgentFile(r, n);
3465
+ let r = ti.style, i = await e.setAgentFile(r, n);
3429
3466
  return i.ok ? {
3430
3467
  ok: !0,
3431
3468
  data: { name: "style" }
@@ -3514,14 +3551,14 @@ var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
3514
3551
  async updateDeviceToolSetContext(e, t, n) {
3515
3552
  return n?.header.namespace === "yoyoclaw" ? {
3516
3553
  ok: !0,
3517
- data: await qr(t),
3554
+ data: await ei(t),
3518
3555
  noReply: !0
3519
3556
  } : {
3520
3557
  ok: !1,
3521
3558
  error: `Unsupported DeviceToolSet namespace: ${n?.header.namespace ?? "unknown"}`
3522
3559
  };
3523
3560
  }
3524
- }, Xr = class extends Dn {
3561
+ }, ri = class extends Pn {
3525
3562
  nodeOpts;
3526
3563
  sessionId;
3527
3564
  hardwareDeviceId;
@@ -3563,7 +3600,7 @@ var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
3563
3600
  onError(e) {
3564
3601
  O().error(`[yoyoclaw-nodeGatewayClient] error for session: ${this.sessionId}, device: ${this.hardwareDeviceId}: ${e.message}`);
3565
3602
  }
3566
- }, Zr = class {
3603
+ }, ii = class {
3567
3604
  nodeGatewayClientsMap = /* @__PURE__ */ new Map();
3568
3605
  deviceSessionsMap = /* @__PURE__ */ new Map();
3569
3606
  sessionIdToHardwareDeviceMap = /* @__PURE__ */ new Map();
@@ -3596,7 +3633,7 @@ var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
3596
3633
  this.nodeGatewayClientsMap.set(e, t);
3597
3634
  }
3598
3635
  createNodeGatewayClient(e) {
3599
- let t = new Xr({
3636
+ let t = new ri({
3600
3637
  sessionId: e.sessionId,
3601
3638
  hardwareDeviceId: e.hardwareDeviceId,
3602
3639
  deviceInfo: e.deviceInfo,
@@ -3628,14 +3665,14 @@ var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
3628
3665
  getSessionCount() {
3629
3666
  return this.sessionIdToHardwareDeviceMap.size;
3630
3667
  }
3631
- }, Qr = class {
3668
+ }, ai = class {
3632
3669
  cloudClient;
3633
3670
  sessionManager;
3634
3671
  adminClientManager;
3635
3672
  messageHandler;
3636
3673
  config;
3637
3674
  constructor(e) {
3638
- this.config = e, this.sessionManager = new Zr(), this.adminClientManager = new zn({ onStatusEvent: this.handleStatusEvent }), this.messageHandler = new Yr({
3675
+ this.config = e, this.sessionManager = new ii(), this.adminClientManager = new Kn({ onStatusEvent: this.handleStatusEvent }), this.messageHandler = new ni({
3639
3676
  sessionManager: this.sessionManager,
3640
3677
  adminClientManager: this.adminClientManager,
3641
3678
  config: {
@@ -3643,7 +3680,7 @@ var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
3643
3680
  onStatusEvent: this.handleStatusEvent,
3644
3681
  onReply: (e) => this.cloudClient.send(e)
3645
3682
  }
3646
- }), this.cloudClient = new Yn({
3683
+ }), this.cloudClient = new nr({
3647
3684
  deviceInfo: e.deviceInfo,
3648
3685
  userInfo: e.userInfo,
3649
3686
  onMessage: this.messageHandler.handleCloudMessage,
@@ -3682,10 +3719,10 @@ var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
3682
3719
  }, Z = {
3683
3720
  channel: null,
3684
3721
  status: "idle"
3685
- }, Q = null, $r = (e) => ({
3722
+ }, Q = null, oi = (e) => ({
3686
3723
  id: "yoyoclaw-connection",
3687
3724
  async start() {
3688
- O().info("[yoyoclaw] plugin service enabled"), Q = new gn(!0);
3725
+ O().info("[yoyoclaw] plugin service enabled"), Q = new Cn(!0);
3689
3726
  try {
3690
3727
  await Q.loadAndCleanStatus(), O().info("[yoyoclaw-conn] status tracker initialized and cleaned");
3691
3728
  } catch (e) {
@@ -3693,13 +3730,13 @@ var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
3693
3730
  }
3694
3731
  O().debug?.(`[yoyoclaw] agents: ${JSON.stringify(e.config.agents?.defaults)}`);
3695
3732
  try {
3696
- await M().initializePluginConfig("yoyo"), O().info("[yoyoclaw] plugin config initialized");
3733
+ await j().initializePluginConfig("yoyo"), O().info("[yoyoclaw] plugin config initialized");
3697
3734
  } catch (e) {
3698
3735
  O().error(`[yoyoclaw] failed to initialize plugin config: ${String(e)}`);
3699
3736
  }
3700
3737
  try {
3701
- let e = await sn();
3702
- e?.token ? (O().info("[yoyoclaw-conn] token found, creating channel"), await ei(await W(), e)) : O().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");
3703
3740
  } catch (e) {
3704
3741
  O().error(`[yoyoclaw-conn] failed to initialize connection: ${String(e)}`);
3705
3742
  }
@@ -3708,16 +3745,18 @@ var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
3708
3745
  $(), O().info("[yoyoclaw-conn] stopping connection service"), Q &&= (await Q.destroy(), null);
3709
3746
  }
3710
3747
  });
3711
- async function ei(e, t) {
3712
- return Z.status = "connecting", O().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({
3713
3752
  type: G.CONNECTION_STATUS_CHANGED,
3714
3753
  timestamp: Date.now(),
3715
3754
  data: {
3716
3755
  status: "connecting",
3717
- previousStatus: Z.status
3756
+ previousStatus: n
3718
3757
  }
3719
3758
  }), new Promise((n, r) => {
3720
- Z.channel = new Qr({
3759
+ Z.channel = new ai({
3721
3760
  deviceInfo: e,
3722
3761
  userInfo: t,
3723
3762
  onOpen: () => {
@@ -3742,17 +3781,17 @@ async function ei(e, t) {
3742
3781
  },
3743
3782
  onDeviceNotRegistered: async () => {
3744
3783
  O().info("[yoyoclaw-conn] device not registered, handling...");
3745
- let t = await sn();
3784
+ let t = await mn();
3746
3785
  if (!t?.token) {
3747
3786
  O().info("[yoyoclaw-conn] no token available, treating as logout"), $();
3748
3787
  return;
3749
3788
  }
3750
3789
  try {
3751
- O().info("[yoyoclaw-conn] attempting to register device"), await It(e, t), O().info("[yoyoclaw-conn] device registered successfully, reconnecting..."), $(), await ei(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);
3752
3791
  } catch (e) {
3753
3792
  O().error(`[yoyoclaw-conn] device registration failed: ${String(e)}`), O().info("[yoyoclaw-conn] clearing token and destroying channel");
3754
3793
  try {
3755
- await cn();
3794
+ await hn();
3756
3795
  } catch (e) {
3757
3796
  O().error(`[yoyoclaw-conn] failed to clear token: ${String(e)}`);
3758
3797
  }
@@ -3762,7 +3801,7 @@ async function ei(e, t) {
3762
3801
  onUnauthorized: async () => {
3763
3802
  O().warn("[yoyoclaw-conn] connection unauthorized (401), clearing token and destroying channel");
3764
3803
  try {
3765
- await cn();
3804
+ await hn();
3766
3805
  } catch (e) {
3767
3806
  O().error(`[yoyoclaw-conn] failed to clear token: ${String(e)}`);
3768
3807
  }
@@ -3792,14 +3831,14 @@ function $() {
3792
3831
  }
3793
3832
  //#endregion
3794
3833
  //#region index.ts
3795
- var ti = {
3834
+ var ci = {
3796
3835
  id: "yoyo",
3797
3836
  name: "YOYOClaw",
3798
3837
  description: "OpenClaw Honor Yoyo connection plugin",
3799
- configSchema: Tn,
3838
+ configSchema: Mn,
3800
3839
  register(e) {
3801
- ce(e.runtime), _e(e.logger), e.registerService($r(e)), e.on("before_prompt_build", async () => ({ prependSystemContext: Sn })), xn(e);
3840
+ ce(e.runtime), _e(e.logger), e.registerService(oi(e)), e.on("before_prompt_build", async () => ({ prependSystemContext: kn })), On(e);
3802
3841
  }
3803
3842
  };
3804
3843
  //#endregion
3805
- export { ti as default };
3844
+ export { ci as default };