@honor-claw/yoyo 1.3.0-beta.2 → 1.3.0-beta.4
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.
- package/dist/index.mjs +465 -415
- 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.
|
|
26
|
+
return ae === null && (ae = "1.3.0-beta.4".includes("beta") || "1.3.0-beta.4".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 =
|
|
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:
|
|
125
|
-
},
|
|
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 =
|
|
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
|
|
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 &&=
|
|
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
|
|
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
|
|
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
|
|
177
|
+
function Te() {
|
|
178
178
|
return process.platform === "win32" ? process.env.USERPROFILE || "" : process.env.HOME || "";
|
|
179
179
|
}
|
|
180
|
-
function
|
|
181
|
-
let n = [], i =
|
|
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
|
|
194
|
-
let r =
|
|
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
|
|
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
|
-
|
|
253
|
-
|
|
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?.[
|
|
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?.[
|
|
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?.[
|
|
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?.[
|
|
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?.[
|
|
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
|
-
[
|
|
325
|
-
...t.plugins?.entries?.[
|
|
324
|
+
[A]: {
|
|
325
|
+
...t.plugins?.entries?.[A],
|
|
326
326
|
enabled: !0,
|
|
327
327
|
config: {
|
|
328
|
-
...t.plugins?.entries?.[
|
|
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
|
-
[
|
|
352
|
-
...t.plugins?.entries?.[
|
|
351
|
+
[A]: {
|
|
352
|
+
...t.plugins?.entries?.[A],
|
|
353
353
|
enabled: !0,
|
|
354
354
|
config: {
|
|
355
|
-
...t.plugins?.entries?.[
|
|
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?.[
|
|
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
|
-
[
|
|
382
|
-
...e.plugins?.entries?.[
|
|
381
|
+
[A]: {
|
|
382
|
+
...e.plugins?.entries?.[A],
|
|
383
383
|
enabled: !0,
|
|
384
384
|
config: {
|
|
385
|
-
...e.plugins?.entries?.[
|
|
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
|
-
[
|
|
409
|
-
...t.plugins?.entries?.[
|
|
408
|
+
[A]: {
|
|
409
|
+
...t.plugins?.entries?.[A],
|
|
410
410
|
enabled: !0,
|
|
411
411
|
config: {
|
|
412
|
-
...t.plugins?.entries?.[
|
|
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
|
-
[
|
|
433
|
-
...t.plugins?.entries?.[
|
|
432
|
+
[A]: {
|
|
433
|
+
...t.plugins?.entries?.[A],
|
|
434
434
|
enabled: !0,
|
|
435
435
|
config: {
|
|
436
|
-
...t.plugins?.entries?.[
|
|
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
|
-
[
|
|
457
|
-
...e.plugins?.entries?.[
|
|
456
|
+
[A]: {
|
|
457
|
+
...e.plugins?.entries?.[A],
|
|
458
458
|
config: {
|
|
459
|
-
...e.plugins?.entries?.[
|
|
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, ...
|
|
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
|
-
...
|
|
476
|
-
watchDebounceMs: s.watchDebounceMs ??
|
|
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
|
-
},
|
|
518
|
-
function
|
|
519
|
-
return
|
|
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
|
|
523
|
+
var Ne = {
|
|
524
524
|
env: "environment variable",
|
|
525
525
|
manual: "manual config"
|
|
526
526
|
};
|
|
527
|
-
function
|
|
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 =
|
|
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: ${
|
|
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
|
|
552
|
-
function
|
|
553
|
-
return
|
|
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
|
|
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
|
|
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
|
|
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
|
|
591
|
+
function ze(e, t) {
|
|
592
592
|
return !t && !!e;
|
|
593
593
|
}
|
|
594
|
-
function
|
|
595
|
-
let n =
|
|
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
|
|
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
|
-
},
|
|
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 =
|
|
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(
|
|
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
|
|
653
|
+
throw new Ve(r.statusCode, u, `HTTP request failed with status ${r.statusCode}`);
|
|
654
654
|
} catch (e) {
|
|
655
|
-
throw e instanceof
|
|
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
|
-
},
|
|
693
|
+
}, Ue = class {
|
|
694
694
|
httpClient;
|
|
695
695
|
constructor(e, t) {
|
|
696
|
-
this.httpClient = new
|
|
696
|
+
this.httpClient = new He(e, t);
|
|
697
697
|
}
|
|
698
698
|
async registerDevice(e, t, n) {
|
|
699
699
|
let r = {
|
|
700
|
-
"x-trace-id":
|
|
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":
|
|
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 =
|
|
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 (
|
|
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
|
|
757
|
-
let e =
|
|
758
|
-
return new
|
|
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
|
|
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("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll("\"", """).replaceAll("'", "'");
|
|
765
765
|
}
|
|
766
|
-
function
|
|
767
|
-
return !e || e.length === 0 ? "" : `<div class="details">${e.map((e) => `<div class="detail-item"><span class="detail-key">${
|
|
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
|
|
770
|
-
let t = e.statusClass === "success" ?
|
|
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>${
|
|
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>${
|
|
962
|
-
${
|
|
961
|
+
<h1>${P(e.title)}</h1>
|
|
962
|
+
${Je(e.details)}
|
|
963
963
|
<div class="footer">
|
|
964
|
-
<p class="hint">${
|
|
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
|
|
974
|
-
function
|
|
975
|
-
let n =
|
|
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
|
|
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(
|
|
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 ===
|
|
1009
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
-
},
|
|
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
|
|
1086
|
+
function et(e) {
|
|
1087
1087
|
return {
|
|
1088
|
-
...ue()?.env === "production" ?
|
|
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
|
|
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
|
|
1139
|
-
return new
|
|
1138
|
+
function nt(e) {
|
|
1139
|
+
return new tt(e);
|
|
1140
1140
|
}
|
|
1141
1141
|
//#endregion
|
|
1142
1142
|
//#region src/utils/fs-safe.ts
|
|
1143
|
-
var
|
|
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
|
-
},
|
|
1148
|
+
}, rt = new Set(["ENOENT", "ENOTDIR"]), it = new Set([
|
|
1149
1149
|
"ELOOP",
|
|
1150
1150
|
"EINVAL",
|
|
1151
1151
|
"ENOTSUP"
|
|
1152
1152
|
]);
|
|
1153
|
-
function
|
|
1153
|
+
function at(e) {
|
|
1154
1154
|
return !!(e && typeof e == "object" && "code" in e);
|
|
1155
1155
|
}
|
|
1156
|
-
function
|
|
1157
|
-
return
|
|
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
|
|
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 =
|
|
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
|
|
1175
|
+
function ct(e) {
|
|
1176
1176
|
return e === 0 || e === 0n;
|
|
1177
1177
|
}
|
|
1178
|
-
function
|
|
1179
|
-
return e.ino === t.ino ? e.dev === t.dev ? !0 : n === "win32" && (
|
|
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
|
|
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 (!
|
|
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
|
|
1204
|
+
if ((await v.lstat(e)).isDirectory()) throw new I("not-file", "not a file");
|
|
1205
1205
|
} catch (e) {
|
|
1206
|
-
if (e instanceof
|
|
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
|
|
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
|
|
1217
|
-
if (!r.isFile()) throw new
|
|
1218
|
-
if (t?.rejectHardlinks && r.nlink > 1) throw new
|
|
1219
|
-
if (process.platform !== "win32" && !
|
|
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
|
|
1222
|
-
if (process.platform !== "win32" && !
|
|
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
|
|
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 (!
|
|
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
|
|
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" && !
|
|
1262
|
-
if (!
|
|
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 (!
|
|
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
|
|
1276
|
+
if (e instanceof I || !L(e)) throw e;
|
|
1277
1277
|
}
|
|
1278
1278
|
let o = e.mode === "append";
|
|
1279
|
-
if (o && !a) throw new
|
|
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
|
|
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
|
|
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
|
|
1308
|
-
if (!
|
|
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 (!
|
|
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
|
|
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
|
|
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/
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
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
|
|
1457
|
+
function Vt(e) {
|
|
1443
1458
|
return e.toString("base64").replaceAll("+", "-").replaceAll("/", "_").replace(/=+$/g, "");
|
|
1444
1459
|
}
|
|
1445
|
-
function
|
|
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
|
|
1453
|
-
let t =
|
|
1467
|
+
function Ut(e) {
|
|
1468
|
+
let t = Ht(e);
|
|
1454
1469
|
return h.createHash("sha256").update(t).digest("hex");
|
|
1455
1470
|
}
|
|
1456
|
-
async function
|
|
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:
|
|
1480
|
+
deviceId: Ut(n),
|
|
1466
1481
|
publicKeyPem: n,
|
|
1467
1482
|
privateKeyPem: r,
|
|
1468
1483
|
createdAtMs: Date.now()
|
|
1469
1484
|
};
|
|
1470
1485
|
}
|
|
1471
|
-
async function
|
|
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 =
|
|
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
|
|
1501
|
+
let t = await Wt();
|
|
1487
1502
|
return await Pt(t), t;
|
|
1488
1503
|
}
|
|
1489
|
-
function
|
|
1504
|
+
async function Kt() {
|
|
1505
|
+
return (await Nt())?.gatewayAuthMd5;
|
|
1506
|
+
}
|
|
1507
|
+
function qt(e, t) {
|
|
1490
1508
|
let n = h.createPrivateKey(e);
|
|
1491
|
-
return
|
|
1509
|
+
return Vt(h.sign(null, Buffer.from(t, "utf8"), n));
|
|
1492
1510
|
}
|
|
1493
|
-
function
|
|
1494
|
-
return
|
|
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
|
|
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
|
|
1538
|
+
var Qt = class {
|
|
1506
1539
|
async ensureInitialized() {}
|
|
1507
1540
|
getLinuxDeviceModel() {
|
|
1508
|
-
return
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1696
|
-
switch (
|
|
1697
|
-
case "pad": return new
|
|
1698
|
-
case "windows": return new
|
|
1699
|
-
case "linux": return new
|
|
1700
|
-
case "macos": return new
|
|
1701
|
-
default: return new
|
|
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 =
|
|
1740
|
+
let e = on(), t = j();
|
|
1708
1741
|
await e.ensureInitialized();
|
|
1709
|
-
let n = await
|
|
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
|
|
1771
|
+
function sn(e) {
|
|
1739
1772
|
return typeof e == "string" && e.trim() || "";
|
|
1740
1773
|
}
|
|
1741
|
-
function
|
|
1774
|
+
function cn(e) {
|
|
1742
1775
|
return e.replace(/[A-Z]/g, (e) => String.fromCharCode(e.charCodeAt(0) + 32));
|
|
1743
1776
|
}
|
|
1744
|
-
function
|
|
1745
|
-
let t =
|
|
1746
|
-
return 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
|
|
1751
|
-
let t = e.scopes.join(","), n = e.token ?? "", r =
|
|
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
|
|
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 =
|
|
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 =
|
|
1815
|
+
}), f = qt(t.privateKeyPem, d);
|
|
1783
1816
|
return {
|
|
1784
1817
|
id: t.deviceId,
|
|
1785
|
-
publicKey:
|
|
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
|
|
1826
|
+
async function fn(e, t = !0) {
|
|
1794
1827
|
try {
|
|
1795
|
-
let n =
|
|
1828
|
+
let n = j(), r = e.jwtToken;
|
|
1796
1829
|
if (!r && e.userId) {
|
|
1797
1830
|
let t = e.deviceInfo || await W();
|
|
1798
|
-
r = (await
|
|
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
|
|
1813
|
-
let t = await W(), n = await
|
|
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
|
|
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
|
|
1856
|
+
return await j().clearUserConfig(), null;
|
|
1824
1857
|
}
|
|
1825
|
-
async function
|
|
1858
|
+
async function mn() {
|
|
1826
1859
|
let e = O();
|
|
1827
1860
|
try {
|
|
1828
|
-
let t =
|
|
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
|
|
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
|
|
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
|
|
1872
|
+
async function hn() {
|
|
1840
1873
|
try {
|
|
1841
|
-
await
|
|
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
|
|
1849
|
-
let n =
|
|
1881
|
+
async function gn(e, t) {
|
|
1882
|
+
let n = et(t);
|
|
1850
1883
|
O().debug?.("Starting Honor login flow...");
|
|
1851
|
-
let r =
|
|
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
|
|
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
|
|
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
|
|
1887
|
-
let e =
|
|
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 =
|
|
1890
|
-
if (!
|
|
1891
|
-
await
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
}({}),
|
|
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
|
|
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
|
|
2051
|
+
var Cn = class {
|
|
2019
2052
|
currentStatus;
|
|
2020
2053
|
storage;
|
|
2021
2054
|
autoSave;
|
|
2022
2055
|
saveTimer;
|
|
2023
2056
|
constructor(e = !0) {
|
|
2024
|
-
this.currentStatus =
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
2195
|
+
let t = await new xn().load(), n = null;
|
|
2163
2196
|
try {
|
|
2164
2197
|
n = await W();
|
|
2165
2198
|
} catch {}
|
|
2166
|
-
let r =
|
|
2167
|
-
|
|
2199
|
+
let r = j().getEnvInfo();
|
|
2200
|
+
Tn(t, n, r);
|
|
2168
2201
|
});
|
|
2169
2202
|
}
|
|
2170
|
-
function
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
2241
|
+
function On(e) {
|
|
2209
2242
|
e.registerCli((t) => {
|
|
2210
2243
|
let n = t.program.command("honor").description("Commands for honor yoyoclaw");
|
|
2211
|
-
|
|
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
|
|
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
|
-
}),
|
|
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
|
-
}),
|
|
2228
|
-
user:
|
|
2229
|
-
device:
|
|
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
|
|
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
|
|
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:${
|
|
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 =
|
|
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 =
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
2352
|
+
}, Ln = {
|
|
2320
2353
|
role: "operator",
|
|
2321
2354
|
scopes: [],
|
|
2322
|
-
clientId:
|
|
2355
|
+
clientId: Fn.CLI,
|
|
2323
2356
|
displayName: "Protocol Client",
|
|
2324
|
-
clientMode:
|
|
2325
|
-
},
|
|
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
|
-
...
|
|
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 ??
|
|
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:
|
|
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:
|
|
2437
|
+
version: zn,
|
|
2405
2438
|
platform: process.platform,
|
|
2406
|
-
deviceFamily:
|
|
2439
|
+
deviceFamily: Bn,
|
|
2407
2440
|
mode: e
|
|
2408
2441
|
},
|
|
2409
2442
|
role: this.config.role,
|
|
2410
2443
|
scopes: this.config.scopes,
|
|
2411
|
-
auth: {
|
|
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
|
-
},
|
|
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 >=
|
|
2482
|
-
O().error(`[protocol-gateway] max reconnect attempts (${
|
|
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}/${
|
|
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
|
-
},
|
|
2523
|
+
}, Hn);
|
|
2488
2524
|
}
|
|
2489
2525
|
}
|
|
2490
|
-
},
|
|
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:
|
|
2536
|
+
clientId: Fn.CLI,
|
|
2501
2537
|
displayName: "YOYO-Control",
|
|
2502
|
-
clientMode:
|
|
2503
|
-
},
|
|
2538
|
+
clientMode: In.BACKEND
|
|
2539
|
+
}, Gn = class extends Un {
|
|
2504
2540
|
constructor(e = {}) {
|
|
2505
|
-
super(e,
|
|
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
|
-
},
|
|
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 =
|
|
2550
|
-
this.client = new
|
|
2551
|
-
token:
|
|
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
|
-
},
|
|
2605
|
-
function
|
|
2606
|
-
let n =
|
|
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:
|
|
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
|
|
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
|
|
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 } =
|
|
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 =
|
|
2704
|
-
if (O().debug?.(`[yoyoclaw-channel] received cloud message from session ${n.wsOutputEvent?.sourceDeviceId}, deviceId ${n.wsOutputEvent?.sourceDeviceInfo?.deviceId || "nil"}, ${t.slice(0,
|
|
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,
|
|
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 =
|
|
2746
|
-
return Math.min(e,
|
|
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
|
-
},
|
|
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
|
-
},
|
|
2779
|
-
async function
|
|
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 =
|
|
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(
|
|
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
|
|
2838
|
+
function or(e) {
|
|
2802
2839
|
let t = e.trim();
|
|
2803
|
-
if (!(!t ||
|
|
2840
|
+
if (!(!t || ir.test(t) || sr(t))) return `${t}.json`;
|
|
2804
2841
|
}
|
|
2805
|
-
function
|
|
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
|
|
2812
|
-
async function
|
|
2813
|
-
await
|
|
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
|
|
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
|
|
2855
|
+
async function ur(e) {
|
|
2819
2856
|
try {
|
|
2820
|
-
return (await v.stat(r.join(e,
|
|
2857
|
+
return (await v.stat(r.join(e, cr))).isFile();
|
|
2821
2858
|
} catch {
|
|
2822
2859
|
return !1;
|
|
2823
2860
|
}
|
|
2824
2861
|
}
|
|
2825
|
-
async function
|
|
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 (
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
2887
|
+
async function mr(e, t, n = {}) {
|
|
2851
2888
|
await v.mkdir(e, { recursive: !0 });
|
|
2852
|
-
let i = await v.realpath(e), a = await
|
|
2889
|
+
let i = await v.realpath(e), a = await hr(t);
|
|
2853
2890
|
if (a.exists) {
|
|
2854
2891
|
if (a.isLink) {
|
|
2855
|
-
if (await
|
|
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
|
|
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 ??
|
|
2905
|
+
return await (n.copyFallback ?? lr)(i, t), { mode: "copy-fallback" };
|
|
2869
2906
|
}
|
|
2870
2907
|
}
|
|
2871
|
-
async function
|
|
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 (
|
|
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
|
|
2925
|
+
async function gr(e, t) {
|
|
2889
2926
|
try {
|
|
2890
|
-
return
|
|
2927
|
+
return vr(await v.realpath(e), t);
|
|
2891
2928
|
} catch {
|
|
2892
2929
|
return !1;
|
|
2893
2930
|
}
|
|
2894
2931
|
}
|
|
2895
|
-
async function
|
|
2896
|
-
return t ? (await v.readdir(e)).length === 0 || await
|
|
2932
|
+
async function _r(e, t) {
|
|
2933
|
+
return t ? (await v.readdir(e)).length === 0 || await ur(e) : !1;
|
|
2897
2934
|
}
|
|
2898
|
-
function
|
|
2935
|
+
function vr(e, t) {
|
|
2899
2936
|
return process.platform === "win32" ? e.toLowerCase() === t.toLowerCase() : e === t;
|
|
2900
2937
|
}
|
|
2901
|
-
function
|
|
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
|
|
2907
|
-
function
|
|
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
|
|
2914
|
-
return JSON.stringify(
|
|
2950
|
+
function Cr(e) {
|
|
2951
|
+
return JSON.stringify(Or(e));
|
|
2915
2952
|
}
|
|
2916
|
-
function
|
|
2917
|
-
return g("md5").update(
|
|
2953
|
+
function wr(e) {
|
|
2954
|
+
return e.length === 0 ? "" : g("md5").update(Cr(e)).digest("hex");
|
|
2918
2955
|
}
|
|
2919
|
-
async function
|
|
2956
|
+
async function Tr(e) {
|
|
2920
2957
|
try {
|
|
2921
2958
|
let t = await _t({
|
|
2922
2959
|
rootDir: e,
|
|
2923
|
-
relativePath:
|
|
2924
|
-
maxBytes:
|
|
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
|
|
2968
|
+
if (e instanceof I && e.code === "not-found") return Sr();
|
|
2932
2969
|
throw e;
|
|
2933
2970
|
}
|
|
2934
2971
|
}
|
|
2935
|
-
async function
|
|
2936
|
-
let r = (await
|
|
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
|
|
2980
|
+
async function Dr(e, t, n, r = Date.now()) {
|
|
2944
2981
|
let i = {
|
|
2945
2982
|
version: 1,
|
|
2946
2983
|
nodes: {
|
|
2947
|
-
...(await
|
|
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:
|
|
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
|
|
2963
|
-
if (Array.isArray(e)) return e.map(
|
|
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] =
|
|
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
|
|
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
|
-
return e;
|
|
3019
|
+
return O().debug?.(`DeviceToolSet payload received: ${JSON.stringify(t, null, 2)}`), e;
|
|
2983
3020
|
}
|
|
2984
|
-
function
|
|
3021
|
+
function Ar(e) {
|
|
2985
3022
|
let t = e.nodeId, n = [], r = 0;
|
|
2986
3023
|
for (let t of e.toolSet) {
|
|
2987
|
-
let e =
|
|
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
|
|
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,137 +3045,148 @@ function wr(e) {
|
|
|
3008
3045
|
}
|
|
3009
3046
|
//#endregion
|
|
3010
3047
|
//#region src/modules/device-toolset/persist.ts
|
|
3011
|
-
var
|
|
3012
|
-
function
|
|
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
|
|
3055
|
+
async function Fr(e) {
|
|
3019
3056
|
try {
|
|
3020
3057
|
let t = await _t({
|
|
3021
3058
|
rootDir: e,
|
|
3022
|
-
relativePath:
|
|
3023
|
-
maxBytes:
|
|
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
|
|
3067
|
+
if (e instanceof I && e.code === "not-found") return Pr();
|
|
3031
3068
|
throw e;
|
|
3032
3069
|
}
|
|
3033
3070
|
}
|
|
3034
|
-
async function
|
|
3071
|
+
async function Ir(e, t, n) {
|
|
3035
3072
|
let r = {
|
|
3036
3073
|
version: 1,
|
|
3037
|
-
tools:
|
|
3074
|
+
tools: Lr((await Fr(e)).tools, t, n)
|
|
3038
3075
|
};
|
|
3039
3076
|
return await B({
|
|
3040
3077
|
rootDir: e,
|
|
3041
|
-
relativePath:
|
|
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:
|
|
3084
|
+
nodeCount: Br(r.tools),
|
|
3048
3085
|
toolCount: Object.keys(r.tools).length,
|
|
3049
3086
|
cache: r
|
|
3050
3087
|
};
|
|
3051
3088
|
}
|
|
3052
|
-
function
|
|
3053
|
-
let r =
|
|
3089
|
+
function Lr(e, t, n) {
|
|
3090
|
+
let r = Rr(e, t);
|
|
3054
3091
|
for (let e of n) {
|
|
3055
3092
|
let n = r[e.id];
|
|
3056
3093
|
r[e.id] = {
|
|
3057
3094
|
id: e.id,
|
|
3058
3095
|
name: e.name,
|
|
3059
3096
|
description: e.description,
|
|
3060
|
-
supportedNodeIds:
|
|
3097
|
+
supportedNodeIds: zr(n?.supportedNodeIds ?? [], t)
|
|
3061
3098
|
};
|
|
3062
3099
|
}
|
|
3063
3100
|
return r;
|
|
3064
3101
|
}
|
|
3065
|
-
function
|
|
3102
|
+
function Rr(e, t) {
|
|
3103
|
+
let n = {};
|
|
3104
|
+
for (let [r, i] of Object.entries(e)) {
|
|
3105
|
+
let e = i.supportedNodeIds.filter((e) => e !== t);
|
|
3106
|
+
e.length > 0 && (n[r] = {
|
|
3107
|
+
...i,
|
|
3108
|
+
supportedNodeIds: e
|
|
3109
|
+
});
|
|
3110
|
+
}
|
|
3111
|
+
return n;
|
|
3112
|
+
}
|
|
3113
|
+
function zr(e, t) {
|
|
3066
3114
|
return [...new Set([...e, t])];
|
|
3067
3115
|
}
|
|
3068
|
-
function
|
|
3116
|
+
function Br(e) {
|
|
3069
3117
|
let t = /* @__PURE__ */ new Set();
|
|
3070
3118
|
for (let n of Object.values(e)) for (let e of n.supportedNodeIds) t.add(e);
|
|
3071
3119
|
return t.size;
|
|
3072
3120
|
}
|
|
3073
3121
|
//#endregion
|
|
3074
3122
|
//#region src/modules/device-toolset/skill-inject.ts
|
|
3075
|
-
var
|
|
3076
|
-
async function
|
|
3077
|
-
let n = r.join(e,
|
|
3123
|
+
var Vr = r.join("skills", "yoyo-control", "SKILL.md"), Hr = r.join("skills", "yoyo-control", "configs", "sub-skills.json"), Ur = "{{full-mcp-tool-list}}", Wr = "<!-- yoyo-mcp-tools:start -->", Gr = "<!-- yoyo-mcp-tools:end -->";
|
|
3124
|
+
async function Kr(e, t) {
|
|
3125
|
+
let n = r.join(e, Vr), i = await v.readFile(n, "utf8"), a = Jr(t, await qr(e)), o = Xr(i, Yr(a));
|
|
3078
3126
|
return o !== i && await v.writeFile(n, o, "utf8"), {
|
|
3079
3127
|
skillPath: n,
|
|
3080
3128
|
rowCount: Object.keys(a).length
|
|
3081
3129
|
};
|
|
3082
3130
|
}
|
|
3083
|
-
async function
|
|
3084
|
-
let t = r.join(e,
|
|
3131
|
+
async function qr(e) {
|
|
3132
|
+
let t = r.join(e, Hr), n;
|
|
3085
3133
|
try {
|
|
3086
3134
|
n = await v.readFile(t, "utf8");
|
|
3087
3135
|
} catch (e) {
|
|
3088
|
-
if (
|
|
3136
|
+
if ($r(e) && e.code === "ENOENT") return /* @__PURE__ */ new Set();
|
|
3089
3137
|
throw e;
|
|
3090
3138
|
}
|
|
3091
3139
|
let i = JSON.parse(n);
|
|
3092
3140
|
if (!Array.isArray(i) || i.some((e) => typeof e != "string")) throw Error("sub-skills config must be a JSON array of tool names");
|
|
3093
3141
|
return new Set(i.map((e) => e.trim()).filter(Boolean));
|
|
3094
3142
|
}
|
|
3095
|
-
function
|
|
3143
|
+
function Jr(e, t) {
|
|
3096
3144
|
return t.size === 0 ? e : Object.fromEntries(Object.entries(e).filter(([e, n]) => !t.has(e) && !t.has(n.name)));
|
|
3097
3145
|
}
|
|
3098
|
-
function
|
|
3146
|
+
function Yr(e) {
|
|
3099
3147
|
return [
|
|
3100
|
-
|
|
3101
|
-
...Object.values(e).toSorted((e, t) => e.name.localeCompare(t.name)).map((e) => `| ${
|
|
3102
|
-
|
|
3148
|
+
Wr,
|
|
3149
|
+
...Object.values(e).toSorted((e, t) => e.name.localeCompare(t.name)).map((e) => `| ${Zr(e.name)} | ${Zr(e.description)} | ${Zr(e.supportedNodeIds.join(", "))} |`),
|
|
3150
|
+
Gr
|
|
3103
3151
|
].join("\n");
|
|
3104
3152
|
}
|
|
3105
|
-
function
|
|
3106
|
-
let n = RegExp(`${Wr
|
|
3153
|
+
function Xr(e, t) {
|
|
3154
|
+
let n = RegExp(`${Qr(Wr)}[\\s\\S]*?${Qr(Gr)}`);
|
|
3107
3155
|
if (n.test(e)) return e.replace(n, t);
|
|
3108
|
-
if (e.includes(
|
|
3156
|
+
if (e.includes(Ur)) return e.replace(Ur, t);
|
|
3109
3157
|
throw Error("Unable to find MCP tools placeholder or generated block in yoyo-control skill");
|
|
3110
3158
|
}
|
|
3111
|
-
function
|
|
3159
|
+
function Zr(e) {
|
|
3112
3160
|
return e.replaceAll("|", "\\|").replace(/\r?\n/g, " ");
|
|
3113
3161
|
}
|
|
3114
|
-
function
|
|
3162
|
+
function Qr(e) {
|
|
3115
3163
|
return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
3116
3164
|
}
|
|
3117
|
-
function
|
|
3165
|
+
function $r(e) {
|
|
3118
3166
|
return e instanceof Error && "code" in e;
|
|
3119
3167
|
}
|
|
3120
3168
|
//#endregion
|
|
3121
3169
|
//#region src/modules/device-toolset/processor.ts
|
|
3122
|
-
var
|
|
3123
|
-
async function
|
|
3124
|
-
let t =
|
|
3170
|
+
var ei = Ct();
|
|
3171
|
+
async function ti(e) {
|
|
3172
|
+
let t = kr(e), n = wt();
|
|
3125
3173
|
if (!n) throw Error("Unable to resolve home directory for DeviceToolSet persistence");
|
|
3126
|
-
let i =
|
|
3174
|
+
let i = Ar(t);
|
|
3127
3175
|
O().info(`[yoyoclaw-device-toolset] process start, nodeId: ${i.nodeId}, tools: ${i.tools.length}, skipped: ${i.skippedCount}`);
|
|
3128
|
-
let a =
|
|
3129
|
-
if (O().debug?.(`[yoyoclaw-device-toolset] computed md5, nodeId: ${i.nodeId}, md5: ${a}`), !(await
|
|
3176
|
+
let a = wr(i.tools);
|
|
3177
|
+
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
3178
|
changed: !1,
|
|
3131
3179
|
nodeId: i.nodeId,
|
|
3132
3180
|
skippedCount: i.skippedCount
|
|
3133
3181
|
};
|
|
3134
|
-
let o = await
|
|
3182
|
+
let o = await Ir(n, i.nodeId, i.tools);
|
|
3135
3183
|
O().info(`[yoyoclaw-device-toolset] cache merged, nodeId: ${i.nodeId}, supportedNodes: ${o.nodeCount}, tools: ${o.toolCount}`);
|
|
3136
|
-
let s = o.cache.tools, c = await
|
|
3184
|
+
let s = o.cache.tools, c = await ar(n, i.tools);
|
|
3137
3185
|
O().info(`[yoyoclaw-device-toolset] archive refreshed, nodeId: ${i.nodeId}, written: ${c.writtenCount}, skipped: ${c.skippedCount}`);
|
|
3138
|
-
let l = await
|
|
3186
|
+
let l = await Kr(ei, s);
|
|
3139
3187
|
O().info(`[yoyoclaw-device-toolset] skill refreshed, nodeId: ${i.nodeId}, rows: ${l.rowCount}`);
|
|
3140
|
-
let u = await
|
|
3141
|
-
return O().info(`[yoyoclaw-device-toolset] mapping ready, nodeId: ${i.nodeId}, mode: ${u.mode}`), await
|
|
3188
|
+
let u = await mr(c.archiveDir, r.join(ei, "skills", "yoyo-control", "mcptools"));
|
|
3189
|
+
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
3190
|
changed: !0,
|
|
3143
3191
|
nodeId: i.nodeId,
|
|
3144
3192
|
nodeCount: o.nodeCount,
|
|
@@ -3148,7 +3196,7 @@ async function qr(e) {
|
|
|
3148
3196
|
}
|
|
3149
3197
|
//#endregion
|
|
3150
3198
|
//#region src/cloud-channel/message-handler.ts
|
|
3151
|
-
var
|
|
3199
|
+
var ni = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", ri = class {
|
|
3152
3200
|
sessionManager;
|
|
3153
3201
|
adminClientManager;
|
|
3154
3202
|
config;
|
|
@@ -3425,7 +3473,7 @@ var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
|
|
|
3425
3473
|
ok: !1,
|
|
3426
3474
|
error: "Missing content in context payload"
|
|
3427
3475
|
};
|
|
3428
|
-
let r =
|
|
3476
|
+
let r = ni.style, i = await e.setAgentFile(r, n);
|
|
3429
3477
|
return i.ok ? {
|
|
3430
3478
|
ok: !0,
|
|
3431
3479
|
data: { name: "style" }
|
|
@@ -3514,14 +3562,14 @@ var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
|
|
|
3514
3562
|
async updateDeviceToolSetContext(e, t, n) {
|
|
3515
3563
|
return n?.header.namespace === "yoyoclaw" ? {
|
|
3516
3564
|
ok: !0,
|
|
3517
|
-
data: await
|
|
3565
|
+
data: await ti(t),
|
|
3518
3566
|
noReply: !0
|
|
3519
3567
|
} : {
|
|
3520
3568
|
ok: !1,
|
|
3521
3569
|
error: `Unsupported DeviceToolSet namespace: ${n?.header.namespace ?? "unknown"}`
|
|
3522
3570
|
};
|
|
3523
3571
|
}
|
|
3524
|
-
},
|
|
3572
|
+
}, ii = class extends Pn {
|
|
3525
3573
|
nodeOpts;
|
|
3526
3574
|
sessionId;
|
|
3527
3575
|
hardwareDeviceId;
|
|
@@ -3563,7 +3611,7 @@ var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
|
|
|
3563
3611
|
onError(e) {
|
|
3564
3612
|
O().error(`[yoyoclaw-nodeGatewayClient] error for session: ${this.sessionId}, device: ${this.hardwareDeviceId}: ${e.message}`);
|
|
3565
3613
|
}
|
|
3566
|
-
},
|
|
3614
|
+
}, ai = class {
|
|
3567
3615
|
nodeGatewayClientsMap = /* @__PURE__ */ new Map();
|
|
3568
3616
|
deviceSessionsMap = /* @__PURE__ */ new Map();
|
|
3569
3617
|
sessionIdToHardwareDeviceMap = /* @__PURE__ */ new Map();
|
|
@@ -3596,7 +3644,7 @@ var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
|
|
|
3596
3644
|
this.nodeGatewayClientsMap.set(e, t);
|
|
3597
3645
|
}
|
|
3598
3646
|
createNodeGatewayClient(e) {
|
|
3599
|
-
let t = new
|
|
3647
|
+
let t = new ii({
|
|
3600
3648
|
sessionId: e.sessionId,
|
|
3601
3649
|
hardwareDeviceId: e.hardwareDeviceId,
|
|
3602
3650
|
deviceInfo: e.deviceInfo,
|
|
@@ -3628,14 +3676,14 @@ var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
|
|
|
3628
3676
|
getSessionCount() {
|
|
3629
3677
|
return this.sessionIdToHardwareDeviceMap.size;
|
|
3630
3678
|
}
|
|
3631
|
-
},
|
|
3679
|
+
}, oi = class {
|
|
3632
3680
|
cloudClient;
|
|
3633
3681
|
sessionManager;
|
|
3634
3682
|
adminClientManager;
|
|
3635
3683
|
messageHandler;
|
|
3636
3684
|
config;
|
|
3637
3685
|
constructor(e) {
|
|
3638
|
-
this.config = e, this.sessionManager = new
|
|
3686
|
+
this.config = e, this.sessionManager = new ai(), this.adminClientManager = new Kn({ onStatusEvent: this.handleStatusEvent }), this.messageHandler = new ri({
|
|
3639
3687
|
sessionManager: this.sessionManager,
|
|
3640
3688
|
adminClientManager: this.adminClientManager,
|
|
3641
3689
|
config: {
|
|
@@ -3643,7 +3691,7 @@ var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
|
|
|
3643
3691
|
onStatusEvent: this.handleStatusEvent,
|
|
3644
3692
|
onReply: (e) => this.cloudClient.send(e)
|
|
3645
3693
|
}
|
|
3646
|
-
}), this.cloudClient = new
|
|
3694
|
+
}), this.cloudClient = new nr({
|
|
3647
3695
|
deviceInfo: e.deviceInfo,
|
|
3648
3696
|
userInfo: e.userInfo,
|
|
3649
3697
|
onMessage: this.messageHandler.handleCloudMessage,
|
|
@@ -3682,10 +3730,10 @@ var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
|
|
|
3682
3730
|
}, Z = {
|
|
3683
3731
|
channel: null,
|
|
3684
3732
|
status: "idle"
|
|
3685
|
-
}, Q = null,
|
|
3733
|
+
}, Q = null, si = (e) => ({
|
|
3686
3734
|
id: "yoyoclaw-connection",
|
|
3687
3735
|
async start() {
|
|
3688
|
-
O().info("[yoyoclaw] plugin service enabled"), Q = new
|
|
3736
|
+
O().info("[yoyoclaw] plugin service enabled"), Q = new Cn(!0);
|
|
3689
3737
|
try {
|
|
3690
3738
|
await Q.loadAndCleanStatus(), O().info("[yoyoclaw-conn] status tracker initialized and cleaned");
|
|
3691
3739
|
} catch (e) {
|
|
@@ -3693,13 +3741,13 @@ var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
|
|
|
3693
3741
|
}
|
|
3694
3742
|
O().debug?.(`[yoyoclaw] agents: ${JSON.stringify(e.config.agents?.defaults)}`);
|
|
3695
3743
|
try {
|
|
3696
|
-
await
|
|
3744
|
+
await j().initializePluginConfig("yoyo"), O().info("[yoyoclaw] plugin config initialized");
|
|
3697
3745
|
} catch (e) {
|
|
3698
3746
|
O().error(`[yoyoclaw] failed to initialize plugin config: ${String(e)}`);
|
|
3699
3747
|
}
|
|
3700
3748
|
try {
|
|
3701
|
-
let e = await
|
|
3702
|
-
e?.token ? (O().info("[yoyoclaw-conn] token found, creating channel"), await
|
|
3749
|
+
let e = await mn();
|
|
3750
|
+
e?.token ? (O().info("[yoyoclaw-conn] token found, creating channel"), await ci(await W(), e)) : O().info("[yoyoclaw-conn] no token found, skipping channel creation");
|
|
3703
3751
|
} catch (e) {
|
|
3704
3752
|
O().error(`[yoyoclaw-conn] failed to initialize connection: ${String(e)}`);
|
|
3705
3753
|
}
|
|
@@ -3708,16 +3756,18 @@ var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
|
|
|
3708
3756
|
$(), O().info("[yoyoclaw-conn] stopping connection service"), Q &&= (await Q.destroy(), null);
|
|
3709
3757
|
}
|
|
3710
3758
|
});
|
|
3711
|
-
async function
|
|
3712
|
-
|
|
3759
|
+
async function ci(e, t) {
|
|
3760
|
+
O().info(`[yoyoclaw-conn] creating new channel for device: ${e.deviceId}`), await Xt(e, t);
|
|
3761
|
+
let n = Z.status;
|
|
3762
|
+
return Z.status = "connecting", Q && await Q.handleEvent({
|
|
3713
3763
|
type: G.CONNECTION_STATUS_CHANGED,
|
|
3714
3764
|
timestamp: Date.now(),
|
|
3715
3765
|
data: {
|
|
3716
3766
|
status: "connecting",
|
|
3717
|
-
previousStatus:
|
|
3767
|
+
previousStatus: n
|
|
3718
3768
|
}
|
|
3719
3769
|
}), new Promise((n, r) => {
|
|
3720
|
-
Z.channel = new
|
|
3770
|
+
Z.channel = new oi({
|
|
3721
3771
|
deviceInfo: e,
|
|
3722
3772
|
userInfo: t,
|
|
3723
3773
|
onOpen: () => {
|
|
@@ -3742,17 +3792,17 @@ async function ei(e, t) {
|
|
|
3742
3792
|
},
|
|
3743
3793
|
onDeviceNotRegistered: async () => {
|
|
3744
3794
|
O().info("[yoyoclaw-conn] device not registered, handling...");
|
|
3745
|
-
let t = await
|
|
3795
|
+
let t = await mn();
|
|
3746
3796
|
if (!t?.token) {
|
|
3747
3797
|
O().info("[yoyoclaw-conn] no token available, treating as logout"), $();
|
|
3748
3798
|
return;
|
|
3749
3799
|
}
|
|
3750
3800
|
try {
|
|
3751
|
-
O().info("[yoyoclaw-conn] attempting to register device"), await
|
|
3801
|
+
O().info("[yoyoclaw-conn] attempting to register device"), await Yt(e, t), O().info("[yoyoclaw-conn] device registered successfully, reconnecting..."), $(), await ci(e, t);
|
|
3752
3802
|
} catch (e) {
|
|
3753
3803
|
O().error(`[yoyoclaw-conn] device registration failed: ${String(e)}`), O().info("[yoyoclaw-conn] clearing token and destroying channel");
|
|
3754
3804
|
try {
|
|
3755
|
-
await
|
|
3805
|
+
await hn();
|
|
3756
3806
|
} catch (e) {
|
|
3757
3807
|
O().error(`[yoyoclaw-conn] failed to clear token: ${String(e)}`);
|
|
3758
3808
|
}
|
|
@@ -3762,7 +3812,7 @@ async function ei(e, t) {
|
|
|
3762
3812
|
onUnauthorized: async () => {
|
|
3763
3813
|
O().warn("[yoyoclaw-conn] connection unauthorized (401), clearing token and destroying channel");
|
|
3764
3814
|
try {
|
|
3765
|
-
await
|
|
3815
|
+
await hn();
|
|
3766
3816
|
} catch (e) {
|
|
3767
3817
|
O().error(`[yoyoclaw-conn] failed to clear token: ${String(e)}`);
|
|
3768
3818
|
}
|
|
@@ -3792,14 +3842,14 @@ function $() {
|
|
|
3792
3842
|
}
|
|
3793
3843
|
//#endregion
|
|
3794
3844
|
//#region index.ts
|
|
3795
|
-
var
|
|
3845
|
+
var li = {
|
|
3796
3846
|
id: "yoyo",
|
|
3797
3847
|
name: "YOYOClaw",
|
|
3798
3848
|
description: "OpenClaw Honor Yoyo connection plugin",
|
|
3799
|
-
configSchema:
|
|
3849
|
+
configSchema: Mn,
|
|
3800
3850
|
register(e) {
|
|
3801
|
-
ce(e.runtime), _e(e.logger), e.registerService(
|
|
3851
|
+
ce(e.runtime), _e(e.logger), e.registerService(si(e)), e.on("before_prompt_build", async () => ({ prependSystemContext: kn })), On(e);
|
|
3802
3852
|
}
|
|
3803
3853
|
};
|
|
3804
3854
|
//#endregion
|
|
3805
|
-
export {
|
|
3855
|
+
export { li as default };
|