@honor-claw/yoyo 1.3.0-alpha.1 → 1.3.0-beta.1
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
CHANGED
|
@@ -8,10 +8,10 @@ import d from "open";
|
|
|
8
8
|
import { customAlphabet as f } from "nanoid";
|
|
9
9
|
import { ProxyAgent as p, request as m } from "undici";
|
|
10
10
|
import { HttpProxyAgent as ee } from "http-proxy-agent";
|
|
11
|
-
import { HttpsProxyAgent as
|
|
12
|
-
import { createServer as
|
|
13
|
-
import { URL as
|
|
14
|
-
import { createHash as
|
|
11
|
+
import { HttpsProxyAgent as te } from "https-proxy-agent";
|
|
12
|
+
import { createServer as ne } from "http";
|
|
13
|
+
import { URL as re, fileURLToPath as h } from "node:url";
|
|
14
|
+
import { createHash as g, randomBytes as ie } from "crypto";
|
|
15
15
|
import _, { createHash as ae, randomUUID as oe } from "node:crypto";
|
|
16
16
|
import v from "node:fs/promises";
|
|
17
17
|
import se from "node:os";
|
|
@@ -238,7 +238,7 @@ function je(e, t) {
|
|
|
238
238
|
}
|
|
239
239
|
//#endregion
|
|
240
240
|
//#region src/modules/configs/config-manager.ts
|
|
241
|
-
var A = "yoyo", Me = /* @__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(","),
|
|
241
|
+
var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create,alarm.delete,alarm.disable,alarm.enable,alarm.query,alarm.update,app.close,app.open,call.phone,call.search,capture-screenshot,contact.search,file-upload,hotspot,local-search,message.search,message.send,mobile-data,no-disturb,quiet-mode,ringing-mode,schedule.create,schedule.delete,schedule.search,schedule.update,screen-record,vibration-mode,volume.operate,wlan,bluetooth,location-service,nfc,usb-shared-network,eyecomfort,status-bar-show,brightness,autoscreen-onnotice,dark-mode,device-operation,camera,app.uninstall,audio-record,battery,gui.create,gui.pause,gui.terminate,mcp.tool.call".split(","), Fe = class {
|
|
242
242
|
loadConfig() {
|
|
243
243
|
try {
|
|
244
244
|
return me().config.loadConfig();
|
|
@@ -479,14 +479,18 @@ var A = "yoyo", Me = /* @__PURE__ */ "alarm.create,alarm.delete,alarm.disable,al
|
|
|
479
479
|
}
|
|
480
480
|
async initializePluginConfig(e) {
|
|
481
481
|
try {
|
|
482
|
-
let t = this.loadConfig(), n = t.plugins?.allow || [], r = n.includes(e) ? n : [...n, e], i = t.gateway?.nodes?.allowCommands || [], a = Array.from(new Set([...i, ...
|
|
483
|
-
|
|
482
|
+
let t = this.loadConfig(), n = t.plugins?.allow || [], r = n.includes(e) ? n : [...n, e], i = t.gateway?.nodes?.allowCommands || [], a = Array.from(new Set([...i, ...Pe])), o = t.skills || {}, s = o.load || {}, c = s.watch === Me.watch && s.watchDebounceMs !== void 0 ? s : {
|
|
483
|
+
...s,
|
|
484
|
+
...Me,
|
|
485
|
+
watchDebounceMs: s.watchDebounceMs ?? Ne
|
|
486
|
+
}, l = t.plugins?.entries?.[e]?.config?.envInfo, u = t.plugins?.entries?.[e]?.config?.env, d = !!(l?.env || u), f = be(), p = !!l?.env && l.source === "env", m = !l?.env && !!u || p && f && l.env !== f, ee = !d || m, te = {
|
|
487
|
+
env: f || u || (de() ? "test" : "production"),
|
|
484
488
|
source: "env"
|
|
485
|
-
},
|
|
486
|
-
...
|
|
487
|
-
envInfo:
|
|
489
|
+
}, ne = t.plugins?.entries?.[e]?.config || {}, re = ee ? {
|
|
490
|
+
...ne,
|
|
491
|
+
envInfo: te,
|
|
488
492
|
env: void 0
|
|
489
|
-
} :
|
|
493
|
+
} : ne, h = Ce(t);
|
|
490
494
|
Object.keys(h).length > 0 && D().info(`[claw-configs] Found ${Object.keys(h).length} providers to rename: ${Object.entries(h).map(([e, t]) => `${e} -> ${t}`).join(", ")}`);
|
|
491
495
|
let g = {
|
|
492
496
|
...t,
|
|
@@ -498,7 +502,7 @@ var A = "yoyo", Me = /* @__PURE__ */ "alarm.create,alarm.delete,alarm.disable,al
|
|
|
498
502
|
[e]: {
|
|
499
503
|
...t.plugins?.entries?.[e],
|
|
500
504
|
enabled: !0,
|
|
501
|
-
config:
|
|
505
|
+
config: re
|
|
502
506
|
}
|
|
503
507
|
}
|
|
504
508
|
},
|
|
@@ -508,6 +512,10 @@ var A = "yoyo", Me = /* @__PURE__ */ "alarm.create,alarm.delete,alarm.disable,al
|
|
|
508
512
|
...t.gateway?.nodes,
|
|
509
513
|
allowCommands: a
|
|
510
514
|
}
|
|
515
|
+
},
|
|
516
|
+
skills: {
|
|
517
|
+
...o,
|
|
518
|
+
load: c
|
|
511
519
|
}
|
|
512
520
|
};
|
|
513
521
|
Object.keys(h).length > 0 && (g = we(g, h), D().info("[claw-configs] Provider renaming completed")), await this.saveConfig(g);
|
|
@@ -515,17 +523,17 @@ var A = "yoyo", Me = /* @__PURE__ */ "alarm.create,alarm.delete,alarm.disable,al
|
|
|
515
523
|
throw E(e, "failed to initialize plugin config");
|
|
516
524
|
}
|
|
517
525
|
}
|
|
518
|
-
},
|
|
526
|
+
}, Ie = null;
|
|
519
527
|
function j() {
|
|
520
|
-
return
|
|
528
|
+
return Ie ||= new Fe(), Ie;
|
|
521
529
|
}
|
|
522
530
|
//#endregion
|
|
523
531
|
//#region src/commands/env/impl.ts
|
|
524
|
-
var
|
|
532
|
+
var Le = {
|
|
525
533
|
env: "environment variable",
|
|
526
534
|
manual: "manual config"
|
|
527
535
|
};
|
|
528
|
-
function
|
|
536
|
+
function Re(e, t) {
|
|
529
537
|
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) => {
|
|
530
538
|
let { set: t, gray: n, reset: r } = e, i = D();
|
|
531
539
|
try {
|
|
@@ -539,7 +547,7 @@ function Ie(e, t) {
|
|
|
539
547
|
}
|
|
540
548
|
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) {
|
|
541
549
|
let t = e.getEnvInfo(), n = e.getGrayTag();
|
|
542
|
-
i.info(`📋 Current environment: ${t.env} (source: ${
|
|
550
|
+
i.info(`📋 Current environment: ${t.env} (source: ${Le[t.source]})`), n ? i.info(`📋 Current gray tag: ${n}`) : i.info("📋 Gray tag: not set");
|
|
543
551
|
}
|
|
544
552
|
} catch (e) {
|
|
545
553
|
let t = e instanceof Error ? e.message : String(e);
|
|
@@ -549,18 +557,18 @@ function Ie(e, t) {
|
|
|
549
557
|
}
|
|
550
558
|
//#endregion
|
|
551
559
|
//#region src/utils/id.ts
|
|
552
|
-
var
|
|
560
|
+
var ze = f("0123456789abcdefghijklmnopqrstuvwxyz", 32);
|
|
553
561
|
function M(e) {
|
|
554
|
-
return
|
|
562
|
+
return ze(e);
|
|
555
563
|
}
|
|
556
564
|
//#endregion
|
|
557
565
|
//#region src/apis/helpers.ts
|
|
558
|
-
function
|
|
566
|
+
function Be(e) {
|
|
559
567
|
return e.status >= 200 && e.status < 300 && e.data.code === "1";
|
|
560
568
|
}
|
|
561
569
|
//#endregion
|
|
562
570
|
//#region src/apis/hosts.ts
|
|
563
|
-
function
|
|
571
|
+
function Ve() {
|
|
564
572
|
let e = he(), t;
|
|
565
573
|
switch (e.env) {
|
|
566
574
|
case "dev":
|
|
@@ -586,33 +594,33 @@ function ze() {
|
|
|
586
594
|
}
|
|
587
595
|
//#endregion
|
|
588
596
|
//#region src/utils/proxy.ts
|
|
589
|
-
function
|
|
597
|
+
function He(e) {
|
|
590
598
|
return e || process.env.HTTP_PROXY || process.env.http_proxy || process.env.HTTPS_PROXY || process.env.https_proxy;
|
|
591
599
|
}
|
|
592
|
-
function
|
|
600
|
+
function Ue(e, t) {
|
|
593
601
|
return !t && !!e;
|
|
594
602
|
}
|
|
595
|
-
function
|
|
596
|
-
let n =
|
|
603
|
+
function We(e, t) {
|
|
604
|
+
let n = He(t);
|
|
597
605
|
if (n) {
|
|
598
|
-
if (e.startsWith("wss://")) return new
|
|
606
|
+
if (e.startsWith("wss://")) return new te(n);
|
|
599
607
|
if (e.startsWith("ws://")) return new ee(n);
|
|
600
608
|
}
|
|
601
609
|
}
|
|
602
610
|
//#endregion
|
|
603
611
|
//#region src/apis/http-client.ts
|
|
604
|
-
var
|
|
612
|
+
var Ge = class extends Error {
|
|
605
613
|
constructor(e, t, n) {
|
|
606
614
|
super(n), this.status = e, this.data = t, this.name = "HttpError";
|
|
607
615
|
}
|
|
608
|
-
},
|
|
616
|
+
}, Ke = class {
|
|
609
617
|
baseUrl;
|
|
610
618
|
defaultHeaders;
|
|
611
619
|
defaultTimeout;
|
|
612
620
|
proxyAgent;
|
|
613
621
|
constructor(e, t) {
|
|
614
622
|
this.baseUrl = e.replace(/\/$/, ""), this.defaultHeaders = t?.defaultHeaders || {}, this.defaultTimeout = t?.defaultTimeout || 3e4;
|
|
615
|
-
let n =
|
|
623
|
+
let n = He(t?.proxy);
|
|
616
624
|
n && (this.proxyAgent = new p(n));
|
|
617
625
|
}
|
|
618
626
|
async request(e) {
|
|
@@ -633,7 +641,7 @@ var Ue = class extends Error {
|
|
|
633
641
|
let c;
|
|
634
642
|
r != null && (c = typeof r == "string" ? r : JSON.stringify(r));
|
|
635
643
|
try {
|
|
636
|
-
let n =
|
|
644
|
+
let n = Ue(He(), e.disableProxy) && this.proxyAgent ? this.proxyAgent : void 0, r = await m(o, {
|
|
637
645
|
method: t,
|
|
638
646
|
headers: s,
|
|
639
647
|
body: c,
|
|
@@ -651,9 +659,9 @@ var Ue = class extends Error {
|
|
|
651
659
|
status: r.statusCode,
|
|
652
660
|
headers: r.headers
|
|
653
661
|
};
|
|
654
|
-
throw new
|
|
662
|
+
throw new Ge(r.statusCode, l, `HTTP request failed with status ${r.statusCode}`);
|
|
655
663
|
} catch (e) {
|
|
656
|
-
throw e instanceof
|
|
664
|
+
throw e instanceof Ge ? e : E(e, "HTTP request failed");
|
|
657
665
|
}
|
|
658
666
|
}
|
|
659
667
|
async get(e, t) {
|
|
@@ -691,10 +699,10 @@ var Ue = class extends Error {
|
|
|
691
699
|
method: "PATCH"
|
|
692
700
|
});
|
|
693
701
|
}
|
|
694
|
-
},
|
|
702
|
+
}, qe = class {
|
|
695
703
|
httpClient;
|
|
696
704
|
constructor(e, t) {
|
|
697
|
-
this.httpClient = new
|
|
705
|
+
this.httpClient = new Ke(e, t);
|
|
698
706
|
}
|
|
699
707
|
async registerDevice(e, t, n) {
|
|
700
708
|
let r = {
|
|
@@ -750,28 +758,25 @@ var Ue = class extends Error {
|
|
|
750
758
|
headers: r,
|
|
751
759
|
timeout: 15e3
|
|
752
760
|
});
|
|
753
|
-
if (
|
|
761
|
+
if (Be(a) && a.data.data) return a.data.data;
|
|
754
762
|
throw Error(`failed to get token: ${JSON.stringify(a.data)}, traceId: ${n}`);
|
|
755
763
|
}
|
|
756
764
|
};
|
|
757
765
|
function N() {
|
|
758
|
-
let e =
|
|
759
|
-
return new
|
|
766
|
+
let e = Ve();
|
|
767
|
+
return new qe(`https://${e.clawCloud}/aicloud/yoyo-claw-service`, e.grayTag ? { defaultHeaders: { "x-gray": e.grayTag } } : void 0);
|
|
760
768
|
}
|
|
761
769
|
//#endregion
|
|
762
770
|
//#region src/honor-auth/assets/favicon.png
|
|
763
|
-
var Ke = "data:image/png;base64,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", qe = "data:image/png;base64,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", Je = "<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>", Ye = "<svg aria-hidden=\"true\" viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"32\" cy=\"32\" r=\"30\" fill=\"currentColor\" opacity=\"0.12\"/><circle cx=\"32\" cy=\"32\" r=\"21\" fill=\"currentColor\"/><path d=\"M24.5 24.5L39.5 39.5M39.5 24.5L24.5 39.5\" stroke=\"white\" stroke-width=\"4.5\" stroke-linecap=\"round\"/></svg>", Xe = {
|
|
764
|
-
favicon: "/favicon.png",
|
|
765
|
-
yoyoLogo: "/yoyo-logo.png"
|
|
766
|
-
};
|
|
771
|
+
var Je = "data:image/png;base64,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", Ye = "<svg aria-hidden=\"true\" viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"32\" cy=\"32\" r=\"30\" fill=\"currentColor\" opacity=\"0.12\"/><circle cx=\"32\" cy=\"32\" r=\"21\" fill=\"currentColor\"/><path d=\"M22.5 32.5L29 39L42.5 25.5\" stroke=\"white\" stroke-width=\"4.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>", Xe = "<svg aria-hidden=\"true\" viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"32\" cy=\"32\" r=\"30\" fill=\"currentColor\" opacity=\"0.12\"/><circle cx=\"32\" cy=\"32\" r=\"21\" fill=\"currentColor\"/><path d=\"M24.5 24.5L39.5 39.5M39.5 24.5L24.5 39.5\" stroke=\"white\" stroke-width=\"4.5\" stroke-linecap=\"round\"/></svg>", Ze = { favicon: "/favicon.png" };
|
|
767
772
|
function P(e) {
|
|
768
773
|
return e.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll("\"", """).replaceAll("'", "'");
|
|
769
774
|
}
|
|
770
|
-
function
|
|
775
|
+
function Qe(e) {
|
|
771
776
|
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>`;
|
|
772
777
|
}
|
|
773
778
|
function F(e) {
|
|
774
|
-
let t = e.statusClass === "success" ?
|
|
779
|
+
let t = e.statusClass === "success" ? Ye : Xe;
|
|
775
780
|
return `<!doctype html>
|
|
776
781
|
<html lang="zh-CN">
|
|
777
782
|
<head>
|
|
@@ -959,12 +964,11 @@ function F(e) {
|
|
|
959
964
|
<body>
|
|
960
965
|
<main class="card">
|
|
961
966
|
<div class="brand">
|
|
962
|
-
<img class="brand-logo" src="data:image/png;base64,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" alt="" />
|
|
963
967
|
<span>YOYOClaw</span>
|
|
964
968
|
</div>
|
|
965
969
|
<div class="icon-wrap ${e.statusClass}">${t}</div>
|
|
966
970
|
<h1>${P(e.title)}</h1>
|
|
967
|
-
${
|
|
971
|
+
${Qe(e.details)}
|
|
968
972
|
<div class="footer">
|
|
969
973
|
<p class="hint">${P(e.hintText)}</p>
|
|
970
974
|
<p class="caption">浏览器不会自动关闭当前页面,保留或稍后关闭都不影响登录结果。</p>
|
|
@@ -975,12 +979,9 @@ function F(e) {
|
|
|
975
979
|
}
|
|
976
980
|
//#endregion
|
|
977
981
|
//#region src/honor-auth/callback-server.ts
|
|
978
|
-
var
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
};
|
|
982
|
-
function $e(e, t) {
|
|
983
|
-
let n = Qe[t];
|
|
982
|
+
var $e = { "favicon.png": Je };
|
|
983
|
+
function et(e, t) {
|
|
984
|
+
let n = $e[t];
|
|
984
985
|
if (!n) {
|
|
985
986
|
e.writeHead(404), e.end();
|
|
986
987
|
return;
|
|
@@ -991,7 +992,7 @@ function $e(e, t) {
|
|
|
991
992
|
"Cache-Control": "public, max-age=3600"
|
|
992
993
|
}), e.end(i);
|
|
993
994
|
}
|
|
994
|
-
function
|
|
995
|
+
function tt(e) {
|
|
995
996
|
return new Promise((t, n) => {
|
|
996
997
|
let { port: r, timeout: i = 6e5, onCodeReceived: a, onError: o } = e, s = null, c = !1, l = !1, u = !1, d = () => {
|
|
997
998
|
c || (c = !0, s && clearTimeout(s), m.close());
|
|
@@ -1001,9 +1002,9 @@ function et(e) {
|
|
|
1001
1002
|
setTimeout(() => {
|
|
1002
1003
|
d();
|
|
1003
1004
|
}, e);
|
|
1004
|
-
}, m =
|
|
1005
|
+
}, m = ne((e, t) => {
|
|
1005
1006
|
try {
|
|
1006
|
-
let n = new
|
|
1007
|
+
let n = new re(e.url || "", `http://localhost:${r}`);
|
|
1007
1008
|
if (e.method !== "GET") {
|
|
1008
1009
|
t.writeHead(405, { "Content-Type": "text/html; charset=utf-8" }), t.end(F({
|
|
1009
1010
|
pageTitle: "请求方式不支持",
|
|
@@ -1013,12 +1014,8 @@ function et(e) {
|
|
|
1013
1014
|
}));
|
|
1014
1015
|
return;
|
|
1015
1016
|
}
|
|
1016
|
-
if (n.pathname === "/favicon.ico" || n.pathname ===
|
|
1017
|
-
|
|
1018
|
-
return;
|
|
1019
|
-
}
|
|
1020
|
-
if (n.pathname === Xe.yoyoLogo) {
|
|
1021
|
-
$e(t, "yoyo-logo.png");
|
|
1017
|
+
if (n.pathname === "/favicon.ico" || n.pathname === Ze.favicon) {
|
|
1018
|
+
et(t, "favicon.png");
|
|
1022
1019
|
return;
|
|
1023
1020
|
}
|
|
1024
1021
|
let i = n.searchParams.get("code") || "", o = n.searchParams.get("error") || "", s = n.searchParams.get("error_description") || n.searchParams.get("error_message") || "";
|
|
@@ -1078,7 +1075,7 @@ function et(e) {
|
|
|
1078
1075
|
}
|
|
1079
1076
|
//#endregion
|
|
1080
1077
|
//#region src/honor-auth/config.ts
|
|
1081
|
-
var
|
|
1078
|
+
var nt = {
|
|
1082
1079
|
authHost: "https://hnoauth-login-test-drcn.cloud.honor.com",
|
|
1083
1080
|
clientId: "221641491",
|
|
1084
1081
|
redirectUri: "http://127.0.0.1:8081/deepLink",
|
|
@@ -1086,7 +1083,7 @@ var tt = {
|
|
|
1086
1083
|
scope: "openid profile",
|
|
1087
1084
|
reqClientType: "110",
|
|
1088
1085
|
loginChannel: "99011000"
|
|
1089
|
-
},
|
|
1086
|
+
}, rt = {
|
|
1090
1087
|
authHost: "https://hnoauth-login-drcn.cloud.honor.com",
|
|
1091
1088
|
clientId: "221000597",
|
|
1092
1089
|
redirectUri: "http://127.0.0.1:8081/deepLink",
|
|
@@ -1095,15 +1092,15 @@ var tt = {
|
|
|
1095
1092
|
reqClientType: "110",
|
|
1096
1093
|
loginChannel: "99011000"
|
|
1097
1094
|
};
|
|
1098
|
-
function
|
|
1095
|
+
function it(e) {
|
|
1099
1096
|
return {
|
|
1100
|
-
...he()?.env === "production" ?
|
|
1097
|
+
...he()?.env === "production" ? rt : nt,
|
|
1101
1098
|
...e
|
|
1102
1099
|
};
|
|
1103
1100
|
}
|
|
1104
1101
|
//#endregion
|
|
1105
1102
|
//#region src/honor-auth/honor-auth-client.ts
|
|
1106
|
-
var
|
|
1103
|
+
var at = class {
|
|
1107
1104
|
config;
|
|
1108
1105
|
constructor(e) {
|
|
1109
1106
|
this.config = e;
|
|
@@ -1119,7 +1116,7 @@ var it = class {
|
|
|
1119
1116
|
return n;
|
|
1120
1117
|
}
|
|
1121
1118
|
generateCodeChallenge(e) {
|
|
1122
|
-
return
|
|
1119
|
+
return g("sha256").update(e).digest().toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
1123
1120
|
}
|
|
1124
1121
|
generatePKCEParams() {
|
|
1125
1122
|
let e = this.generateCodeVerifier();
|
|
@@ -1147,8 +1144,8 @@ var it = class {
|
|
|
1147
1144
|
return { ...this.config };
|
|
1148
1145
|
}
|
|
1149
1146
|
};
|
|
1150
|
-
function
|
|
1151
|
-
return new
|
|
1147
|
+
function ot(e) {
|
|
1148
|
+
return new at(e);
|
|
1152
1149
|
}
|
|
1153
1150
|
//#endregion
|
|
1154
1151
|
//#region src/utils/fs-safe.ts
|
|
@@ -1157,53 +1154,53 @@ var I = class extends Error {
|
|
|
1157
1154
|
constructor(e, t, n) {
|
|
1158
1155
|
super(t, n), this.code = e, this.name = "SafeFsError";
|
|
1159
1156
|
}
|
|
1160
|
-
},
|
|
1157
|
+
}, st = new Set(["ENOENT", "ENOTDIR"]), ct = new Set([
|
|
1161
1158
|
"ELOOP",
|
|
1162
1159
|
"EINVAL",
|
|
1163
1160
|
"ENOTSUP"
|
|
1164
1161
|
]);
|
|
1165
|
-
function
|
|
1162
|
+
function lt(e) {
|
|
1166
1163
|
return !!(e && typeof e == "object" && "code" in e);
|
|
1167
1164
|
}
|
|
1168
1165
|
function L(e) {
|
|
1169
|
-
return
|
|
1170
|
-
}
|
|
1171
|
-
function lt(e) {
|
|
1172
|
-
return ct(e) && typeof e.code == "string" && st.has(e.code);
|
|
1166
|
+
return lt(e) && typeof e.code == "string" && st.has(e.code);
|
|
1173
1167
|
}
|
|
1174
1168
|
function ut(e) {
|
|
1169
|
+
return lt(e) && typeof e.code == "string" && ct.has(e.code);
|
|
1170
|
+
}
|
|
1171
|
+
function dt(e) {
|
|
1175
1172
|
let t = u.win32.normalize(e);
|
|
1176
1173
|
return t.startsWith("\\\\?\\") && (t = t.slice(4), t.toUpperCase().startsWith("UNC\\") && (t = `\\\\${t.slice(4)}`)), t.replaceAll("/", "\\").toLowerCase();
|
|
1177
1174
|
}
|
|
1178
1175
|
function R(e, t) {
|
|
1179
1176
|
let n = u.resolve(e), r = u.resolve(t);
|
|
1180
1177
|
if (process.platform === "win32") {
|
|
1181
|
-
let e =
|
|
1178
|
+
let e = dt(n), t = dt(r), i = u.win32.relative(e, t);
|
|
1182
1179
|
return i === "" || !i.startsWith("..") && !u.win32.isAbsolute(i);
|
|
1183
1180
|
}
|
|
1184
1181
|
let i = u.relative(n, r);
|
|
1185
1182
|
return i === "" || !i.startsWith("..") && !u.isAbsolute(i);
|
|
1186
1183
|
}
|
|
1187
|
-
function
|
|
1184
|
+
function ft(e) {
|
|
1188
1185
|
return e === 0 || e === 0n;
|
|
1189
1186
|
}
|
|
1190
1187
|
function z(e, t, n = process.platform) {
|
|
1191
|
-
return e.ino === t.ino ? e.dev === t.dev ? !0 : n === "win32" && (
|
|
1188
|
+
return e.ino === t.ino ? e.dev === t.dev ? !0 : n === "win32" && (ft(e.dev) || ft(t.dev)) : !1;
|
|
1192
1189
|
}
|
|
1193
|
-
var
|
|
1194
|
-
function
|
|
1190
|
+
var pt = process.platform !== "win32" && "O_NOFOLLOW" in c, mt = c.O_RDONLY | (pt ? c.O_NOFOLLOW : 0), ht = c.O_WRONLY | c.O_CREAT | c.O_EXCL | (pt ? c.O_NOFOLLOW : 0), gt = c.O_WRONLY | c.O_APPEND | (pt ? c.O_NOFOLLOW : 0), _t = (e) => e.endsWith(u.sep) ? e : e + u.sep;
|
|
1191
|
+
function vt(e, t) {
|
|
1195
1192
|
if (!e.startsWith("~")) return e;
|
|
1196
1193
|
let n = t ?? process.env.HOME ?? process.env.USERPROFILE ?? se.homedir();
|
|
1197
1194
|
return n ? e.replace(/^~(?=$|[\\/])/, n) : e;
|
|
1198
1195
|
}
|
|
1199
|
-
async function
|
|
1196
|
+
async function yt(e) {
|
|
1200
1197
|
let t;
|
|
1201
1198
|
try {
|
|
1202
1199
|
t = await v.realpath(e.rootDir);
|
|
1203
1200
|
} catch (e) {
|
|
1204
1201
|
throw L(e) ? new I("not-found", "root dir not found") : e;
|
|
1205
1202
|
}
|
|
1206
|
-
let n =
|
|
1203
|
+
let n = _t(t), r = vt(e.relativePath), i = u.resolve(n, r);
|
|
1207
1204
|
if (!R(n, i)) throw new I("outside-root", "file is outside workspace root");
|
|
1208
1205
|
return {
|
|
1209
1206
|
rootReal: t,
|
|
@@ -1211,7 +1208,7 @@ async function vt(e) {
|
|
|
1211
1208
|
resolved: i
|
|
1212
1209
|
};
|
|
1213
1210
|
}
|
|
1214
|
-
async function
|
|
1211
|
+
async function bt(e, t) {
|
|
1215
1212
|
try {
|
|
1216
1213
|
if ((await v.lstat(e)).isDirectory()) throw new I("not-file", "not a file");
|
|
1217
1214
|
} catch (e) {
|
|
@@ -1219,19 +1216,19 @@ async function yt(e, t) {
|
|
|
1219
1216
|
}
|
|
1220
1217
|
let n;
|
|
1221
1218
|
try {
|
|
1222
|
-
n = await v.open(e,
|
|
1219
|
+
n = await v.open(e, mt);
|
|
1223
1220
|
} catch (e) {
|
|
1224
|
-
throw L(e) ? new I("not-found", "file not found") :
|
|
1221
|
+
throw L(e) ? new I("not-found", "file not found") : ut(e) ? new I("symlink", "symlink open blocked", { cause: e }) : lt(e) && e.code === "EISDIR" ? new I("not-file", "not a file") : e;
|
|
1225
1222
|
}
|
|
1226
1223
|
try {
|
|
1227
1224
|
let [r, i] = await Promise.all([n.stat(), v.lstat(e)]);
|
|
1228
1225
|
if (i.isSymbolicLink()) throw new I("symlink", "symlink not allowed");
|
|
1229
1226
|
if (!r.isFile()) throw new I("not-file", "not a file");
|
|
1230
1227
|
if (t?.rejectHardlinks && r.nlink > 1) throw new I("invalid-path", "hardlinked path not allowed");
|
|
1231
|
-
if (!z(r, i)) throw new I("path-mismatch", "path changed during read");
|
|
1228
|
+
if (process.platform !== "win32" && !z(r, i)) throw new I("path-mismatch", "path changed during read");
|
|
1232
1229
|
let a = await v.realpath(e), o = await v.stat(a);
|
|
1233
1230
|
if (t?.rejectHardlinks && o.nlink > 1) throw new I("invalid-path", "hardlinked path not allowed");
|
|
1234
|
-
if (!z(r, o)) throw new I("path-mismatch", "path mismatch");
|
|
1231
|
+
if (process.platform !== "win32" && !z(r, o)) throw new I("path-mismatch", "path mismatch");
|
|
1235
1232
|
return {
|
|
1236
1233
|
handle: n,
|
|
1237
1234
|
realPath: a,
|
|
@@ -1241,8 +1238,8 @@ async function yt(e, t) {
|
|
|
1241
1238
|
throw await n.close().catch(() => {}), e instanceof I ? e : L(e) ? new I("not-found", "file not found") : e;
|
|
1242
1239
|
}
|
|
1243
1240
|
}
|
|
1244
|
-
async function
|
|
1245
|
-
let { rootWithSep: t, resolved: n } = await
|
|
1241
|
+
async function xt(e) {
|
|
1242
|
+
let { rootWithSep: t, resolved: n } = await yt(e), r = await bt(n);
|
|
1246
1243
|
if (!R(t, r.realPath)) throw await r.handle.close().catch(() => {}), new I("outside-root", "file is outside workspace root");
|
|
1247
1244
|
try {
|
|
1248
1245
|
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})`);
|
|
@@ -1255,29 +1252,29 @@ async function bt(e) {
|
|
|
1255
1252
|
await r.handle.close().catch(() => {});
|
|
1256
1253
|
}
|
|
1257
1254
|
}
|
|
1258
|
-
function
|
|
1255
|
+
function St(e) {
|
|
1259
1256
|
let t = u.dirname(e), n = u.basename(e);
|
|
1260
1257
|
return u.join(t, `.${n}.${process.pid}.${oe()}.tmp`);
|
|
1261
1258
|
}
|
|
1262
|
-
async function
|
|
1263
|
-
let t = await v.open(e.tempPath,
|
|
1259
|
+
async function Ct(e) {
|
|
1260
|
+
let t = await v.open(e.tempPath, ht, e.mode);
|
|
1264
1261
|
try {
|
|
1265
1262
|
return typeof e.data == "string" ? await t.writeFile(e.data, e.encoding ?? "utf8") : await t.writeFile(e.data), await t.stat();
|
|
1266
1263
|
} finally {
|
|
1267
1264
|
await t.close().catch(() => {});
|
|
1268
1265
|
}
|
|
1269
1266
|
}
|
|
1270
|
-
async function
|
|
1271
|
-
let t =
|
|
1267
|
+
async function wt(e) {
|
|
1268
|
+
let t = _t(await v.realpath(e.rootDir)), n = await bt(e.targetPath, { rejectHardlinks: !0 });
|
|
1272
1269
|
try {
|
|
1273
|
-
if (!z(n.stat, e.expectedStat)) throw new I("path-mismatch", "path changed during write");
|
|
1270
|
+
if (process.platform !== "win32" && !z(n.stat, e.expectedStat)) throw new I("path-mismatch", "path changed during write");
|
|
1274
1271
|
if (!R(t, n.realPath)) throw new I("outside-root", "file is outside workspace root");
|
|
1275
1272
|
} finally {
|
|
1276
1273
|
await n.handle.close().catch(() => {});
|
|
1277
1274
|
}
|
|
1278
1275
|
}
|
|
1279
1276
|
async function B(e) {
|
|
1280
|
-
let { rootWithSep: t, resolved: n } = await
|
|
1277
|
+
let { rootWithSep: t, resolved: n } = await yt(e);
|
|
1281
1278
|
e.mkdir !== !1 && await v.mkdir(u.dirname(n), { recursive: !0 });
|
|
1282
1279
|
let r = n, i = !1;
|
|
1283
1280
|
try {
|
|
@@ -1289,13 +1286,13 @@ async function B(e) {
|
|
|
1289
1286
|
}
|
|
1290
1287
|
let a = e.mode === "append";
|
|
1291
1288
|
if (a && !i) throw new I("not-found", "cannot append to non-existent file");
|
|
1292
|
-
return a ? await
|
|
1289
|
+
return a ? await Tt({
|
|
1293
1290
|
ioPath: r,
|
|
1294
1291
|
rootWithSep: t,
|
|
1295
1292
|
data: e.data,
|
|
1296
1293
|
encoding: e.encoding,
|
|
1297
1294
|
maxBytes: e.maxBytes
|
|
1298
|
-
}) : await
|
|
1295
|
+
}) : await Et({
|
|
1299
1296
|
ioPath: r,
|
|
1300
1297
|
rootWithSep: t,
|
|
1301
1298
|
rootDir: e.rootDir,
|
|
@@ -1305,12 +1302,12 @@ async function B(e) {
|
|
|
1305
1302
|
fileMode: 384
|
|
1306
1303
|
});
|
|
1307
1304
|
}
|
|
1308
|
-
async function
|
|
1305
|
+
async function Tt(e) {
|
|
1309
1306
|
let t;
|
|
1310
1307
|
try {
|
|
1311
|
-
t = await v.open(e.ioPath,
|
|
1308
|
+
t = await v.open(e.ioPath, gt);
|
|
1312
1309
|
} catch (e) {
|
|
1313
|
-
throw L(e) ? new I("not-found", "file not found") :
|
|
1310
|
+
throw L(e) ? new I("not-found", "file not found") : ut(e) ? new I("symlink", "symlink open blocked", { cause: e }) : e;
|
|
1314
1311
|
}
|
|
1315
1312
|
try {
|
|
1316
1313
|
let n = await t.stat();
|
|
@@ -1331,11 +1328,11 @@ async function wt(e) {
|
|
|
1331
1328
|
await t.close().catch(() => {});
|
|
1332
1329
|
}
|
|
1333
1330
|
}
|
|
1334
|
-
async function
|
|
1331
|
+
async function Et(e) {
|
|
1335
1332
|
let t = null, n = e.ioPath;
|
|
1336
1333
|
try {
|
|
1337
|
-
t =
|
|
1338
|
-
let r = await
|
|
1334
|
+
t = St(n);
|
|
1335
|
+
let r = await Ct({
|
|
1339
1336
|
tempPath: t,
|
|
1340
1337
|
data: e.data,
|
|
1341
1338
|
encoding: e.encoding,
|
|
@@ -1343,13 +1340,13 @@ async function Tt(e) {
|
|
|
1343
1340
|
});
|
|
1344
1341
|
await v.rename(t, n), t = null;
|
|
1345
1342
|
try {
|
|
1346
|
-
await
|
|
1343
|
+
await wt({
|
|
1347
1344
|
rootDir: e.rootDir,
|
|
1348
1345
|
targetPath: n,
|
|
1349
1346
|
expectedStat: r
|
|
1350
1347
|
});
|
|
1351
1348
|
} catch (e) {
|
|
1352
|
-
throw new I("write-failed",
|
|
1349
|
+
throw e instanceof I ? e : new I("write-failed", "atomic write verification failed", { cause: e });
|
|
1353
1350
|
}
|
|
1354
1351
|
return {
|
|
1355
1352
|
realPath: n,
|
|
@@ -1365,30 +1362,30 @@ async function Tt(e) {
|
|
|
1365
1362
|
function V(e) {
|
|
1366
1363
|
return e?.trim() || void 0;
|
|
1367
1364
|
}
|
|
1368
|
-
function
|
|
1369
|
-
let t = u.dirname(
|
|
1365
|
+
function Dt(e = import.meta.url) {
|
|
1366
|
+
let t = u.dirname(h(e));
|
|
1370
1367
|
for (; t !== u.dirname(t);) {
|
|
1371
1368
|
if (l(u.join(t, "package.json"))) return t;
|
|
1372
1369
|
t = u.dirname(t);
|
|
1373
1370
|
}
|
|
1374
1371
|
return t;
|
|
1375
1372
|
}
|
|
1376
|
-
function
|
|
1377
|
-
let n =
|
|
1373
|
+
function Ot(e = process.env, t = se.homedir) {
|
|
1374
|
+
let n = kt(e, t);
|
|
1378
1375
|
return n ? u.resolve(n) : void 0;
|
|
1379
1376
|
}
|
|
1380
|
-
function
|
|
1377
|
+
function kt(e, t) {
|
|
1381
1378
|
let n = V(e.OPENCLAW_HOME);
|
|
1382
1379
|
if (n) {
|
|
1383
1380
|
if (n === "~" || n.startsWith("~/") || n.startsWith("~\\")) {
|
|
1384
|
-
let r = V(e.HOME) ?? V(e.USERPROFILE) ??
|
|
1381
|
+
let r = V(e.HOME) ?? V(e.USERPROFILE) ?? At(t);
|
|
1385
1382
|
return r ? n.replace(/^~(?=$|[\\/])/, r) : void 0;
|
|
1386
1383
|
}
|
|
1387
1384
|
return n;
|
|
1388
1385
|
}
|
|
1389
|
-
return V(e.HOME) || V(e.USERPROFILE) ||
|
|
1386
|
+
return V(e.HOME) || V(e.USERPROFILE) || At(t);
|
|
1390
1387
|
}
|
|
1391
|
-
function
|
|
1388
|
+
function At(e) {
|
|
1392
1389
|
try {
|
|
1393
1390
|
return V(e());
|
|
1394
1391
|
} catch {
|
|
@@ -1397,75 +1394,75 @@ function kt(e) {
|
|
|
1397
1394
|
}
|
|
1398
1395
|
//#endregion
|
|
1399
1396
|
//#region src/modules/configs/identity-persist.ts
|
|
1400
|
-
var
|
|
1397
|
+
var jt = /* @__PURE__ */ function(e) {
|
|
1401
1398
|
return e[e.LEGACY = 1] = "LEGACY", e[e.NEW = 2] = "NEW", e;
|
|
1402
|
-
}({}),
|
|
1403
|
-
function
|
|
1404
|
-
return u.join(
|
|
1399
|
+
}({}), Mt = ".openclaw", Nt = "yoyo", Pt = "identity.json";
|
|
1400
|
+
function Ft() {
|
|
1401
|
+
return u.join(Mt, Nt, Pt);
|
|
1405
1402
|
}
|
|
1406
|
-
async function
|
|
1407
|
-
let t =
|
|
1403
|
+
async function It(e) {
|
|
1404
|
+
let t = Ft();
|
|
1408
1405
|
try {
|
|
1409
|
-
let n = (await
|
|
1406
|
+
let n = (await xt({
|
|
1410
1407
|
rootDir: e,
|
|
1411
1408
|
relativePath: t,
|
|
1412
1409
|
maxBytes: 10 * 1024
|
|
1413
1410
|
})).buffer.toString("utf8"), r = JSON.parse(n);
|
|
1414
|
-
return typeof r != "object" || !r ?
|
|
1415
|
-
...
|
|
1411
|
+
return typeof r != "object" || !r ? zt() : {
|
|
1412
|
+
...zt(),
|
|
1416
1413
|
...r
|
|
1417
1414
|
};
|
|
1418
1415
|
} catch (e) {
|
|
1419
1416
|
return D().warn(`[yoyo-identity] failed to read identity: ${e.message}`), null;
|
|
1420
1417
|
}
|
|
1421
1418
|
}
|
|
1422
|
-
async function
|
|
1423
|
-
let e =
|
|
1424
|
-
return e ? await
|
|
1419
|
+
async function Lt() {
|
|
1420
|
+
let e = Ot();
|
|
1421
|
+
return e ? await It(e) || null : (D().warn("[yoyo-identity] failed to find home dir"), null);
|
|
1425
1422
|
}
|
|
1426
|
-
async function
|
|
1427
|
-
let t =
|
|
1423
|
+
async function Rt(e) {
|
|
1424
|
+
let t = Ot();
|
|
1428
1425
|
if (!t) return D().warn("[yoyo-identity] failed to find home dir"), null;
|
|
1429
|
-
let n = await
|
|
1426
|
+
let n = await It(t), r = {
|
|
1430
1427
|
...n,
|
|
1431
|
-
version: n?.version ||
|
|
1428
|
+
version: n?.version || jt.NEW
|
|
1432
1429
|
};
|
|
1433
1430
|
return e.legacyDeviceId && (r.legacyDeviceId = e.legacyDeviceId), e.deviceId && (r.deviceId = e.deviceId, r.publicKeyPem = e.publicKeyPem, r.privateKeyPem = e.privateKeyPem, r.createdAtMs = e.createdAtMs), e.version && (r.version = e.version), await B({
|
|
1434
1431
|
rootDir: t,
|
|
1435
|
-
relativePath:
|
|
1432
|
+
relativePath: Ft(),
|
|
1436
1433
|
data: JSON.stringify(r, null, 2),
|
|
1437
1434
|
encoding: "utf8",
|
|
1438
1435
|
mkdir: !0
|
|
1439
1436
|
}), r;
|
|
1440
1437
|
}
|
|
1441
|
-
function
|
|
1442
|
-
return { version:
|
|
1438
|
+
function zt() {
|
|
1439
|
+
return { version: jt.NEW };
|
|
1443
1440
|
}
|
|
1444
1441
|
//#endregion
|
|
1445
1442
|
//#region src/modules/device/registry.ts
|
|
1446
|
-
async function
|
|
1443
|
+
async function Bt(e, t) {
|
|
1447
1444
|
if (!e || !t) throw Error("设备信息或用户信息缺失");
|
|
1448
1445
|
let n = j().getGatewayAuthConfig(), r = await N().registerDevice(e, t, n);
|
|
1449
|
-
if (!
|
|
1446
|
+
if (!Be(r)) throw Error(`注册失败:${r.data?.cnMessage}`);
|
|
1450
1447
|
}
|
|
1451
1448
|
//#endregion
|
|
1452
1449
|
//#region src/modules/device/identity.ts
|
|
1453
1450
|
var H = Buffer.from("302a300506032b6570032100", "hex");
|
|
1454
|
-
function
|
|
1451
|
+
function Vt(e) {
|
|
1455
1452
|
return e.toString("base64").replaceAll("+", "-").replaceAll("/", "_").replace(/=+$/g, "");
|
|
1456
1453
|
}
|
|
1457
|
-
function
|
|
1454
|
+
function Ht(e) {
|
|
1458
1455
|
let t = _.createPublicKey(e).export({
|
|
1459
1456
|
type: "spki",
|
|
1460
1457
|
format: "der"
|
|
1461
1458
|
});
|
|
1462
1459
|
return t.length === H.length + 32 && t.subarray(0, H.length).equals(H) ? t.subarray(H.length) : t;
|
|
1463
1460
|
}
|
|
1464
|
-
function
|
|
1465
|
-
let t =
|
|
1461
|
+
function Ut(e) {
|
|
1462
|
+
let t = Ht(e);
|
|
1466
1463
|
return _.createHash("sha256").update(t).digest("hex");
|
|
1467
1464
|
}
|
|
1468
|
-
async function
|
|
1465
|
+
async function Wt() {
|
|
1469
1466
|
let { publicKey: e, privateKey: t } = _.generateKeyPairSync("ed25519"), n = e.export({
|
|
1470
1467
|
type: "spki",
|
|
1471
1468
|
format: "pem"
|
|
@@ -1474,17 +1471,17 @@ async function Ut() {
|
|
|
1474
1471
|
format: "pem"
|
|
1475
1472
|
}).toString();
|
|
1476
1473
|
return {
|
|
1477
|
-
deviceId:
|
|
1474
|
+
deviceId: Ut(n),
|
|
1478
1475
|
publicKeyPem: n,
|
|
1479
1476
|
privateKeyPem: r,
|
|
1480
1477
|
createdAtMs: Date.now()
|
|
1481
1478
|
};
|
|
1482
1479
|
}
|
|
1483
|
-
async function
|
|
1484
|
-
let e = await
|
|
1480
|
+
async function Gt() {
|
|
1481
|
+
let e = await Lt();
|
|
1485
1482
|
if (e && e.deviceId && e.publicKeyPem && e.privateKeyPem && e.createdAtMs) {
|
|
1486
|
-
let t = e.deviceId, n =
|
|
1487
|
-
return n && n !== e.deviceId && (await
|
|
1483
|
+
let t = e.deviceId, n = Ut(e.publicKeyPem);
|
|
1484
|
+
return n && n !== e.deviceId && (await Rt({
|
|
1488
1485
|
...e,
|
|
1489
1486
|
deviceId: n
|
|
1490
1487
|
}), t = n), {
|
|
@@ -1495,29 +1492,29 @@ async function Wt() {
|
|
|
1495
1492
|
createdAtMs: e.createdAtMs
|
|
1496
1493
|
};
|
|
1497
1494
|
}
|
|
1498
|
-
let t = await
|
|
1499
|
-
return await
|
|
1495
|
+
let t = await Wt();
|
|
1496
|
+
return await Rt(t), t;
|
|
1500
1497
|
}
|
|
1501
|
-
function
|
|
1498
|
+
function Kt(e, t) {
|
|
1502
1499
|
let n = _.createPrivateKey(e);
|
|
1503
|
-
return
|
|
1500
|
+
return Vt(_.sign(null, Buffer.from(t, "utf8"), n));
|
|
1504
1501
|
}
|
|
1505
|
-
function
|
|
1506
|
-
return
|
|
1502
|
+
function qt(e) {
|
|
1503
|
+
return Vt(Ht(e));
|
|
1507
1504
|
}
|
|
1508
1505
|
//#endregion
|
|
1509
1506
|
//#region src/modules/device/providers/linux.ts
|
|
1510
|
-
function
|
|
1507
|
+
function Jt(t) {
|
|
1511
1508
|
try {
|
|
1512
1509
|
return e.existsSync(t) ? e.readFileSync(t, "utf-8").trim() : "";
|
|
1513
1510
|
} catch {
|
|
1514
1511
|
return "";
|
|
1515
1512
|
}
|
|
1516
1513
|
}
|
|
1517
|
-
var
|
|
1514
|
+
var Yt = class {
|
|
1518
1515
|
async ensureInitialized() {}
|
|
1519
1516
|
getLinuxDeviceModel() {
|
|
1520
|
-
return
|
|
1517
|
+
return Jt("/sys/class/dmi/id/product_name") || Jt("/sys/class/dmi/id/board_name") || `${y.cpus()[0]?.model || "Linux PC"} (${y.arch()})`;
|
|
1521
1518
|
}
|
|
1522
1519
|
getLinuxDeviceName() {
|
|
1523
1520
|
return `${y.hostname()} (${this.getLinuxDeviceModel()})`;
|
|
@@ -1534,7 +1531,7 @@ var Jt = class {
|
|
|
1534
1531
|
getDeviceType() {
|
|
1535
1532
|
return "pc";
|
|
1536
1533
|
}
|
|
1537
|
-
},
|
|
1534
|
+
}, Xt = class {
|
|
1538
1535
|
async ensureInitialized() {}
|
|
1539
1536
|
getMacOSDeviceModel() {
|
|
1540
1537
|
return `${y.cpus()[0]?.model || "Mac"} (${y.machine?.() || y.arch()})`;
|
|
@@ -1554,7 +1551,7 @@ var Jt = class {
|
|
|
1554
1551
|
getDeviceType() {
|
|
1555
1552
|
return "pc";
|
|
1556
1553
|
}
|
|
1557
|
-
},
|
|
1554
|
+
}, Zt = le(ce), Qt = class {
|
|
1558
1555
|
cache = {
|
|
1559
1556
|
brand: "",
|
|
1560
1557
|
model: "",
|
|
@@ -1569,7 +1566,7 @@ var Jt = class {
|
|
|
1569
1566
|
}
|
|
1570
1567
|
async execAndroidCmd(e, t = 5e3) {
|
|
1571
1568
|
try {
|
|
1572
|
-
let { stdout: n } = await
|
|
1569
|
+
let { stdout: n } = await Zt("/system/bin/sh", ["-c", e], {
|
|
1573
1570
|
timeout: t,
|
|
1574
1571
|
encoding: "utf-8"
|
|
1575
1572
|
});
|
|
@@ -1631,7 +1628,7 @@ function U(e, t, n) {
|
|
|
1631
1628
|
}
|
|
1632
1629
|
});
|
|
1633
1630
|
}
|
|
1634
|
-
function
|
|
1631
|
+
function $t(e, t) {
|
|
1635
1632
|
return new Promise((n) => {
|
|
1636
1633
|
try {
|
|
1637
1634
|
new b({
|
|
@@ -1645,7 +1642,7 @@ function Qt(e, t) {
|
|
|
1645
1642
|
}
|
|
1646
1643
|
});
|
|
1647
1644
|
}
|
|
1648
|
-
var
|
|
1645
|
+
var en = class {
|
|
1649
1646
|
cache = { deviceBrand: "" };
|
|
1650
1647
|
initPromise;
|
|
1651
1648
|
constructor() {
|
|
@@ -1667,7 +1664,7 @@ var $t = class {
|
|
|
1667
1664
|
t,
|
|
1668
1665
|
n,
|
|
1669
1666
|
r
|
|
1670
|
-
].find((e) => e && e.toLowerCase().includes("honor")) || await
|
|
1667
|
+
].find((e) => e && e.toLowerCase().includes("honor")) || await $t(b.HKLM, "\\SOFTWARE\\HONOR\\PCManager") ? this.cache.deviceBrand = "HONOR" : this.cache.deviceBrand = "";
|
|
1671
1668
|
} catch {
|
|
1672
1669
|
this.cache.deviceBrand = "";
|
|
1673
1670
|
}
|
|
@@ -1693,7 +1690,7 @@ var $t = class {
|
|
|
1693
1690
|
};
|
|
1694
1691
|
//#endregion
|
|
1695
1692
|
//#region src/modules/device/providers/index.ts
|
|
1696
|
-
function
|
|
1693
|
+
function tn() {
|
|
1697
1694
|
let e = process.platform;
|
|
1698
1695
|
if (e === "win32") return "windows";
|
|
1699
1696
|
if (e === "linux") {
|
|
@@ -1704,21 +1701,21 @@ function en() {
|
|
|
1704
1701
|
}
|
|
1705
1702
|
return e === "darwin" ? "macos" : "linux";
|
|
1706
1703
|
}
|
|
1707
|
-
function
|
|
1708
|
-
switch (
|
|
1709
|
-
case "pad": return new
|
|
1710
|
-
case "windows": return new
|
|
1711
|
-
case "linux": return new
|
|
1712
|
-
case "macos": return new
|
|
1713
|
-
default: return new
|
|
1704
|
+
function nn() {
|
|
1705
|
+
switch (tn()) {
|
|
1706
|
+
case "pad": return new Qt();
|
|
1707
|
+
case "windows": return new en();
|
|
1708
|
+
case "linux": return new Yt();
|
|
1709
|
+
case "macos": return new Xt();
|
|
1710
|
+
default: return new Yt();
|
|
1714
1711
|
}
|
|
1715
1712
|
}
|
|
1716
1713
|
//#endregion
|
|
1717
1714
|
//#region src/modules/device/device-info.ts
|
|
1718
1715
|
async function W() {
|
|
1719
|
-
let e =
|
|
1716
|
+
let e = nn(), t = j();
|
|
1720
1717
|
await e.ensureInitialized();
|
|
1721
|
-
let n = await
|
|
1718
|
+
let n = await Gt(), r = n.legacyDeviceId ?? n.deviceId, i = ve(), a = t.getDeviceConfig();
|
|
1722
1719
|
D().debug?.(`[yoyoclaw-device] env: ${JSON.stringify(i)}, config: ${JSON.stringify(a)}`);
|
|
1723
1720
|
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 = {
|
|
1724
1721
|
deviceId: r,
|
|
@@ -1747,20 +1744,20 @@ async function W() {
|
|
|
1747
1744
|
}
|
|
1748
1745
|
//#endregion
|
|
1749
1746
|
//#region src/modules/device/helpers.ts
|
|
1750
|
-
function
|
|
1747
|
+
function rn(e) {
|
|
1751
1748
|
return typeof e == "string" && e.trim() || "";
|
|
1752
1749
|
}
|
|
1753
|
-
function
|
|
1750
|
+
function an(e) {
|
|
1754
1751
|
return e.replace(/[A-Z]/g, (e) => String.fromCharCode(e.charCodeAt(0) + 32));
|
|
1755
1752
|
}
|
|
1756
|
-
function
|
|
1757
|
-
let t =
|
|
1758
|
-
return t ?
|
|
1753
|
+
function on(e) {
|
|
1754
|
+
let t = rn(e);
|
|
1755
|
+
return t ? an(t) : "";
|
|
1759
1756
|
}
|
|
1760
1757
|
//#endregion
|
|
1761
1758
|
//#region src/modules/device/auth.ts
|
|
1762
|
-
function
|
|
1763
|
-
let t = e.scopes.join(","), n = e.token ?? "", r =
|
|
1759
|
+
function sn(e) {
|
|
1760
|
+
let t = e.scopes.join(","), n = e.token ?? "", r = on(e.platform), i = on(e.deviceFamily);
|
|
1764
1761
|
return [
|
|
1765
1762
|
"v3",
|
|
1766
1763
|
e.deviceId,
|
|
@@ -1777,10 +1774,10 @@ function on(e) {
|
|
|
1777
1774
|
}
|
|
1778
1775
|
//#endregion
|
|
1779
1776
|
//#region src/modules/device/credential-builder.ts
|
|
1780
|
-
function
|
|
1777
|
+
function cn(e) {
|
|
1781
1778
|
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;
|
|
1782
1779
|
if (!t) return;
|
|
1783
|
-
let d =
|
|
1780
|
+
let d = sn({
|
|
1784
1781
|
deviceId: t.deviceId,
|
|
1785
1782
|
clientId: n,
|
|
1786
1783
|
clientMode: r,
|
|
@@ -1791,10 +1788,10 @@ function sn(e) {
|
|
|
1791
1788
|
nonce: l,
|
|
1792
1789
|
platform: o,
|
|
1793
1790
|
deviceFamily: s
|
|
1794
|
-
}), f =
|
|
1791
|
+
}), f = Kt(t.privateKeyPem, d);
|
|
1795
1792
|
return {
|
|
1796
1793
|
id: t.deviceId,
|
|
1797
|
-
publicKey:
|
|
1794
|
+
publicKey: qt(t.publicKeyPem),
|
|
1798
1795
|
signature: f,
|
|
1799
1796
|
signedAt: u,
|
|
1800
1797
|
nonce: l
|
|
@@ -1802,7 +1799,7 @@ function sn(e) {
|
|
|
1802
1799
|
}
|
|
1803
1800
|
//#endregion
|
|
1804
1801
|
//#region src/honor-auth/token-manager.ts
|
|
1805
|
-
async function
|
|
1802
|
+
async function ln(e, t = !0) {
|
|
1806
1803
|
try {
|
|
1807
1804
|
let n = j(), r = e.jwtToken;
|
|
1808
1805
|
if (!r && e.userId) {
|
|
@@ -1821,7 +1818,7 @@ async function cn(e, t = !0) {
|
|
|
1821
1818
|
throw E(e, "保存Token失败");
|
|
1822
1819
|
}
|
|
1823
1820
|
}
|
|
1824
|
-
async function
|
|
1821
|
+
async function un(e) {
|
|
1825
1822
|
let t = await W(), n = await N().exchangeToken(t, { userId: e });
|
|
1826
1823
|
if (n.jwtToken) {
|
|
1827
1824
|
let e = Math.floor(Date.now() / 1e3) + 720 * 60 * 60;
|
|
@@ -1834,21 +1831,21 @@ async function ln(e) {
|
|
|
1834
1831
|
}
|
|
1835
1832
|
return await j().clearUserConfig(), null;
|
|
1836
1833
|
}
|
|
1837
|
-
async function
|
|
1834
|
+
async function dn() {
|
|
1838
1835
|
let e = D();
|
|
1839
1836
|
try {
|
|
1840
1837
|
let t = j(), n = t.getUserConfig(), r = ye();
|
|
1841
|
-
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
|
|
1838
|
+
if (e.debug?.(`[yoyoclaw-auth] env userId: ${r ? "present" : "absent"}, config userId: ${n?.userId ? "present" : "absent"}, config token: ${n?.token ? "present" : "absent"}`), n?.userId) return await un(r || n.userId);
|
|
1842
1839
|
if (n?.token) {
|
|
1843
1840
|
if (!n.expired || n.expired >= Math.floor(Date.now() / 1e3)) return { token: n.token };
|
|
1844
1841
|
e.debug?.("[yoyoclaw-auth] cached token expired");
|
|
1845
1842
|
}
|
|
1846
|
-
return r ? (e.debug?.("[yoyoclaw-auth] token expired, using env userId to exchange token"), await
|
|
1843
|
+
return r ? (e.debug?.("[yoyoclaw-auth] token expired, using env userId to exchange token"), await un(r)) : (n?.token && (e.debug?.("[yoyoclaw-auth] clearing expired token"), await t.clearUserConfig()), null);
|
|
1847
1844
|
} catch (e) {
|
|
1848
1845
|
throw E(e, "加载Token失败");
|
|
1849
1846
|
}
|
|
1850
1847
|
}
|
|
1851
|
-
async function
|
|
1848
|
+
async function fn() {
|
|
1852
1849
|
try {
|
|
1853
1850
|
await j().clearUserConfig(), D().info("[yoyoclaw-auth] token cleared");
|
|
1854
1851
|
} catch (e) {
|
|
@@ -1857,10 +1854,10 @@ async function dn() {
|
|
|
1857
1854
|
}
|
|
1858
1855
|
//#endregion
|
|
1859
1856
|
//#region src/honor-auth/browser.ts
|
|
1860
|
-
async function
|
|
1861
|
-
let n =
|
|
1857
|
+
async function pn(e, t) {
|
|
1858
|
+
let n = it(t);
|
|
1862
1859
|
D().debug?.("Starting Honor login flow...");
|
|
1863
|
-
let r =
|
|
1860
|
+
let r = ot(n), i = r.generatePKCEParams(), a = r.buildAuthUrl(i), o = null, s = tt({
|
|
1864
1861
|
port: n.localPort,
|
|
1865
1862
|
timeout: 6e5,
|
|
1866
1863
|
onCodeReceived: (e) => {
|
|
@@ -1888,31 +1885,31 @@ async function fn(e, t) {
|
|
|
1888
1885
|
authConfig: n
|
|
1889
1886
|
});
|
|
1890
1887
|
if (!t?.jwtToken) throw Error("failed to get jwt token");
|
|
1891
|
-
return await
|
|
1888
|
+
return await ln({ jwtToken: t.jwtToken }, n.saveToFile !== !1), { token: t.jwtToken };
|
|
1892
1889
|
} catch (e) {
|
|
1893
1890
|
throw E(e, "get token failed");
|
|
1894
1891
|
}
|
|
1895
1892
|
}
|
|
1896
1893
|
//#endregion
|
|
1897
1894
|
//#region src/honor-auth/cloud.ts
|
|
1898
|
-
async function
|
|
1895
|
+
async function mn() {
|
|
1899
1896
|
let e = j().getUserConfig();
|
|
1900
1897
|
if (!e?.token) throw Error("⚠️ Not logged in");
|
|
1901
1898
|
let t = await W(), n = N(), r = { token: e.token }, i = await n.logoutDevice(t, r);
|
|
1902
|
-
if (!
|
|
1903
|
-
await
|
|
1899
|
+
if (!Be(i)) throw Error(i.data?.cnMessage || "Unknown error");
|
|
1900
|
+
await fn();
|
|
1904
1901
|
}
|
|
1905
1902
|
//#endregion
|
|
1906
1903
|
//#region src/modules/login/impl.ts
|
|
1907
|
-
async function
|
|
1904
|
+
async function hn(e = {}) {
|
|
1908
1905
|
let { userId: t } = e, n = D();
|
|
1909
1906
|
try {
|
|
1910
1907
|
n.debug?.("Starting login process...");
|
|
1911
1908
|
let e = await W(), r;
|
|
1912
|
-
t ? (r = await
|
|
1909
|
+
t ? (r = await ln({
|
|
1913
1910
|
userId: t,
|
|
1914
1911
|
deviceInfo: e
|
|
1915
|
-
}), n.debug?.("Using provided user info"), n.debug?.(`User: ${t}`), n.debug?.(`Device ID: ${e?.deviceId}`)) : (n.debug?.("Starting OAuth2 authentication..."), r = await
|
|
1912
|
+
}), n.debug?.("Using provided user info"), n.debug?.(`User: ${t}`), n.debug?.(`Device ID: ${e?.deviceId}`)) : (n.debug?.("Starting OAuth2 authentication..."), r = await pn(e), n.debug?.("OAuth2 authentication successful"), n.debug?.(`Device ID: ${e?.deviceId}`)), console.log("📡 Registering device to Claw Cloud..."), await Bt(e, r), console.log("✅ Device registered successfully"), console.log("🔗 Channel connection in progress, use 'openclaw honor status' to check device status");
|
|
1916
1913
|
} catch (e) {
|
|
1917
1914
|
let t = e instanceof Error ? e.message : String(e);
|
|
1918
1915
|
console.error("❌ Login process failed:", t);
|
|
@@ -1920,11 +1917,11 @@ async function mn(e = {}) {
|
|
|
1920
1917
|
}
|
|
1921
1918
|
//#endregion
|
|
1922
1919
|
//#region src/commands/login/impl.ts
|
|
1923
|
-
function
|
|
1920
|
+
function gn(e, t) {
|
|
1924
1921
|
let n = t.command("login").description("login to yoyoclaw and register devices");
|
|
1925
1922
|
return n = n.option("-u, --uid <userId>", "user ID for direct login").option("--token <token>", "token for direct login").action(async (t) => {
|
|
1926
1923
|
let { uid: n, token: r } = t;
|
|
1927
|
-
e.logger.debug?.("honor login CLI command called"), await
|
|
1924
|
+
e.logger.debug?.("honor login CLI command called"), await hn({
|
|
1928
1925
|
userId: n,
|
|
1929
1926
|
token: r
|
|
1930
1927
|
});
|
|
@@ -1932,11 +1929,11 @@ function hn(e, t) {
|
|
|
1932
1929
|
}
|
|
1933
1930
|
//#endregion
|
|
1934
1931
|
//#region src/commands/logout/impl.ts
|
|
1935
|
-
function
|
|
1932
|
+
function _n(e, t) {
|
|
1936
1933
|
return t.command("logout").description("Logout and clear user configuration").action(async () => {
|
|
1937
1934
|
e.logger.info("logout CLI command called");
|
|
1938
1935
|
try {
|
|
1939
|
-
await
|
|
1936
|
+
await mn(), console.log("✅ Logout successful, gateway will automatically restart to handle new configuration");
|
|
1940
1937
|
} catch (e) {
|
|
1941
1938
|
let t = e instanceof Error ? e.message : String(e);
|
|
1942
1939
|
console.error("❌ Logout failed:", t);
|
|
@@ -1947,11 +1944,11 @@ function gn(e, t) {
|
|
|
1947
1944
|
//#region src/services/connection/status-tracker/events.ts
|
|
1948
1945
|
var G = /* @__PURE__ */ function(e) {
|
|
1949
1946
|
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;
|
|
1950
|
-
}({}),
|
|
1947
|
+
}({}), vn = class {
|
|
1951
1948
|
statusFilePath;
|
|
1952
1949
|
statusDir;
|
|
1953
1950
|
constructor() {
|
|
1954
|
-
let e =
|
|
1951
|
+
let e = Dt();
|
|
1955
1952
|
this.statusDir = r.join(e, ".yoyo-cache"), this.statusFilePath = r.join(this.statusDir, "yoyo-status.json");
|
|
1956
1953
|
}
|
|
1957
1954
|
async save(e) {
|
|
@@ -1992,7 +1989,7 @@ var G = /* @__PURE__ */ function(e) {
|
|
|
1992
1989
|
};
|
|
1993
1990
|
//#endregion
|
|
1994
1991
|
//#region src/services/connection/status-tracker/types.ts
|
|
1995
|
-
function
|
|
1992
|
+
function yn() {
|
|
1996
1993
|
return {
|
|
1997
1994
|
status: "idle",
|
|
1998
1995
|
updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
@@ -2027,13 +2024,13 @@ function vn() {
|
|
|
2027
2024
|
}
|
|
2028
2025
|
//#endregion
|
|
2029
2026
|
//#region src/services/connection/status-tracker/tracker.ts
|
|
2030
|
-
var
|
|
2027
|
+
var bn = class {
|
|
2031
2028
|
currentStatus;
|
|
2032
2029
|
storage;
|
|
2033
2030
|
autoSave;
|
|
2034
2031
|
saveTimer;
|
|
2035
2032
|
constructor(e = !0) {
|
|
2036
|
-
this.currentStatus =
|
|
2033
|
+
this.currentStatus = yn(), this.storage = new vn(), this.autoSave = e, this.saveTimer = null;
|
|
2037
2034
|
}
|
|
2038
2035
|
async handleEvent(e) {
|
|
2039
2036
|
let { type: t, timestamp: n, data: r } = e;
|
|
@@ -2084,7 +2081,7 @@ var yn = class {
|
|
|
2084
2081
|
let e = await this.storage.load();
|
|
2085
2082
|
if (e) {
|
|
2086
2083
|
let t = e.cloudSocket, n = e.history;
|
|
2087
|
-
this.currentStatus =
|
|
2084
|
+
this.currentStatus = yn(), this.currentStatus.cloudSocket = t, this.currentStatus.history = n, this.currentStatus.cloudSocket.connected = !1, this.currentStatus.cloudSocket.readyState = 3, await this.saveStatus();
|
|
2088
2085
|
}
|
|
2089
2086
|
return this.getStatus();
|
|
2090
2087
|
}
|
|
@@ -2092,7 +2089,7 @@ var yn = class {
|
|
|
2092
2089
|
await this.storage.save(this.currentStatus);
|
|
2093
2090
|
}
|
|
2094
2091
|
async clearStatus() {
|
|
2095
|
-
this.currentStatus =
|
|
2092
|
+
this.currentStatus = yn(), await this.storage.clear();
|
|
2096
2093
|
}
|
|
2097
2094
|
handleCloudSocketConnecting(e, t) {
|
|
2098
2095
|
this.currentStatus.cloudSocket.url = e.url || "", this.currentStatus.cloudSocket.connected = !1;
|
|
@@ -2165,21 +2162,21 @@ var yn = class {
|
|
|
2165
2162
|
};
|
|
2166
2163
|
//#endregion
|
|
2167
2164
|
//#region src/commands/status/index.ts
|
|
2168
|
-
function
|
|
2165
|
+
function xn(e, t) {
|
|
2169
2166
|
return t.command("status").description("Show YOYOClaw connection status").action(async () => {
|
|
2170
|
-
if (e.logger.debug?.("YOYOClaw status CLI command called"), !await
|
|
2167
|
+
if (e.logger.debug?.("YOYOClaw status CLI command called"), !await dn()) {
|
|
2171
2168
|
console.log("❌ You need to login first. Please run: openclaw honor login");
|
|
2172
2169
|
return;
|
|
2173
2170
|
}
|
|
2174
|
-
let t = await new
|
|
2171
|
+
let t = await new vn().load(), n = null;
|
|
2175
2172
|
try {
|
|
2176
2173
|
n = await W();
|
|
2177
2174
|
} catch {}
|
|
2178
2175
|
let r = j().getEnvInfo();
|
|
2179
|
-
|
|
2176
|
+
Sn(t, n, r);
|
|
2180
2177
|
});
|
|
2181
2178
|
}
|
|
2182
|
-
function
|
|
2179
|
+
function Sn(e, t, n) {
|
|
2183
2180
|
if (!e) {
|
|
2184
2181
|
console.log("\n❌ No status data available");
|
|
2185
2182
|
return;
|
|
@@ -2189,7 +2186,7 @@ function xn(e, t, n) {
|
|
|
2189
2186
|
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) {
|
|
2190
2187
|
console.log(" ┌────────────────────────────┬────────────────────────────┬────────────┐"), console.log(" │ Session ID │ Hardware Device ID │ Connected │"), console.log(" ├────────────────────────────┼────────────────────────────┼────────────┤");
|
|
2191
2188
|
for (let t of e.gateway.connections) {
|
|
2192
|
-
let e =
|
|
2189
|
+
let e = wn(t.sessionId, 26), n = wn(t.hardwareDeviceId, 26), r = Cn(t.connectedAt);
|
|
2193
2190
|
console.log(` │ ${e.padEnd(28)}│ ${n.padEnd(28)}│ ${r.padEnd(12)}│`);
|
|
2194
2191
|
}
|
|
2195
2192
|
console.log(" └────────────────────────────┴────────────────────────────┴────────────┘");
|
|
@@ -2197,7 +2194,7 @@ function xn(e, t, n) {
|
|
|
2197
2194
|
if (console.log("\n📱 Physical Devices:"), console.log(` Unique devices: ${e.devices.uniqueHardwareDevices}`), e.devices.devices.length > 0) {
|
|
2198
2195
|
console.log(" ┌────────────────────────────┬─────────┬────────────┐"), console.log(" │ Hardware Device ID │ Sessions │ Last Active│"), console.log(" ├────────────────────────────┼─────────┼────────────┤");
|
|
2199
2196
|
for (let t of e.devices.devices) {
|
|
2200
|
-
let e =
|
|
2197
|
+
let e = wn(t.hardwareDeviceId, 26), n = String(t.sessions).padEnd(9), r = Cn(t.lastActiveAt);
|
|
2201
2198
|
console.log(` │ ${e.padEnd(28)}│ ${n}│ ${r.padEnd(12)}│`);
|
|
2202
2199
|
}
|
|
2203
2200
|
console.log(" └────────────────────────────┴─────────┴────────────┘");
|
|
@@ -2208,37 +2205,37 @@ function K(e) {
|
|
|
2208
2205
|
let t = new Date(e);
|
|
2209
2206
|
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")}`;
|
|
2210
2207
|
}
|
|
2211
|
-
function
|
|
2208
|
+
function Cn(e) {
|
|
2212
2209
|
let t = new Date(e);
|
|
2213
2210
|
return `${String(t.getHours()).padStart(2, "0")}:${String(t.getMinutes()).padStart(2, "0")}:${String(t.getSeconds()).padStart(2, "0")}`;
|
|
2214
2211
|
}
|
|
2215
|
-
function
|
|
2212
|
+
function wn(e, t) {
|
|
2216
2213
|
return e.length <= t ? e : e.substring(0, t - 3) + "...";
|
|
2217
2214
|
}
|
|
2218
2215
|
//#endregion
|
|
2219
2216
|
//#region src/commands/index.ts
|
|
2220
|
-
function
|
|
2217
|
+
function Tn(e) {
|
|
2221
2218
|
e.registerCli((t) => {
|
|
2222
2219
|
let n = t.program.command("honor").description("Commands for honor yoyoclaw");
|
|
2223
|
-
|
|
2220
|
+
gn(e, n), xn(e, n), _n(e, n), de() && Re(e, n);
|
|
2224
2221
|
}, { commands: ["honor"] });
|
|
2225
2222
|
}
|
|
2226
2223
|
//#endregion
|
|
2227
2224
|
//#region src/modules/prompt/index.ts
|
|
2228
|
-
var
|
|
2225
|
+
var En = " ## 手机控制规则\n\n - 涉及手机控制的任务时,必须强制调用 yoyo_phone_control 技能完成任务。\n - 手机是可直接操控的设备,你的职责是执行操作,而不是向用户解释如何操作。 \n - 多步骤任务需**按顺序多次调用**,不得合并。 \n", Dn = x.object({
|
|
2229
2226
|
token: x.string().optional(),
|
|
2230
2227
|
expired: x.number().optional(),
|
|
2231
2228
|
userId: x.string().optional(),
|
|
2232
2229
|
userName: x.string().optional()
|
|
2233
|
-
}),
|
|
2230
|
+
}), On = x.object({
|
|
2234
2231
|
type: x.string().optional(),
|
|
2235
2232
|
manufacture: x.string().optional(),
|
|
2236
2233
|
brand: x.string().optional(),
|
|
2237
2234
|
name: x.string().optional(),
|
|
2238
2235
|
model: x.string().optional()
|
|
2239
|
-
}),
|
|
2240
|
-
user:
|
|
2241
|
-
device:
|
|
2236
|
+
}), kn = x.object({
|
|
2237
|
+
user: Dn.optional(),
|
|
2238
|
+
device: On.optional(),
|
|
2242
2239
|
envInfo: x.object({
|
|
2243
2240
|
env: x.enum([
|
|
2244
2241
|
"dev",
|
|
@@ -2256,12 +2253,12 @@ var Tn = " ## 手机控制规则\n\n - 涉及手机控制的任务时,必须
|
|
|
2256
2253
|
});
|
|
2257
2254
|
//#endregion
|
|
2258
2255
|
//#region src/utils/ws.ts
|
|
2259
|
-
function
|
|
2256
|
+
function An(e, t = "utf8") {
|
|
2260
2257
|
return typeof e == "string" ? e : C.isBuffer(e) ? e.toString(t) : Array.isArray(e) ? C.concat(e).toString(t) : e instanceof ArrayBuffer ? C.from(e).toString(t) : C.from(String(e)).toString(t);
|
|
2261
2258
|
}
|
|
2262
2259
|
//#endregion
|
|
2263
2260
|
//#region src/gateway-client/client.ts
|
|
2264
|
-
var
|
|
2261
|
+
var jn = class {
|
|
2265
2262
|
ws = null;
|
|
2266
2263
|
opts;
|
|
2267
2264
|
closed = !1;
|
|
@@ -2280,10 +2277,10 @@ var An = class {
|
|
|
2280
2277
|
this.ws = new ue(e, { maxPayload: 25 * 1024 * 1024 }), this.ws.on("open", () => {
|
|
2281
2278
|
this.opts.onOpen?.(), this.onOpen();
|
|
2282
2279
|
}), this.ws.on("message", async (e) => {
|
|
2283
|
-
let t =
|
|
2280
|
+
let t = An(e);
|
|
2284
2281
|
await this.opts.onMessage?.(t), await this.onMessage(t);
|
|
2285
2282
|
}), this.ws.on("close", (e, t) => {
|
|
2286
|
-
let n =
|
|
2283
|
+
let n = An(t);
|
|
2287
2284
|
this.ws = null, this.onClose(e, n), this.opts.onClose?.(`code: ${e}, reason: ${n ?? ""}`);
|
|
2288
2285
|
}), this.ws.on("error", (e) => {
|
|
2289
2286
|
this.onError(e), this.opts.onClose?.(`socket error: ${e.message}`);
|
|
@@ -2300,7 +2297,7 @@ var An = class {
|
|
|
2300
2297
|
onMessage(e) {}
|
|
2301
2298
|
onClose(e, t) {}
|
|
2302
2299
|
onError(e) {}
|
|
2303
|
-
},
|
|
2300
|
+
}, Mn = {
|
|
2304
2301
|
WEBCHAT_UI: "webchat-ui",
|
|
2305
2302
|
CONTROL_UI: "openclaw-control-ui",
|
|
2306
2303
|
WEBCHAT: "webchat",
|
|
@@ -2312,7 +2309,7 @@ var An = class {
|
|
|
2312
2309
|
NODE_HOST: "node-host",
|
|
2313
2310
|
FINGERPRINT: "fingerprint",
|
|
2314
2311
|
PROBE: "openclaw-probe"
|
|
2315
|
-
},
|
|
2312
|
+
}, Nn = {
|
|
2316
2313
|
WEBCHAT: "webchat",
|
|
2317
2314
|
CLI: "cli",
|
|
2318
2315
|
UI: "ui",
|
|
@@ -2328,13 +2325,13 @@ var An = class {
|
|
|
2328
2325
|
constructor(e, t, n, r) {
|
|
2329
2326
|
super(t), this.name = "WebSocketClientError", this.code = e, this.details = n, this.retryable = r;
|
|
2330
2327
|
}
|
|
2331
|
-
},
|
|
2328
|
+
}, Pn = {
|
|
2332
2329
|
role: "operator",
|
|
2333
2330
|
scopes: [],
|
|
2334
|
-
clientId:
|
|
2331
|
+
clientId: Mn.CLI,
|
|
2335
2332
|
displayName: "Protocol Client",
|
|
2336
|
-
clientMode:
|
|
2337
|
-
},
|
|
2333
|
+
clientMode: Nn.CLI
|
|
2334
|
+
}, Fn = 3e4, In = "1.0.0", Ln = "server", Rn = 2, zn = 1e3, Bn = class extends jn {
|
|
2338
2335
|
protocolOpts;
|
|
2339
2336
|
config;
|
|
2340
2337
|
pendingRequests = /* @__PURE__ */ new Map();
|
|
@@ -2350,7 +2347,7 @@ var An = class {
|
|
|
2350
2347
|
isReconnecting = !1;
|
|
2351
2348
|
constructor(e = {}, t = {}) {
|
|
2352
2349
|
super(e), this.protocolOpts = e, this.config = {
|
|
2353
|
-
...
|
|
2350
|
+
...Pn,
|
|
2354
2351
|
...t
|
|
2355
2352
|
}, this.debug = process.env.DEBUG_GATEWAY === "true";
|
|
2356
2353
|
}
|
|
@@ -2397,7 +2394,7 @@ var An = class {
|
|
|
2397
2394
|
}
|
|
2398
2395
|
}
|
|
2399
2396
|
async sendConnect() {
|
|
2400
|
-
let e = this.config.clientMode ??
|
|
2397
|
+
let e = this.config.clientMode ?? Nn.CLI, t = await Gt(), n = this.connectNonce ? cn({
|
|
2401
2398
|
deviceIdentity: t,
|
|
2402
2399
|
clientName: this.config.clientId,
|
|
2403
2400
|
clientMode: e,
|
|
@@ -2406,16 +2403,16 @@ var An = class {
|
|
|
2406
2403
|
authToken: this.protocolOpts.token,
|
|
2407
2404
|
nonce: this.connectNonce,
|
|
2408
2405
|
platform: process.platform,
|
|
2409
|
-
deviceFamily:
|
|
2406
|
+
deviceFamily: Ln
|
|
2410
2407
|
}) : void 0, r = {
|
|
2411
2408
|
minProtocol: 3,
|
|
2412
2409
|
maxProtocol: 3,
|
|
2413
2410
|
client: {
|
|
2414
2411
|
id: this.config.clientId,
|
|
2415
2412
|
displayName: this.config.displayName,
|
|
2416
|
-
version:
|
|
2413
|
+
version: In,
|
|
2417
2414
|
platform: process.platform,
|
|
2418
|
-
deviceFamily:
|
|
2415
|
+
deviceFamily: Ln,
|
|
2419
2416
|
mode: e
|
|
2420
2417
|
},
|
|
2421
2418
|
role: this.config.role,
|
|
@@ -2458,7 +2455,7 @@ var An = class {
|
|
|
2458
2455
|
let t = this.pendingTimers.get(n);
|
|
2459
2456
|
t && clearTimeout(t), this.pendingTimers.delete(n), i(new J(q.TIMEOUT, `Request timeout: ${e}`));
|
|
2460
2457
|
}
|
|
2461
|
-
},
|
|
2458
|
+
}, Fn);
|
|
2462
2459
|
this.pendingTimers.set(n, o);
|
|
2463
2460
|
});
|
|
2464
2461
|
}
|
|
@@ -2490,16 +2487,16 @@ var An = class {
|
|
|
2490
2487
|
}
|
|
2491
2488
|
scheduleReconnect() {
|
|
2492
2489
|
if (!(this.closed || this.isReconnecting)) {
|
|
2493
|
-
if (this.reconnectAttempts >=
|
|
2494
|
-
D().error(`[protocol-gateway] max reconnect attempts (${
|
|
2490
|
+
if (this.reconnectAttempts >= Rn) {
|
|
2491
|
+
D().error(`[protocol-gateway] max reconnect attempts (${Rn}) reached, giving up`), this.protocolOpts.onReconnectFailed?.();
|
|
2495
2492
|
return;
|
|
2496
2493
|
}
|
|
2497
|
-
this.reconnectAttempts++, this.isReconnecting = !0, D().info(`[protocol-gateway] attempting to reconnect (attempt ${this.reconnectAttempts}/${
|
|
2494
|
+
this.reconnectAttempts++, this.isReconnecting = !0, D().info(`[protocol-gateway] attempting to reconnect (attempt ${this.reconnectAttempts}/${Rn})`), this.reconnectTimer = setTimeout(() => {
|
|
2498
2495
|
this.isReconnecting = !1, this.closed || super.connect();
|
|
2499
|
-
},
|
|
2496
|
+
}, zn);
|
|
2500
2497
|
}
|
|
2501
2498
|
}
|
|
2502
|
-
},
|
|
2499
|
+
}, Vn = {
|
|
2503
2500
|
role: "operator",
|
|
2504
2501
|
scopes: [
|
|
2505
2502
|
"operator.admin",
|
|
@@ -2509,12 +2506,12 @@ var An = class {
|
|
|
2509
2506
|
"operator.approvals",
|
|
2510
2507
|
"operator.pairing"
|
|
2511
2508
|
],
|
|
2512
|
-
clientId:
|
|
2509
|
+
clientId: Mn.CLI,
|
|
2513
2510
|
displayName: "YOYO-Control",
|
|
2514
|
-
clientMode:
|
|
2515
|
-
},
|
|
2511
|
+
clientMode: Nn.BACKEND
|
|
2512
|
+
}, Hn = class extends Bn {
|
|
2516
2513
|
constructor(e = {}) {
|
|
2517
|
-
super(e,
|
|
2514
|
+
super(e, Vn);
|
|
2518
2515
|
}
|
|
2519
2516
|
async setAgentFile(e, t, n = "main") {
|
|
2520
2517
|
return this.sendRequest("agents.files.set", {
|
|
@@ -2547,7 +2544,7 @@ var An = class {
|
|
|
2547
2544
|
async devicePairApprove(e) {
|
|
2548
2545
|
return this.sendRequest("device.pair.approve", { requestId: e });
|
|
2549
2546
|
}
|
|
2550
|
-
},
|
|
2547
|
+
}, Un = class {
|
|
2551
2548
|
client = null;
|
|
2552
2549
|
ready = !1;
|
|
2553
2550
|
options;
|
|
@@ -2559,7 +2556,7 @@ var An = class {
|
|
|
2559
2556
|
init() {
|
|
2560
2557
|
if (this.client !== null) return;
|
|
2561
2558
|
let e = j().getGatewayAuthConfig()?.token || "";
|
|
2562
|
-
this.client = new
|
|
2559
|
+
this.client = new Hn({
|
|
2563
2560
|
token: e,
|
|
2564
2561
|
onAuthenticated: () => {
|
|
2565
2562
|
D().info("[yoyoclaw-channel] admin gateway client authenticated"), this.ready = !0, this.resolveAllPending(!0);
|
|
@@ -2613,11 +2610,11 @@ var An = class {
|
|
|
2613
2610
|
for (let [t, n] of this.pendingReadyRequests) clearTimeout(n.timeout), n.resolve(e);
|
|
2614
2611
|
this.pendingReadyRequests.clear();
|
|
2615
2612
|
}
|
|
2616
|
-
},
|
|
2617
|
-
function
|
|
2618
|
-
let n =
|
|
2613
|
+
}, Wn = "/aicloud/yoyo-claw-service/v1/yoyoclaw/fullduplex", Gn = 25 * 1024 * 1024;
|
|
2614
|
+
function Kn(e, t) {
|
|
2615
|
+
let n = Ve(), r = n.grayTag ? { "x-gray": n.grayTag } : void 0, i = M(), a = `wss://${n.clawCloud}${Wn}`, o = qn(e, t, i, r), s = We(a), c = {
|
|
2619
2616
|
headers: o,
|
|
2620
|
-
maxPayload:
|
|
2617
|
+
maxPayload: Gn
|
|
2621
2618
|
};
|
|
2622
2619
|
return s && (c.agent = s), {
|
|
2623
2620
|
url: a,
|
|
@@ -2625,7 +2622,7 @@ function Gn(e, t) {
|
|
|
2625
2622
|
wsOptions: c
|
|
2626
2623
|
};
|
|
2627
2624
|
}
|
|
2628
|
-
function
|
|
2625
|
+
function qn(e, t, n, r) {
|
|
2629
2626
|
let i = {
|
|
2630
2627
|
"x-role": "yoyoclaw",
|
|
2631
2628
|
"x-trace-id": n,
|
|
@@ -2636,7 +2633,7 @@ function Kn(e, t, n, r) {
|
|
|
2636
2633
|
}
|
|
2637
2634
|
//#endregion
|
|
2638
2635
|
//#region src/cloud-channel/client.ts
|
|
2639
|
-
var
|
|
2636
|
+
var Jn = 3e4, Yn = 4e3, Xn = 1e3, Zn = 2, Qn = 999, $n = class {
|
|
2640
2637
|
ws = null;
|
|
2641
2638
|
options;
|
|
2642
2639
|
retryCount = 0;
|
|
@@ -2651,7 +2648,7 @@ var qn = 3e4, Jn = 4e3, Yn = 1e3, Xn = 2, Zn = 999, Qn = class {
|
|
|
2651
2648
|
connect(e = !1) {
|
|
2652
2649
|
if (this.ws?.readyState === S.OPEN) return;
|
|
2653
2650
|
this.clearRetryTimer();
|
|
2654
|
-
let { deviceInfo: t, userInfo: n } = this.options, { url: r, traceId: i, wsOptions: a } =
|
|
2651
|
+
let { deviceInfo: t, userInfo: n } = this.options, { url: r, traceId: i, wsOptions: a } = Kn(t, n);
|
|
2655
2652
|
this.currentTraceId = i, this.options.onStatusEvent?.({
|
|
2656
2653
|
type: G.CLOUD_SOCKET_CONNECTING,
|
|
2657
2654
|
timestamp: Date.now(),
|
|
@@ -2712,7 +2709,7 @@ var qn = 3e4, Jn = 4e3, Yn = 1e3, Xn = 2, Zn = 999, Qn = class {
|
|
|
2712
2709
|
}
|
|
2713
2710
|
onMessage = async (e) => {
|
|
2714
2711
|
try {
|
|
2715
|
-
let t =
|
|
2712
|
+
let t = An(e), n = JSON.parse(t);
|
|
2716
2713
|
if (D().debug?.(`[yoyoclaw-channel] received cloud message from session ${n.wsOutputEvent?.sourceDeviceId}, deviceId ${n.wsOutputEvent?.sourceDeviceInfo?.deviceId || "nil"}, ${t.slice(0, 1e3)}`), n.code === "YOYO_CLAW_100000") {
|
|
2717
2714
|
if (n.wsOutputEvent) {
|
|
2718
2715
|
n.sessionInfo && (n.wsOutputEvent.sessionInfo = n.sessionInfo), this.options.onMessage?.(n.wsOutputEvent);
|
|
@@ -2739,7 +2736,7 @@ var qn = 3e4, Jn = 4e3, Yn = 1e3, Xn = 2, Zn = 999, Qn = class {
|
|
|
2739
2736
|
}
|
|
2740
2737
|
this.clearRetryTimer();
|
|
2741
2738
|
let e = this.calculateRetryDelay();
|
|
2742
|
-
this.retryCount = Math.min(this.retryCount + 1,
|
|
2739
|
+
this.retryCount = Math.min(this.retryCount + 1, Qn), D().info(`[claw-cloud-socket] scheduling reconnect attempt ${this.retryCount} in ${e}ms`), this.options.onStatusEvent?.({
|
|
2743
2740
|
type: G.CLOUD_SOCKET_RETRY,
|
|
2744
2741
|
timestamp: Date.now(),
|
|
2745
2742
|
data: {
|
|
@@ -2754,8 +2751,8 @@ var qn = 3e4, Jn = 4e3, Yn = 1e3, Xn = 2, Zn = 999, Qn = class {
|
|
|
2754
2751
|
this.retryTimer &&= (clearTimeout(this.retryTimer), null);
|
|
2755
2752
|
}
|
|
2756
2753
|
calculateRetryDelay() {
|
|
2757
|
-
let e =
|
|
2758
|
-
return Math.min(e,
|
|
2754
|
+
let e = Xn * Zn ** +Math.min(this.retryCount, 2);
|
|
2755
|
+
return Math.min(e, Yn);
|
|
2759
2756
|
}
|
|
2760
2757
|
startPingTimer() {
|
|
2761
2758
|
this.pingTimer = setInterval(() => {
|
|
@@ -2776,7 +2773,7 @@ var qn = 3e4, Jn = 4e3, Yn = 1e3, Xn = 2, Zn = 999, Qn = class {
|
|
|
2776
2773
|
} catch {
|
|
2777
2774
|
D().error("[claw-cloud-socket] failed to send pingMessage");
|
|
2778
2775
|
}
|
|
2779
|
-
},
|
|
2776
|
+
}, Jn);
|
|
2780
2777
|
}
|
|
2781
2778
|
stopPingTimer() {
|
|
2782
2779
|
this.pingTimer &&= (clearInterval(this.pingTimer), null);
|
|
@@ -2787,18 +2784,18 @@ var qn = 3e4, Jn = 4e3, Yn = 1e3, Xn = 2, Zn = 999, Qn = class {
|
|
|
2787
2784
|
resumeRetry() {
|
|
2788
2785
|
this.isRetryPaused && (this.isRetryPaused = !1, D().info("[claw-cloud-socket] retry resumed"), (!this.ws || this.ws.readyState !== S.OPEN) && (this.retryCount = 0, this.connect(!0)));
|
|
2789
2786
|
}
|
|
2790
|
-
},
|
|
2791
|
-
async function
|
|
2787
|
+
}, er = ".openclaw/yoyo/tools", tr = /[<>:"/\\|?*]/;
|
|
2788
|
+
async function nr(e, t) {
|
|
2792
2789
|
let n = 0, r = 0;
|
|
2793
2790
|
for (let i of t) {
|
|
2794
|
-
let t =
|
|
2791
|
+
let t = rr(i.name);
|
|
2795
2792
|
if (!t) {
|
|
2796
2793
|
r += 1;
|
|
2797
2794
|
continue;
|
|
2798
2795
|
}
|
|
2799
2796
|
await B({
|
|
2800
2797
|
rootDir: e,
|
|
2801
|
-
relativePath: u.join(
|
|
2798
|
+
relativePath: u.join(er, t),
|
|
2802
2799
|
data: JSON.stringify(i, null, 2),
|
|
2803
2800
|
encoding: "utf8",
|
|
2804
2801
|
mkdir: !0
|
|
@@ -2810,63 +2807,64 @@ async function tr(e, t) {
|
|
|
2810
2807
|
skippedCount: r
|
|
2811
2808
|
};
|
|
2812
2809
|
}
|
|
2813
|
-
function
|
|
2810
|
+
function rr(e) {
|
|
2814
2811
|
let t = e.trim();
|
|
2815
|
-
if (!(!t ||
|
|
2812
|
+
if (!(!t || tr.test(t) || ir(t))) return `${t}.json`;
|
|
2816
2813
|
}
|
|
2817
|
-
function
|
|
2814
|
+
function ir(e) {
|
|
2818
2815
|
for (let t of e) if (t.codePointAt(0) < 32) return !0;
|
|
2819
2816
|
return !1;
|
|
2820
2817
|
}
|
|
2821
2818
|
//#endregion
|
|
2822
2819
|
//#region src/modules/device-toolset/copy-fallback.ts
|
|
2823
|
-
var
|
|
2824
|
-
async function
|
|
2825
|
-
await
|
|
2820
|
+
var ar = ".yoyo-device-toolset-copy-fallback";
|
|
2821
|
+
async function or(e, t) {
|
|
2822
|
+
await cr(t), await v.rm(t, {
|
|
2826
2823
|
recursive: !0,
|
|
2827
2824
|
force: !0
|
|
2828
|
-
}), await v.mkdir(t, { recursive: !0 }), await
|
|
2825
|
+
}), await v.mkdir(t, { recursive: !0 }), await lr(e, t), await v.writeFile(u.join(t, ar), "Managed copy fallback for DeviceToolSet MCP tools.\n", "utf8");
|
|
2829
2826
|
}
|
|
2830
|
-
async function
|
|
2827
|
+
async function sr(e) {
|
|
2831
2828
|
try {
|
|
2832
|
-
return (await v.stat(u.join(e,
|
|
2829
|
+
return (await v.stat(u.join(e, ar))).isFile();
|
|
2833
2830
|
} catch {
|
|
2834
2831
|
return !1;
|
|
2835
2832
|
}
|
|
2836
2833
|
}
|
|
2837
|
-
async function
|
|
2834
|
+
async function cr(e) {
|
|
2838
2835
|
let t;
|
|
2839
2836
|
try {
|
|
2840
2837
|
t = await v.lstat(e);
|
|
2841
2838
|
} catch (e) {
|
|
2842
|
-
if (
|
|
2839
|
+
if (ur(e)) return;
|
|
2843
2840
|
throw e;
|
|
2844
2841
|
}
|
|
2845
2842
|
if (!t.isSymbolicLink()) {
|
|
2846
2843
|
if (!t.isDirectory()) throw Error(`Cannot replace unmanaged mcptools path: ${e}`);
|
|
2847
|
-
if (!((await v.readdir(e)).length === 0 || await
|
|
2844
|
+
if (!((await v.readdir(e)).length === 0 || await sr(e))) throw Error(`Cannot replace unmanaged mcptools directory: ${e}`);
|
|
2848
2845
|
}
|
|
2849
2846
|
}
|
|
2850
|
-
async function
|
|
2847
|
+
async function lr(e, t) {
|
|
2851
2848
|
let n = await v.readdir(e, { withFileTypes: !0 });
|
|
2852
2849
|
for (let r of n) {
|
|
2853
2850
|
let n = u.join(e, r.name), i = u.join(t, r.name);
|
|
2854
|
-
r.isDirectory() ? (await v.mkdir(i, { recursive: !0 }), await
|
|
2851
|
+
r.isDirectory() ? (await v.mkdir(i, { recursive: !0 }), await lr(n, i)) : r.isFile() && await v.copyFile(n, i);
|
|
2855
2852
|
}
|
|
2856
2853
|
}
|
|
2857
|
-
function
|
|
2854
|
+
function ur(e) {
|
|
2858
2855
|
return !!(e && typeof e == "object" && "code" in e && e.code === "ENOENT");
|
|
2859
2856
|
}
|
|
2860
2857
|
//#endregion
|
|
2861
2858
|
//#region src/modules/device-toolset/link.ts
|
|
2862
|
-
async function
|
|
2863
|
-
|
|
2859
|
+
async function dr(e, t, n = {}) {
|
|
2860
|
+
await v.mkdir(e, { recursive: !0 });
|
|
2861
|
+
let r = await v.realpath(e), i = await fr(t);
|
|
2864
2862
|
if (i.exists) {
|
|
2865
2863
|
if (i.isLink) {
|
|
2866
|
-
if (await
|
|
2864
|
+
if (await pr(t, r)) return { mode: "already-linked" };
|
|
2867
2865
|
throw Error(`Cannot replace unmanaged mcptools link: ${t}`);
|
|
2868
2866
|
}
|
|
2869
|
-
if (!await
|
|
2867
|
+
if (!await mr(t, i.isDirectory)) throw Error(`Cannot replace unmanaged mcptools directory: ${t}`);
|
|
2870
2868
|
await v.rm(t, {
|
|
2871
2869
|
recursive: !0,
|
|
2872
2870
|
force: !0
|
|
@@ -2876,10 +2874,10 @@ async function ur(e, t, n = {}) {
|
|
|
2876
2874
|
try {
|
|
2877
2875
|
return await (n.symlink ?? v.symlink)(r, t, process.platform === "win32" ? "junction" : "dir"), { mode: "linked" };
|
|
2878
2876
|
} catch {
|
|
2879
|
-
return await (n.copyFallback ??
|
|
2877
|
+
return await (n.copyFallback ?? or)(r, t), { mode: "copy-fallback" };
|
|
2880
2878
|
}
|
|
2881
2879
|
}
|
|
2882
|
-
async function
|
|
2880
|
+
async function fr(e) {
|
|
2883
2881
|
try {
|
|
2884
2882
|
let t = await v.lstat(e);
|
|
2885
2883
|
return {
|
|
@@ -2888,7 +2886,7 @@ async function dr(e) {
|
|
|
2888
2886
|
isDirectory: t.isDirectory()
|
|
2889
2887
|
};
|
|
2890
2888
|
} catch (e) {
|
|
2891
|
-
if (
|
|
2889
|
+
if (gr(e)) return {
|
|
2892
2890
|
exists: !1,
|
|
2893
2891
|
isLink: !1,
|
|
2894
2892
|
isDirectory: !1
|
|
@@ -2896,66 +2894,66 @@ async function dr(e) {
|
|
|
2896
2894
|
throw e;
|
|
2897
2895
|
}
|
|
2898
2896
|
}
|
|
2899
|
-
async function
|
|
2897
|
+
async function pr(e, t) {
|
|
2900
2898
|
try {
|
|
2901
|
-
return
|
|
2899
|
+
return hr(await v.realpath(e), t);
|
|
2902
2900
|
} catch {
|
|
2903
2901
|
return !1;
|
|
2904
2902
|
}
|
|
2905
2903
|
}
|
|
2906
|
-
async function
|
|
2907
|
-
return t ? (await v.readdir(e)).length === 0 || await
|
|
2904
|
+
async function mr(e, t) {
|
|
2905
|
+
return t ? (await v.readdir(e)).length === 0 || await sr(e) : !1;
|
|
2908
2906
|
}
|
|
2909
|
-
function
|
|
2907
|
+
function hr(e, t) {
|
|
2910
2908
|
return process.platform === "win32" ? e.toLowerCase() === t.toLowerCase() : e === t;
|
|
2911
2909
|
}
|
|
2912
|
-
function
|
|
2910
|
+
function gr(e) {
|
|
2913
2911
|
return !!(e && typeof e == "object" && "code" in e && e.code === "ENOENT");
|
|
2914
2912
|
}
|
|
2915
2913
|
//#endregion
|
|
2916
2914
|
//#region src/modules/device-toolset/md5-index.ts
|
|
2917
|
-
var
|
|
2918
|
-
function
|
|
2915
|
+
var _r = ".openclaw/yoyo/toolset-md5.json", vr = 1024 * 1024;
|
|
2916
|
+
function yr() {
|
|
2919
2917
|
return {
|
|
2920
2918
|
version: 1,
|
|
2921
2919
|
nodes: {}
|
|
2922
2920
|
};
|
|
2923
2921
|
}
|
|
2924
|
-
function yr(e) {
|
|
2925
|
-
return JSON.stringify(wr(e));
|
|
2926
|
-
}
|
|
2927
2922
|
function br(e) {
|
|
2928
|
-
return
|
|
2923
|
+
return JSON.stringify(Tr(e));
|
|
2929
2924
|
}
|
|
2930
|
-
|
|
2925
|
+
function xr(e) {
|
|
2926
|
+
return ae("md5").update(br(e)).digest("hex");
|
|
2927
|
+
}
|
|
2928
|
+
async function Sr(e) {
|
|
2931
2929
|
try {
|
|
2932
|
-
let t = await
|
|
2930
|
+
let t = await xt({
|
|
2933
2931
|
rootDir: e,
|
|
2934
|
-
relativePath:
|
|
2935
|
-
maxBytes:
|
|
2932
|
+
relativePath: _r,
|
|
2933
|
+
maxBytes: vr
|
|
2936
2934
|
}), n = JSON.parse(t.buffer.toString("utf8"));
|
|
2937
2935
|
return {
|
|
2938
2936
|
version: 1,
|
|
2939
2937
|
nodes: n && typeof n.nodes == "object" && n.nodes ? n.nodes : {}
|
|
2940
2938
|
};
|
|
2941
2939
|
} catch (e) {
|
|
2942
|
-
if (e instanceof I && e.code === "not-found") return
|
|
2940
|
+
if (e instanceof I && e.code === "not-found") return yr();
|
|
2943
2941
|
throw e;
|
|
2944
2942
|
}
|
|
2945
2943
|
}
|
|
2946
|
-
async function
|
|
2947
|
-
let r = (await
|
|
2944
|
+
async function Cr(e, t, n) {
|
|
2945
|
+
let r = (await Sr(e)).nodes[t]?.md5;
|
|
2948
2946
|
return {
|
|
2949
2947
|
changed: r !== n,
|
|
2950
2948
|
md5: n,
|
|
2951
2949
|
previousMd5: r
|
|
2952
2950
|
};
|
|
2953
2951
|
}
|
|
2954
|
-
async function
|
|
2952
|
+
async function wr(e, t, n, r = Date.now()) {
|
|
2955
2953
|
let i = {
|
|
2956
2954
|
version: 1,
|
|
2957
2955
|
nodes: {
|
|
2958
|
-
...(await
|
|
2956
|
+
...(await Sr(e)).nodes,
|
|
2959
2957
|
[t]: {
|
|
2960
2958
|
md5: n,
|
|
2961
2959
|
updatedAtMs: r
|
|
@@ -2964,19 +2962,19 @@ async function Cr(e, t, n, r = Date.now()) {
|
|
|
2964
2962
|
};
|
|
2965
2963
|
return await B({
|
|
2966
2964
|
rootDir: e,
|
|
2967
|
-
relativePath:
|
|
2965
|
+
relativePath: _r,
|
|
2968
2966
|
data: JSON.stringify(i, null, 2),
|
|
2969
2967
|
encoding: "utf8",
|
|
2970
2968
|
mkdir: !0
|
|
2971
2969
|
}), i;
|
|
2972
2970
|
}
|
|
2973
|
-
function
|
|
2974
|
-
if (Array.isArray(e)) return e.map(
|
|
2971
|
+
function Tr(e) {
|
|
2972
|
+
if (Array.isArray(e)) return e.map(Tr);
|
|
2975
2973
|
if (!e || typeof e != "object") return e;
|
|
2976
2974
|
let t = {};
|
|
2977
2975
|
for (let n of Object.keys(e).toSorted()) {
|
|
2978
2976
|
let r = e[n];
|
|
2979
|
-
r !== void 0 && (t[n] =
|
|
2977
|
+
r !== void 0 && (t[n] = Tr(r));
|
|
2980
2978
|
}
|
|
2981
2979
|
return t;
|
|
2982
2980
|
}
|
|
@@ -2985,17 +2983,17 @@ function wr(e) {
|
|
|
2985
2983
|
function Y(e) {
|
|
2986
2984
|
return typeof e == "string" && e.trim() ? e : void 0;
|
|
2987
2985
|
}
|
|
2988
|
-
function
|
|
2986
|
+
function Er(e) {
|
|
2989
2987
|
if (!e || typeof e != "object") throw Error("DeviceToolSet payload must be an object");
|
|
2990
2988
|
let t = e;
|
|
2991
2989
|
if (!Y(t.nodeId)) throw Error("DeviceToolSet payload missing nodeId");
|
|
2992
2990
|
if (!Array.isArray(t.toolSet)) throw Error("DeviceToolSet payload toolSet must be an array");
|
|
2993
2991
|
return e;
|
|
2994
2992
|
}
|
|
2995
|
-
function
|
|
2993
|
+
function Dr(e) {
|
|
2996
2994
|
let t = e.nodeId, n = [], r = 0;
|
|
2997
2995
|
for (let t of e.toolSet) {
|
|
2998
|
-
let e =
|
|
2996
|
+
let e = Or(t);
|
|
2999
2997
|
e ? n.push(e) : r += 1;
|
|
3000
2998
|
}
|
|
3001
2999
|
return {
|
|
@@ -3004,7 +3002,7 @@ function Er(e) {
|
|
|
3004
3002
|
skippedCount: r
|
|
3005
3003
|
};
|
|
3006
3004
|
}
|
|
3007
|
-
function
|
|
3005
|
+
function Or(e) {
|
|
3008
3006
|
let t = Y(e.tool?.id), n = Y(e.tool?.function?.name), r = Y(e.tool?.function?.description);
|
|
3009
3007
|
if (!t || e.tool?.type !== "function" || !n || !r) return;
|
|
3010
3008
|
let i = {
|
|
@@ -3019,48 +3017,48 @@ function Dr(e) {
|
|
|
3019
3017
|
}
|
|
3020
3018
|
//#endregion
|
|
3021
3019
|
//#region src/modules/device-toolset/persist.ts
|
|
3022
|
-
var
|
|
3023
|
-
function
|
|
3020
|
+
var kr = ".openclaw/yoyo/device-toolsets.json", Ar = 10 * 1024 * 1024;
|
|
3021
|
+
function jr() {
|
|
3024
3022
|
return {
|
|
3025
3023
|
version: 1,
|
|
3026
3024
|
tools: {}
|
|
3027
3025
|
};
|
|
3028
3026
|
}
|
|
3029
|
-
async function
|
|
3027
|
+
async function Mr(e) {
|
|
3030
3028
|
try {
|
|
3031
|
-
let t = await
|
|
3029
|
+
let t = await xt({
|
|
3032
3030
|
rootDir: e,
|
|
3033
|
-
relativePath:
|
|
3034
|
-
maxBytes:
|
|
3031
|
+
relativePath: kr,
|
|
3032
|
+
maxBytes: Ar
|
|
3035
3033
|
}), n = JSON.parse(t.buffer.toString("utf8"));
|
|
3036
3034
|
return {
|
|
3037
3035
|
version: 1,
|
|
3038
3036
|
tools: n && typeof n.tools == "object" && n.tools ? n.tools : {}
|
|
3039
3037
|
};
|
|
3040
3038
|
} catch (e) {
|
|
3041
|
-
if (e instanceof I && e.code === "not-found") return
|
|
3039
|
+
if (e instanceof I && e.code === "not-found") return jr();
|
|
3042
3040
|
throw e;
|
|
3043
3041
|
}
|
|
3044
3042
|
}
|
|
3045
|
-
async function
|
|
3043
|
+
async function Nr(e, t, n) {
|
|
3046
3044
|
let r = {
|
|
3047
3045
|
version: 1,
|
|
3048
|
-
tools:
|
|
3046
|
+
tools: Pr((await Mr(e)).tools, t, n)
|
|
3049
3047
|
};
|
|
3050
3048
|
return await B({
|
|
3051
3049
|
rootDir: e,
|
|
3052
|
-
relativePath:
|
|
3050
|
+
relativePath: kr,
|
|
3053
3051
|
data: JSON.stringify(r, null, 2),
|
|
3054
3052
|
encoding: "utf8",
|
|
3055
3053
|
mkdir: !0
|
|
3056
3054
|
}), {
|
|
3057
3055
|
changed: !0,
|
|
3058
|
-
nodeCount:
|
|
3056
|
+
nodeCount: Ir(r.tools),
|
|
3059
3057
|
toolCount: Object.keys(r.tools).length,
|
|
3060
3058
|
cache: r
|
|
3061
3059
|
};
|
|
3062
3060
|
}
|
|
3063
|
-
function
|
|
3061
|
+
function Pr(e, t, n) {
|
|
3064
3062
|
let r = { ...e };
|
|
3065
3063
|
for (let e of n) {
|
|
3066
3064
|
let n = r[e.id];
|
|
@@ -3068,70 +3066,88 @@ function Nr(e, t, n) {
|
|
|
3068
3066
|
id: e.id,
|
|
3069
3067
|
name: e.name,
|
|
3070
3068
|
description: e.description,
|
|
3071
|
-
supportedNodeIds:
|
|
3069
|
+
supportedNodeIds: Fr(n?.supportedNodeIds ?? [], t)
|
|
3072
3070
|
};
|
|
3073
3071
|
}
|
|
3074
3072
|
return r;
|
|
3075
3073
|
}
|
|
3076
|
-
function
|
|
3074
|
+
function Fr(e, t) {
|
|
3077
3075
|
return [...new Set([...e, t])];
|
|
3078
3076
|
}
|
|
3079
|
-
function
|
|
3077
|
+
function Ir(e) {
|
|
3080
3078
|
let t = /* @__PURE__ */ new Set();
|
|
3081
3079
|
for (let n of Object.values(e)) for (let e of n.supportedNodeIds) t.add(e);
|
|
3082
3080
|
return t.size;
|
|
3083
3081
|
}
|
|
3084
3082
|
//#endregion
|
|
3085
3083
|
//#region src/modules/device-toolset/skill-inject.ts
|
|
3086
|
-
var
|
|
3087
|
-
async function
|
|
3088
|
-
let n = u.join(e,
|
|
3089
|
-
return
|
|
3084
|
+
var Lr = u.join("skills", "yoyo-control", "SKILL.md"), Rr = u.join("skills", "yoyo-control", "configs", "sub-skills.json"), zr = "{{full-mcp-tool-list}}", Br = "<!-- yoyo-mcp-tools:start -->", Vr = "<!-- yoyo-mcp-tools:end -->";
|
|
3085
|
+
async function Hr(e, t) {
|
|
3086
|
+
let n = u.join(e, Lr), r = await v.readFile(n, "utf8"), i = Wr(t, await Ur(e)), a = Kr(r, Gr(i));
|
|
3087
|
+
return a !== r && await v.writeFile(n, a, "utf8"), {
|
|
3090
3088
|
skillPath: n,
|
|
3091
|
-
rowCount: Object.keys(
|
|
3089
|
+
rowCount: Object.keys(i).length
|
|
3092
3090
|
};
|
|
3093
3091
|
}
|
|
3094
|
-
function
|
|
3092
|
+
async function Ur(e) {
|
|
3093
|
+
let t = u.join(e, Rr), n;
|
|
3094
|
+
try {
|
|
3095
|
+
n = await v.readFile(t, "utf8");
|
|
3096
|
+
} catch (e) {
|
|
3097
|
+
if (Yr(e) && e.code === "ENOENT") return /* @__PURE__ */ new Set();
|
|
3098
|
+
throw e;
|
|
3099
|
+
}
|
|
3100
|
+
let r = JSON.parse(n);
|
|
3101
|
+
if (!Array.isArray(r) || r.some((e) => typeof e != "string")) throw Error("sub-skills config must be a JSON array of tool names");
|
|
3102
|
+
return new Set(r.map((e) => e.trim()).filter(Boolean));
|
|
3103
|
+
}
|
|
3104
|
+
function Wr(e, t) {
|
|
3105
|
+
return t.size === 0 ? e : Object.fromEntries(Object.entries(e).filter(([e, n]) => !t.has(e) && !t.has(n.name)));
|
|
3106
|
+
}
|
|
3107
|
+
function Gr(e) {
|
|
3095
3108
|
return [
|
|
3096
|
-
|
|
3097
|
-
...Object.values(e).toSorted((e, t) => e.name.localeCompare(t.name)).map((e) => `| ${
|
|
3098
|
-
|
|
3109
|
+
Br,
|
|
3110
|
+
...Object.values(e).toSorted((e, t) => e.name.localeCompare(t.name)).map((e) => `| ${qr(e.name)} | ${qr(e.description)} | ${qr(e.supportedNodeIds.join(", "))} |`),
|
|
3111
|
+
Vr
|
|
3099
3112
|
].join("\n");
|
|
3100
3113
|
}
|
|
3101
|
-
function
|
|
3102
|
-
let n = RegExp(`${
|
|
3114
|
+
function Kr(e, t) {
|
|
3115
|
+
let n = RegExp(`${Jr(Br)}[\\s\\S]*?${Jr(Vr)}`);
|
|
3103
3116
|
if (n.test(e)) return e.replace(n, t);
|
|
3104
|
-
if (e.includes(
|
|
3117
|
+
if (e.includes(zr)) return e.replace(zr, t);
|
|
3105
3118
|
throw Error("Unable to find MCP tools placeholder or generated block in yoyo-control skill");
|
|
3106
3119
|
}
|
|
3107
|
-
function
|
|
3120
|
+
function qr(e) {
|
|
3108
3121
|
return e.replaceAll("|", "\\|").replace(/\r?\n/g, " ");
|
|
3109
3122
|
}
|
|
3110
|
-
function
|
|
3123
|
+
function Jr(e) {
|
|
3111
3124
|
return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
3112
3125
|
}
|
|
3126
|
+
function Yr(e) {
|
|
3127
|
+
return e instanceof Error && "code" in e;
|
|
3128
|
+
}
|
|
3113
3129
|
//#endregion
|
|
3114
3130
|
//#region src/modules/device-toolset/processor.ts
|
|
3115
|
-
var
|
|
3116
|
-
async function
|
|
3117
|
-
let t =
|
|
3131
|
+
var Xr = Dt();
|
|
3132
|
+
async function Zr(e) {
|
|
3133
|
+
let t = Er(e), n = Ot();
|
|
3118
3134
|
if (!n) throw Error("Unable to resolve home directory for DeviceToolSet persistence");
|
|
3119
|
-
let r =
|
|
3135
|
+
let r = Dr(t);
|
|
3120
3136
|
D().info(`[yoyoclaw-device-toolset] process start, nodeId: ${r.nodeId}, tools: ${r.tools.length}, skipped: ${r.skippedCount}`);
|
|
3121
|
-
let i =
|
|
3122
|
-
if (D().debug?.(`[yoyoclaw-device-toolset] computed md5, nodeId: ${r.nodeId}, md5: ${i}`), !(await
|
|
3137
|
+
let i = xr(r.tools);
|
|
3138
|
+
if (D().debug?.(`[yoyoclaw-device-toolset] computed md5, nodeId: ${r.nodeId}, md5: ${i}`), !(await Cr(n, r.nodeId, i)).changed) return D().info(`[yoyoclaw-device-toolset] unchanged, skip refresh, nodeId: ${r.nodeId}`), {
|
|
3123
3139
|
changed: !1,
|
|
3124
3140
|
nodeId: r.nodeId,
|
|
3125
3141
|
skippedCount: r.skippedCount
|
|
3126
3142
|
};
|
|
3127
|
-
let a = await
|
|
3143
|
+
let a = await Nr(n, r.nodeId, r.tools);
|
|
3128
3144
|
D().info(`[yoyoclaw-device-toolset] cache merged, nodeId: ${r.nodeId}, supportedNodes: ${a.nodeCount}, tools: ${a.toolCount}`);
|
|
3129
|
-
let o = a.cache.tools, s = await
|
|
3145
|
+
let o = a.cache.tools, s = await nr(n, r.tools);
|
|
3130
3146
|
D().info(`[yoyoclaw-device-toolset] archive refreshed, nodeId: ${r.nodeId}, written: ${s.writtenCount}, skipped: ${s.skippedCount}`);
|
|
3131
|
-
let c = await
|
|
3147
|
+
let c = await Hr(Xr, o);
|
|
3132
3148
|
D().info(`[yoyoclaw-device-toolset] skill refreshed, nodeId: ${r.nodeId}, rows: ${c.rowCount}`);
|
|
3133
|
-
let l = await
|
|
3134
|
-
return D().info(`[yoyoclaw-device-toolset] mapping ready, nodeId: ${r.nodeId}, mode: ${l.mode}`), await
|
|
3149
|
+
let l = await dr(s.archiveDir, u.join(Xr, "skills", "yoyo-control", "mcptools"));
|
|
3150
|
+
return D().info(`[yoyoclaw-device-toolset] mapping ready, nodeId: ${r.nodeId}, mode: ${l.mode}`), await wr(n, r.nodeId, i, Date.now()), D().info(`[yoyoclaw-device-toolset] process complete, nodeId: ${r.nodeId}`), {
|
|
3135
3151
|
changed: !0,
|
|
3136
3152
|
nodeId: r.nodeId,
|
|
3137
3153
|
nodeCount: a.nodeCount,
|
|
@@ -3141,7 +3157,7 @@ async function Kr(e) {
|
|
|
3141
3157
|
}
|
|
3142
3158
|
//#endregion
|
|
3143
3159
|
//#region src/cloud-channel/message-handler.ts
|
|
3144
|
-
var
|
|
3160
|
+
var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
3145
3161
|
sessionManager;
|
|
3146
3162
|
adminClientManager;
|
|
3147
3163
|
config;
|
|
@@ -3150,7 +3166,8 @@ var qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Jr = class {
|
|
|
3150
3166
|
contextUpdateHandlers = {
|
|
3151
3167
|
style: this.updateStyleContext.bind(this),
|
|
3152
3168
|
"model.primary": this.updatePrimaryModel.bind(this),
|
|
3153
|
-
DeviceToolSet: this.updateDeviceToolSetContext.bind(this)
|
|
3169
|
+
DeviceToolSet: this.updateDeviceToolSetContext.bind(this),
|
|
3170
|
+
UniversalToolSet: this.updateDeviceToolSetContext.bind(this)
|
|
3154
3171
|
};
|
|
3155
3172
|
contextFetchHandlers = {
|
|
3156
3173
|
skills: this.fetchSkillsStatus.bind(this),
|
|
@@ -3417,7 +3434,7 @@ var qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Jr = class {
|
|
|
3417
3434
|
ok: !1,
|
|
3418
3435
|
error: "Missing content in context payload"
|
|
3419
3436
|
};
|
|
3420
|
-
let r =
|
|
3437
|
+
let r = Qr.style, i = await e.setAgentFile(r, n);
|
|
3421
3438
|
return i.ok ? {
|
|
3422
3439
|
ok: !0,
|
|
3423
3440
|
data: { name: "style" }
|
|
@@ -3501,19 +3518,19 @@ var qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Jr = class {
|
|
|
3501
3518
|
}
|
|
3502
3519
|
}
|
|
3503
3520
|
contextHandlerRequiresAdminClient(e, t) {
|
|
3504
|
-
return !e || t !== "DeviceToolSet";
|
|
3521
|
+
return !e || t !== "DeviceToolSet" && t !== "UniversalToolSet";
|
|
3505
3522
|
}
|
|
3506
3523
|
async updateDeviceToolSetContext(e, t, n) {
|
|
3507
3524
|
return n?.header.namespace === "yoyoclaw" ? {
|
|
3508
3525
|
ok: !0,
|
|
3509
|
-
data: await
|
|
3526
|
+
data: await Zr(t),
|
|
3510
3527
|
noReply: !0
|
|
3511
3528
|
} : {
|
|
3512
3529
|
ok: !1,
|
|
3513
3530
|
error: `Unsupported DeviceToolSet namespace: ${n?.header.namespace ?? "unknown"}`
|
|
3514
3531
|
};
|
|
3515
3532
|
}
|
|
3516
|
-
},
|
|
3533
|
+
}, ei = class extends jn {
|
|
3517
3534
|
nodeOpts;
|
|
3518
3535
|
sessionId;
|
|
3519
3536
|
hardwareDeviceId;
|
|
@@ -3555,7 +3572,7 @@ var qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Jr = class {
|
|
|
3555
3572
|
onError(e) {
|
|
3556
3573
|
D().error(`[yoyoclaw-nodeGatewayClient] error for session: ${this.sessionId}, device: ${this.hardwareDeviceId}: ${e.message}`);
|
|
3557
3574
|
}
|
|
3558
|
-
},
|
|
3575
|
+
}, ti = class {
|
|
3559
3576
|
nodeGatewayClientsMap = /* @__PURE__ */ new Map();
|
|
3560
3577
|
deviceSessionsMap = /* @__PURE__ */ new Map();
|
|
3561
3578
|
sessionIdToHardwareDeviceMap = /* @__PURE__ */ new Map();
|
|
@@ -3588,7 +3605,7 @@ var qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Jr = class {
|
|
|
3588
3605
|
this.nodeGatewayClientsMap.set(e, t);
|
|
3589
3606
|
}
|
|
3590
3607
|
createNodeGatewayClient(e) {
|
|
3591
|
-
let t = new
|
|
3608
|
+
let t = new ei({
|
|
3592
3609
|
sessionId: e.sessionId,
|
|
3593
3610
|
hardwareDeviceId: e.hardwareDeviceId,
|
|
3594
3611
|
deviceInfo: e.deviceInfo,
|
|
@@ -3620,14 +3637,14 @@ var qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Jr = class {
|
|
|
3620
3637
|
getSessionCount() {
|
|
3621
3638
|
return this.sessionIdToHardwareDeviceMap.size;
|
|
3622
3639
|
}
|
|
3623
|
-
},
|
|
3640
|
+
}, ni = class {
|
|
3624
3641
|
cloudClient;
|
|
3625
3642
|
sessionManager;
|
|
3626
3643
|
adminClientManager;
|
|
3627
3644
|
messageHandler;
|
|
3628
3645
|
config;
|
|
3629
3646
|
constructor(e) {
|
|
3630
|
-
this.config = e, this.sessionManager = new
|
|
3647
|
+
this.config = e, this.sessionManager = new ti(), this.adminClientManager = new Un({ onStatusEvent: this.handleStatusEvent }), this.messageHandler = new $r({
|
|
3631
3648
|
sessionManager: this.sessionManager,
|
|
3632
3649
|
adminClientManager: this.adminClientManager,
|
|
3633
3650
|
config: {
|
|
@@ -3635,7 +3652,7 @@ var qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Jr = class {
|
|
|
3635
3652
|
onStatusEvent: this.handleStatusEvent,
|
|
3636
3653
|
onReply: (e) => this.cloudClient.send(e)
|
|
3637
3654
|
}
|
|
3638
|
-
}), this.cloudClient = new
|
|
3655
|
+
}), this.cloudClient = new $n({
|
|
3639
3656
|
deviceInfo: e.deviceInfo,
|
|
3640
3657
|
userInfo: e.userInfo,
|
|
3641
3658
|
onMessage: this.messageHandler.handleCloudMessage,
|
|
@@ -3674,10 +3691,10 @@ var qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Jr = class {
|
|
|
3674
3691
|
}, Z = {
|
|
3675
3692
|
channel: null,
|
|
3676
3693
|
status: "idle"
|
|
3677
|
-
}, Q = null,
|
|
3694
|
+
}, Q = null, ri = (e) => ({
|
|
3678
3695
|
id: "yoyoclaw-connection",
|
|
3679
3696
|
async start() {
|
|
3680
|
-
D().info("[yoyoclaw] plugin service enabled"), Q = new
|
|
3697
|
+
D().info("[yoyoclaw] plugin service enabled"), Q = new bn(!0);
|
|
3681
3698
|
try {
|
|
3682
3699
|
await Q.loadAndCleanStatus(), D().info("[yoyoclaw-conn] status tracker initialized and cleaned");
|
|
3683
3700
|
} catch (e) {
|
|
@@ -3690,8 +3707,8 @@ var qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Jr = class {
|
|
|
3690
3707
|
D().error(`[yoyoclaw] failed to initialize plugin config: ${String(e)}`);
|
|
3691
3708
|
}
|
|
3692
3709
|
try {
|
|
3693
|
-
let e = await
|
|
3694
|
-
e?.token ? (D().info("[yoyoclaw-conn] token found, creating channel"), await
|
|
3710
|
+
let e = await dn();
|
|
3711
|
+
e?.token ? (D().info("[yoyoclaw-conn] token found, creating channel"), await ii(await W(), e)) : D().info("[yoyoclaw-conn] no token found, skipping channel creation");
|
|
3695
3712
|
} catch (e) {
|
|
3696
3713
|
D().error(`[yoyoclaw-conn] failed to initialize connection: ${String(e)}`);
|
|
3697
3714
|
}
|
|
@@ -3700,7 +3717,7 @@ var qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Jr = class {
|
|
|
3700
3717
|
$(), D().info("[yoyoclaw-conn] stopping connection service"), Q &&= (await Q.destroy(), null);
|
|
3701
3718
|
}
|
|
3702
3719
|
});
|
|
3703
|
-
async function
|
|
3720
|
+
async function ii(e, t) {
|
|
3704
3721
|
return Z.status = "connecting", D().info(`[yoyoclaw-conn] creating new channel for device: ${e.deviceId}`), Q && await Q.handleEvent({
|
|
3705
3722
|
type: G.CONNECTION_STATUS_CHANGED,
|
|
3706
3723
|
timestamp: Date.now(),
|
|
@@ -3709,7 +3726,7 @@ async function $r(e, t) {
|
|
|
3709
3726
|
previousStatus: Z.status
|
|
3710
3727
|
}
|
|
3711
3728
|
}), new Promise((n, r) => {
|
|
3712
|
-
Z.channel = new
|
|
3729
|
+
Z.channel = new ni({
|
|
3713
3730
|
deviceInfo: e,
|
|
3714
3731
|
userInfo: t,
|
|
3715
3732
|
onOpen: () => {
|
|
@@ -3734,17 +3751,17 @@ async function $r(e, t) {
|
|
|
3734
3751
|
},
|
|
3735
3752
|
onDeviceNotRegistered: async () => {
|
|
3736
3753
|
D().info("[yoyoclaw-conn] device not registered, handling...");
|
|
3737
|
-
let t = await
|
|
3754
|
+
let t = await dn();
|
|
3738
3755
|
if (!t?.token) {
|
|
3739
3756
|
D().info("[yoyoclaw-conn] no token available, treating as logout"), $();
|
|
3740
3757
|
return;
|
|
3741
3758
|
}
|
|
3742
3759
|
try {
|
|
3743
|
-
D().info("[yoyoclaw-conn] attempting to register device"), await
|
|
3760
|
+
D().info("[yoyoclaw-conn] attempting to register device"), await Bt(e, t), D().info("[yoyoclaw-conn] device registered successfully, reconnecting..."), $(), await ii(e, t);
|
|
3744
3761
|
} catch (e) {
|
|
3745
3762
|
D().error(`[yoyoclaw-conn] device registration failed: ${String(e)}`), D().info("[yoyoclaw-conn] clearing token and destroying channel");
|
|
3746
3763
|
try {
|
|
3747
|
-
await
|
|
3764
|
+
await fn();
|
|
3748
3765
|
} catch (e) {
|
|
3749
3766
|
D().error(`[yoyoclaw-conn] failed to clear token: ${String(e)}`);
|
|
3750
3767
|
}
|
|
@@ -3754,7 +3771,7 @@ async function $r(e, t) {
|
|
|
3754
3771
|
onUnauthorized: async () => {
|
|
3755
3772
|
D().warn("[yoyoclaw-conn] connection unauthorized (401), clearing token and destroying channel");
|
|
3756
3773
|
try {
|
|
3757
|
-
await
|
|
3774
|
+
await fn();
|
|
3758
3775
|
} catch (e) {
|
|
3759
3776
|
D().error(`[yoyoclaw-conn] failed to clear token: ${String(e)}`);
|
|
3760
3777
|
}
|
|
@@ -3784,14 +3801,14 @@ function $() {
|
|
|
3784
3801
|
}
|
|
3785
3802
|
//#endregion
|
|
3786
3803
|
//#region index.ts
|
|
3787
|
-
var
|
|
3804
|
+
var ai = {
|
|
3788
3805
|
id: "yoyo",
|
|
3789
3806
|
name: "YOYOClaw",
|
|
3790
3807
|
description: "OpenClaw Honor Yoyo connection plugin",
|
|
3791
|
-
configSchema:
|
|
3808
|
+
configSchema: kn,
|
|
3792
3809
|
register(e) {
|
|
3793
|
-
pe(e.runtime), Se(e.logger), e.registerService(
|
|
3810
|
+
pe(e.runtime), Se(e.logger), e.registerService(ri(e)), e.on("before_prompt_build", async () => ({ prependSystemContext: En })), Tn(e);
|
|
3794
3811
|
}
|
|
3795
3812
|
};
|
|
3796
3813
|
//#endregion
|
|
3797
|
-
export {
|
|
3814
|
+
export { ai as default };
|