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