@honor-claw/yoyo 1.3.0-beta.1 → 1.3.0-beta.2
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 +816 -825
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,52 +1,43 @@
|
|
|
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.2".includes("beta") || "1.3.0-beta.2".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
|
-
let e =
|
|
40
|
+
let e = M();
|
|
50
41
|
return {
|
|
51
42
|
env: e.getEnvInfo().env,
|
|
52
43
|
grayTag: e.getGrayTag()
|
|
@@ -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: Ce(n.auth.profiles, t)
|
|
125
|
+
}, Ee(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 = A(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 A(e, t);
|
|
164
155
|
if (typeof e == "object" && e) {
|
|
165
156
|
let n = { ...e };
|
|
166
|
-
return n.primary &&=
|
|
157
|
+
return n.primary &&= A(n.primary, t), n.fallbacks && Array.isArray(n.fallbacks) && (n.fallbacks = n.fallbacks.map((e) => A(e, t))), n;
|
|
167
158
|
}
|
|
168
159
|
return e;
|
|
169
160
|
}
|
|
170
|
-
function
|
|
161
|
+
function A(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 Ce(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,74 +174,74 @@ function Oe(e, t) {
|
|
|
183
174
|
}
|
|
184
175
|
return n;
|
|
185
176
|
}
|
|
186
|
-
function
|
|
177
|
+
function we() {
|
|
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 Te(t) {
|
|
181
|
+
let n = [], i = we(), 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 Ee(t, n) {
|
|
194
|
+
let r = Te(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
|
|
232
|
+
var j = "yoyo", De = { watch: !0 }, Oe = 250, ke = /* @__PURE__ */ "alarm.create,alarm.delete,alarm.disable,alarm.enable,alarm.query,alarm.update,app.close,app.open,call.phone,call.search,capture-screenshot,contact.search,file-upload,hotspot,local-search,message.search,message.send,mobile-data,no-disturb,quiet-mode,ringing-mode,schedule.create,schedule.delete,schedule.search,schedule.update,screen-record,vibration-mode,volume.operate,wlan,bluetooth,location-service,nfc,usb-shared-network,eyecomfort,status-bar-show,brightness,autoscreen-onnotice,dark-mode,device-operation,camera,app.uninstall,audio-record,battery,gui.create,gui.pause,gui.terminate,mcp.tool.call".split(","), Ae = class {
|
|
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() {
|
|
@@ -276,7 +267,7 @@ var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create
|
|
|
276
267
|
}
|
|
277
268
|
getUserConfig() {
|
|
278
269
|
try {
|
|
279
|
-
return this.loadConfig().plugins?.entries?.[
|
|
270
|
+
return this.loadConfig().plugins?.entries?.[j]?.config?.user;
|
|
280
271
|
} catch (e) {
|
|
281
272
|
console.error(`[claw-configs] Failed to read user config: ${e}`);
|
|
282
273
|
return;
|
|
@@ -284,14 +275,14 @@ var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create
|
|
|
284
275
|
}
|
|
285
276
|
getEnvInfo() {
|
|
286
277
|
try {
|
|
287
|
-
let e = this.loadConfig().plugins?.entries?.[
|
|
278
|
+
let e = this.loadConfig().plugins?.entries?.[j]?.config, t = e?.envInfo;
|
|
288
279
|
if (t?.env) return t;
|
|
289
280
|
let n = e?.env;
|
|
290
281
|
if (n) return {
|
|
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"
|
|
@@ -308,7 +299,7 @@ var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create
|
|
|
308
299
|
}
|
|
309
300
|
getGrayTag() {
|
|
310
301
|
try {
|
|
311
|
-
return this.loadConfig().plugins?.entries?.[
|
|
302
|
+
return this.loadConfig().plugins?.entries?.[j]?.config?.gray;
|
|
312
303
|
} catch (e) {
|
|
313
304
|
console.error(`[claw-configs] Failed to read gray tag config: ${e}`);
|
|
314
305
|
return;
|
|
@@ -316,7 +307,7 @@ var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create
|
|
|
316
307
|
}
|
|
317
308
|
getDeviceConfig() {
|
|
318
309
|
try {
|
|
319
|
-
return this.loadConfig().plugins?.entries?.[
|
|
310
|
+
return this.loadConfig().plugins?.entries?.[j]?.config?.device;
|
|
320
311
|
} catch (e) {
|
|
321
312
|
console.error(`[claw-configs] Failed to read device config: ${e}`);
|
|
322
313
|
return;
|
|
@@ -324,17 +315,17 @@ var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create
|
|
|
324
315
|
}
|
|
325
316
|
async updateDeviceConfig(e) {
|
|
326
317
|
try {
|
|
327
|
-
let t = this.loadConfig(), n = t.plugins?.entries?.[
|
|
318
|
+
let t = this.loadConfig(), n = t.plugins?.entries?.[j]?.config?.device || {}, r = {
|
|
328
319
|
...t,
|
|
329
320
|
plugins: {
|
|
330
321
|
...t.plugins,
|
|
331
322
|
entries: {
|
|
332
323
|
...t.plugins?.entries,
|
|
333
|
-
[
|
|
334
|
-
...t.plugins?.entries?.[
|
|
324
|
+
[j]: {
|
|
325
|
+
...t.plugins?.entries?.[j],
|
|
335
326
|
enabled: !0,
|
|
336
327
|
config: {
|
|
337
|
-
...t.plugins?.entries?.[
|
|
328
|
+
...t.plugins?.entries?.[j]?.config,
|
|
338
329
|
device: {
|
|
339
330
|
...n,
|
|
340
331
|
...e
|
|
@@ -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) {
|
|
@@ -357,11 +348,11 @@ var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create
|
|
|
357
348
|
...t.plugins,
|
|
358
349
|
entries: {
|
|
359
350
|
...t.plugins?.entries,
|
|
360
|
-
[
|
|
361
|
-
...t.plugins?.entries?.[
|
|
351
|
+
[j]: {
|
|
352
|
+
...t.plugins?.entries?.[j],
|
|
362
353
|
enabled: !0,
|
|
363
354
|
config: {
|
|
364
|
-
...t.plugins?.entries?.[
|
|
355
|
+
...t.plugins?.entries?.[j]?.config,
|
|
365
356
|
envInfo: {
|
|
366
357
|
env: e,
|
|
367
358
|
source: "manual"
|
|
@@ -374,12 +365,12 @@ 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() {
|
|
381
372
|
try {
|
|
382
|
-
let e = this.loadConfig(), t = e.plugins?.entries?.[
|
|
373
|
+
let e = this.loadConfig(), t = e.plugins?.entries?.[j]?.config?.envInfo;
|
|
383
374
|
if (!t?.env) return;
|
|
384
375
|
let n = {
|
|
385
376
|
...e,
|
|
@@ -387,11 +378,11 @@ var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create
|
|
|
387
378
|
...e.plugins,
|
|
388
379
|
entries: {
|
|
389
380
|
...e.plugins?.entries,
|
|
390
|
-
[
|
|
391
|
-
...e.plugins?.entries?.[
|
|
381
|
+
[j]: {
|
|
382
|
+
...e.plugins?.entries?.[j],
|
|
392
383
|
enabled: !0,
|
|
393
384
|
config: {
|
|
394
|
-
...e.plugins?.entries?.[
|
|
385
|
+
...e.plugins?.entries?.[j]?.config,
|
|
395
386
|
envInfo: {
|
|
396
387
|
env: t.env,
|
|
397
388
|
source: "env"
|
|
@@ -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) {
|
|
@@ -414,11 +405,11 @@ var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create
|
|
|
414
405
|
...t.plugins,
|
|
415
406
|
entries: {
|
|
416
407
|
...t.plugins?.entries,
|
|
417
|
-
[
|
|
418
|
-
...t.plugins?.entries?.[
|
|
408
|
+
[j]: {
|
|
409
|
+
...t.plugins?.entries?.[j],
|
|
419
410
|
enabled: !0,
|
|
420
411
|
config: {
|
|
421
|
-
...t.plugins?.entries?.[
|
|
412
|
+
...t.plugins?.entries?.[j]?.config,
|
|
422
413
|
...e && { gray: e }
|
|
423
414
|
}
|
|
424
415
|
}
|
|
@@ -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) {
|
|
@@ -438,11 +429,11 @@ var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create
|
|
|
438
429
|
...t.plugins,
|
|
439
430
|
entries: {
|
|
440
431
|
...t.plugins?.entries,
|
|
441
|
-
[
|
|
442
|
-
...t.plugins?.entries?.[
|
|
432
|
+
[j]: {
|
|
433
|
+
...t.plugins?.entries?.[j],
|
|
443
434
|
enabled: !0,
|
|
444
435
|
config: {
|
|
445
|
-
...t.plugins?.entries?.[
|
|
436
|
+
...t.plugins?.entries?.[j]?.config,
|
|
446
437
|
user: e
|
|
447
438
|
}
|
|
448
439
|
}
|
|
@@ -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() {
|
|
@@ -462,10 +453,10 @@ var A = "yoyo", Me = { watch: !0 }, Ne = 250, Pe = /* @__PURE__ */ "alarm.create
|
|
|
462
453
|
...e.plugins,
|
|
463
454
|
entries: {
|
|
464
455
|
...e.plugins?.entries,
|
|
465
|
-
[
|
|
466
|
-
...e.plugins?.entries?.[
|
|
456
|
+
[j]: {
|
|
457
|
+
...e.plugins?.entries?.[j],
|
|
467
458
|
config: {
|
|
468
|
-
...e.plugins?.entries?.[
|
|
459
|
+
...e.plugins?.entries?.[j]?.config,
|
|
469
460
|
user: void 0
|
|
470
461
|
}
|
|
471
462
|
}
|
|
@@ -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, ...ke])), o = t.skills || {}, s = o.load || {}, c = s.watch === De.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
|
+
...De,
|
|
476
|
+
watchDebounceMs: s.watchDebounceMs ?? Oe
|
|
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,26 +509,26 @@ 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
|
-
},
|
|
527
|
-
function
|
|
528
|
-
return
|
|
517
|
+
}, je = null;
|
|
518
|
+
function M() {
|
|
519
|
+
return je ||= new Ae(), je;
|
|
529
520
|
}
|
|
530
521
|
//#endregion
|
|
531
522
|
//#region src/commands/env/impl.ts
|
|
532
|
-
var
|
|
523
|
+
var Me = {
|
|
533
524
|
env: "environment variable",
|
|
534
525
|
manual: "manual config"
|
|
535
526
|
};
|
|
536
|
-
function
|
|
527
|
+
function Ne(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
|
-
let e =
|
|
531
|
+
let e = M();
|
|
541
532
|
if (r && (await e.resetEnv(), i.info("✅ Environment source reset to environment variable")), t) {
|
|
542
533
|
if (t !== "test" && t !== "dev" && t !== "production") {
|
|
543
534
|
i.error("❌ Invalid environment. Use 'test' or 'production'.");
|
|
@@ -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: ${Me[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
|
|
561
|
-
function
|
|
562
|
-
return
|
|
551
|
+
var Pe = a("0123456789abcdefghijklmnopqrstuvwxyz", 32);
|
|
552
|
+
function N(e) {
|
|
553
|
+
return Pe(e);
|
|
563
554
|
}
|
|
564
555
|
//#endregion
|
|
565
556
|
//#region src/apis/helpers.ts
|
|
566
|
-
function
|
|
557
|
+
function Fe(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 Ie() {
|
|
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 Le(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 Re(e, t) {
|
|
601
592
|
return !t && !!e;
|
|
602
593
|
}
|
|
603
|
-
function
|
|
604
|
-
let n =
|
|
594
|
+
function ze(e, t) {
|
|
595
|
+
let n = Le(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 Be = 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
|
+
}, Ve = 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 = Le(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 = Re(Le(), 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 Be(r.statusCode, u, `HTTP request failed with status ${r.statusCode}`);
|
|
663
654
|
} catch (e) {
|
|
664
|
-
throw e instanceof
|
|
655
|
+
throw e instanceof Be ? e : D(e, "HTTP request failed");
|
|
665
656
|
}
|
|
666
657
|
}
|
|
667
658
|
async get(e, t) {
|
|
@@ -699,14 +690,14 @@ var Ge = class extends Error {
|
|
|
699
690
|
method: "PATCH"
|
|
700
691
|
});
|
|
701
692
|
}
|
|
702
|
-
},
|
|
693
|
+
}, He = class {
|
|
703
694
|
httpClient;
|
|
704
695
|
constructor(e, t) {
|
|
705
|
-
this.httpClient = new
|
|
696
|
+
this.httpClient = new Ve(e, t);
|
|
706
697
|
}
|
|
707
698
|
async registerDevice(e, t, n) {
|
|
708
699
|
let r = {
|
|
709
|
-
"x-trace-id":
|
|
700
|
+
"x-trace-id": N(),
|
|
710
701
|
"x-jwt-token": t.token,
|
|
711
702
|
"x-device-id": e.deviceId
|
|
712
703
|
}, i = {
|
|
@@ -726,7 +717,7 @@ var Ge = class extends Error {
|
|
|
726
717
|
}
|
|
727
718
|
async logoutDevice(e, t) {
|
|
728
719
|
let n = {
|
|
729
|
-
"x-trace-id":
|
|
720
|
+
"x-trace-id": N(),
|
|
730
721
|
"x-jwt-token": t.token,
|
|
731
722
|
"x-device-id": e.deviceId
|
|
732
723
|
}, r = {
|
|
@@ -743,7 +734,7 @@ var Ge = class extends Error {
|
|
|
743
734
|
});
|
|
744
735
|
}
|
|
745
736
|
async exchangeToken(e, t) {
|
|
746
|
-
let n =
|
|
737
|
+
let n = N(), r = {
|
|
747
738
|
"Content-Type": "application/json",
|
|
748
739
|
"x-device-id": e.deviceId,
|
|
749
740
|
"x-trace-id": n
|
|
@@ -758,32 +749,32 @@ var Ge = class extends Error {
|
|
|
758
749
|
headers: r,
|
|
759
750
|
timeout: 15e3
|
|
760
751
|
});
|
|
761
|
-
if (
|
|
752
|
+
if (Fe(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
|
-
function
|
|
766
|
-
let e =
|
|
767
|
-
return new
|
|
756
|
+
function P() {
|
|
757
|
+
let e = Ie();
|
|
758
|
+
return new He(`https://${e.clawCloud}/aicloud/yoyo-claw-service`, e.grayTag ? { defaultHeaders: { "x-gray": e.grayTag } } : void 0);
|
|
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" };
|
|
772
|
-
function
|
|
762
|
+
var Ue = "data:image/png;base64,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", We = "<svg aria-hidden=\"true\" viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"32\" cy=\"32\" r=\"30\" fill=\"currentColor\" opacity=\"0.12\"/><circle cx=\"32\" cy=\"32\" r=\"21\" fill=\"currentColor\"/><path d=\"M22.5 32.5L29 39L42.5 25.5\" stroke=\"white\" stroke-width=\"4.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>", Ge = "<svg aria-hidden=\"true\" viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"32\" cy=\"32\" r=\"30\" fill=\"currentColor\" opacity=\"0.12\"/><circle cx=\"32\" cy=\"32\" r=\"21\" fill=\"currentColor\"/><path d=\"M24.5 24.5L39.5 39.5M39.5 24.5L24.5 39.5\" stroke=\"white\" stroke-width=\"4.5\" stroke-linecap=\"round\"/></svg>", Ke = { favicon: "/favicon.png" };
|
|
763
|
+
function F(e) {
|
|
773
764
|
return e.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll("\"", """).replaceAll("'", "'");
|
|
774
765
|
}
|
|
775
|
-
function
|
|
776
|
-
return !e || e.length === 0 ? "" : `<div class="details">${e.map((e) => `<div class="detail-item"><span class="detail-key">${
|
|
766
|
+
function qe(e) {
|
|
767
|
+
return !e || e.length === 0 ? "" : `<div class="details">${e.map((e) => `<div class="detail-item"><span class="detail-key">${F(e.key)}</span><span class="detail-value">${F(e.value)}</span></div>`).join("")}</div>`;
|
|
777
768
|
}
|
|
778
|
-
function
|
|
779
|
-
let t = e.statusClass === "success" ?
|
|
769
|
+
function I(e) {
|
|
770
|
+
let t = e.statusClass === "success" ? We : Ge;
|
|
780
771
|
return `<!doctype html>
|
|
781
772
|
<html lang="zh-CN">
|
|
782
773
|
<head>
|
|
783
774
|
<meta charset="UTF-8" />
|
|
784
775
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
785
776
|
<link rel="icon" type="image/png" href="data:image/png;base64,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" />
|
|
786
|
-
<title>${
|
|
777
|
+
<title>${F(e.pageTitle)}</title>
|
|
787
778
|
<style>
|
|
788
779
|
:root {
|
|
789
780
|
color-scheme: light;
|
|
@@ -967,10 +958,10 @@ function F(e) {
|
|
|
967
958
|
<span>YOYOClaw</span>
|
|
968
959
|
</div>
|
|
969
960
|
<div class="icon-wrap ${e.statusClass}">${t}</div>
|
|
970
|
-
<h1>${
|
|
971
|
-
${
|
|
961
|
+
<h1>${F(e.title)}</h1>
|
|
962
|
+
${qe(e.details)}
|
|
972
963
|
<div class="footer">
|
|
973
|
-
<p class="hint">${
|
|
964
|
+
<p class="hint">${F(e.hintText)}</p>
|
|
974
965
|
<p class="caption">浏览器不会自动关闭当前页面,保留或稍后关闭都不影响登录结果。</p>
|
|
975
966
|
</div>
|
|
976
967
|
</main>
|
|
@@ -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 Je = { "favicon.png": Ue };
|
|
974
|
+
function Ye(e, t) {
|
|
975
|
+
let n = Je[t];
|
|
985
976
|
if (!n) {
|
|
986
977
|
e.writeHead(404), e.end();
|
|
987
978
|
return;
|
|
@@ -992,21 +983,21 @@ function et(e, t) {
|
|
|
992
983
|
"Cache-Control": "public, max-age=3600"
|
|
993
984
|
}), e.end(i);
|
|
994
985
|
}
|
|
995
|
-
function
|
|
986
|
+
function Xe(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
|
-
t.writeHead(405, { "Content-Type": "text/html; charset=utf-8" }), t.end(
|
|
1000
|
+
t.writeHead(405, { "Content-Type": "text/html; charset=utf-8" }), t.end(I({
|
|
1010
1001
|
pageTitle: "请求方式不支持",
|
|
1011
1002
|
statusClass: "error",
|
|
1012
1003
|
title: "不支持的请求方式",
|
|
@@ -1014,17 +1005,17 @@ 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 === Ke.favicon) {
|
|
1009
|
+
Ye(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") || "";
|
|
1022
|
-
i && !l ? (l = !0, t.writeHead(200, { "Content-Type": "text/html; charset=utf-8" }), t.end(
|
|
1013
|
+
i && !l ? (l = !0, t.writeHead(200, { "Content-Type": "text/html; charset=utf-8" }), t.end(I({
|
|
1023
1014
|
pageTitle: "授权成功",
|
|
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(I({
|
|
1028
1019
|
pageTitle: "授权失败",
|
|
1029
1020
|
statusClass: "error",
|
|
1030
1021
|
title: "未能完成授权",
|
|
@@ -1037,45 +1028,45 @@ function tt(e) {
|
|
|
1037
1028
|
value: s
|
|
1038
1029
|
}] : []]
|
|
1039
1030
|
})), setTimeout(() => {
|
|
1040
|
-
|
|
1041
|
-
}, 120)) : l ? (t.writeHead(200, { "Content-Type": "text/html; charset=utf-8" }), t.end(
|
|
1031
|
+
m(/* @__PURE__ */ Error(s ? `authorization failed: ${o} (${s})` : `authorization failed: ${o}`));
|
|
1032
|
+
}, 120)) : l ? (t.writeHead(200, { "Content-Type": "text/html; charset=utf-8" }), t.end(I({
|
|
1042
1033
|
pageTitle: "登录已完成",
|
|
1043
1034
|
statusClass: "success",
|
|
1044
1035
|
title: "授权已经处理完成",
|
|
1045
1036
|
hintText: "请返回 OpenClaw,登录流程会继续完成。"
|
|
1046
|
-
}))) : (t.writeHead(400, { "Content-Type": "text/html; charset=utf-8" }), t.end(
|
|
1037
|
+
}))) : (t.writeHead(400, { "Content-Type": "text/html; charset=utf-8" }), t.end(I({
|
|
1047
1038
|
pageTitle: "授权失败",
|
|
1048
1039
|
statusClass: "error",
|
|
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
|
-
console.error("authorize callback error:", e), t.writeHead(500, { "Content-Type": "text/html; charset=utf-8" }), t.end(
|
|
1046
|
+
console.error("authorize callback error:", e), t.writeHead(500, { "Content-Type": "text/html; charset=utf-8" }), t.end(I({
|
|
1056
1047
|
pageTitle: "服务异常",
|
|
1057
1048
|
statusClass: "error",
|
|
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 Ze = {
|
|
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
|
+
}, Qe = {
|
|
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 $e(e) {
|
|
1096
1087
|
return {
|
|
1097
|
-
...
|
|
1088
|
+
...ue()?.env === "production" ? Qe : Ze,
|
|
1098
1089
|
...e
|
|
1099
1090
|
};
|
|
1100
1091
|
}
|
|
1101
1092
|
//#endregion
|
|
1102
1093
|
//#region src/honor-auth/honor-auth-client.ts
|
|
1103
|
-
var
|
|
1094
|
+
var et = 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,105 +1135,105 @@ var at = class {
|
|
|
1144
1135
|
return { ...this.config };
|
|
1145
1136
|
}
|
|
1146
1137
|
};
|
|
1147
|
-
function
|
|
1148
|
-
return new
|
|
1138
|
+
function tt(e) {
|
|
1139
|
+
return new et(e);
|
|
1149
1140
|
}
|
|
1150
1141
|
//#endregion
|
|
1151
1142
|
//#region src/utils/fs-safe.ts
|
|
1152
|
-
var
|
|
1143
|
+
var L = class extends Error {
|
|
1153
1144
|
code;
|
|
1154
1145
|
constructor(e, t, n) {
|
|
1155
1146
|
super(t, n), this.code = e, this.name = "SafeFsError";
|
|
1156
1147
|
}
|
|
1157
|
-
},
|
|
1148
|
+
}, nt = new Set(["ENOENT", "ENOTDIR"]), rt = new Set([
|
|
1158
1149
|
"ELOOP",
|
|
1159
1150
|
"EINVAL",
|
|
1160
1151
|
"ENOTSUP"
|
|
1161
1152
|
]);
|
|
1162
|
-
function
|
|
1153
|
+
function it(e) {
|
|
1163
1154
|
return !!(e && typeof e == "object" && "code" in e);
|
|
1164
1155
|
}
|
|
1165
|
-
function
|
|
1166
|
-
return
|
|
1156
|
+
function R(e) {
|
|
1157
|
+
return it(e) && typeof e.code == "string" && nt.has(e.code);
|
|
1167
1158
|
}
|
|
1168
|
-
function
|
|
1169
|
-
return
|
|
1159
|
+
function at(e) {
|
|
1160
|
+
return it(e) && typeof e.code == "string" && rt.has(e.code);
|
|
1170
1161
|
}
|
|
1171
|
-
function
|
|
1172
|
-
let t =
|
|
1162
|
+
function ot(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
|
-
function
|
|
1176
|
-
let n =
|
|
1166
|
+
function z(e, t) {
|
|
1167
|
+
let n = r.resolve(e), i = r.resolve(t);
|
|
1177
1168
|
if (process.platform === "win32") {
|
|
1178
|
-
let e =
|
|
1179
|
-
return
|
|
1169
|
+
let e = ot(n), t = ot(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 st(e) {
|
|
1185
1176
|
return e === 0 || e === 0n;
|
|
1186
1177
|
}
|
|
1187
|
-
function
|
|
1188
|
-
return e.ino === t.ino ? e.dev === t.dev ? !0 : n === "win32" && (
|
|
1178
|
+
function ct(e, t, n = process.platform) {
|
|
1179
|
+
return e.ino === t.ino ? e.dev === t.dev ? !0 : n === "win32" && (st(e.dev) || st(t.dev)) : !1;
|
|
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
|
-
throw
|
|
1192
|
+
throw R(e) ? new L("not-found", "root dir not found") : e;
|
|
1202
1193
|
}
|
|
1203
|
-
let n =
|
|
1204
|
-
if (!
|
|
1194
|
+
let n = pt(t), i = mt(e.relativePath), a = r.resolve(n, i);
|
|
1195
|
+
if (!z(n, a)) throw new L("outside-root", "file is outside workspace root");
|
|
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
|
-
if ((await v.lstat(e)).isDirectory()) throw new
|
|
1204
|
+
if ((await v.lstat(e)).isDirectory()) throw new L("not-file", "not a file");
|
|
1214
1205
|
} catch (e) {
|
|
1215
|
-
if (e instanceof
|
|
1206
|
+
if (e instanceof L) throw e;
|
|
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
|
|
1212
|
+
throw R(e) ? new L("not-found", "file not found") : at(e) ? new L("symlink", "symlink open blocked", { cause: e }) : it(e) && e.code === "EISDIR" ? new L("not-file", "not a file") : e;
|
|
1222
1213
|
}
|
|
1223
1214
|
try {
|
|
1224
1215
|
let [r, i] = await Promise.all([n.stat(), v.lstat(e)]);
|
|
1225
|
-
if (i.isSymbolicLink()) throw new
|
|
1226
|
-
if (!r.isFile()) throw new
|
|
1227
|
-
if (t?.rejectHardlinks && r.nlink > 1) throw new
|
|
1228
|
-
if (process.platform !== "win32" && !
|
|
1216
|
+
if (i.isSymbolicLink()) throw new L("symlink", "symlink not allowed");
|
|
1217
|
+
if (!r.isFile()) throw new L("not-file", "not a file");
|
|
1218
|
+
if (t?.rejectHardlinks && r.nlink > 1) throw new L("invalid-path", "hardlinked path not allowed");
|
|
1219
|
+
if (process.platform !== "win32" && !ct(r, i)) throw new L("path-mismatch", "path changed during read");
|
|
1229
1220
|
let a = await v.realpath(e), o = await v.stat(a);
|
|
1230
|
-
if (t?.rejectHardlinks && o.nlink > 1) throw new
|
|
1231
|
-
if (process.platform !== "win32" && !
|
|
1221
|
+
if (t?.rejectHardlinks && o.nlink > 1) throw new L("invalid-path", "hardlinked path not allowed");
|
|
1222
|
+
if (process.platform !== "win32" && !ct(r, o)) throw new L("path-mismatch", "path mismatch");
|
|
1232
1223
|
return {
|
|
1233
1224
|
handle: n,
|
|
1234
1225
|
realPath: a,
|
|
1235
1226
|
stat: r
|
|
1236
1227
|
};
|
|
1237
1228
|
} catch (e) {
|
|
1238
|
-
throw await n.close().catch(() => {}), e instanceof
|
|
1229
|
+
throw await n.close().catch(() => {}), e instanceof L ? e : R(e) ? new L("not-found", "file not found") : e;
|
|
1239
1230
|
}
|
|
1240
1231
|
}
|
|
1241
|
-
async function
|
|
1242
|
-
let { rootWithSep: t, resolved: n } = await
|
|
1243
|
-
if (!
|
|
1232
|
+
async function _t(e) {
|
|
1233
|
+
let { rootWithSep: t, resolved: n } = await ht(e), r = await gt(n);
|
|
1234
|
+
if (!z(t, r.realPath)) throw await r.handle.close().catch(() => {}), new L("outside-root", "file is outside workspace root");
|
|
1244
1235
|
try {
|
|
1245
|
-
if (e.maxBytes !== void 0 && r.stat.size > e.maxBytes) throw new
|
|
1236
|
+
if (e.maxBytes !== void 0 && r.stat.size > e.maxBytes) throw new L("too-large", `file exceeds limit of ${e.maxBytes} bytes (got ${r.stat.size})`);
|
|
1246
1237
|
return {
|
|
1247
1238
|
buffer: await r.handle.readFile(),
|
|
1248
1239
|
realPath: r.realPath,
|
|
@@ -1252,73 +1243,73 @@ 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
|
-
if (process.platform !== "win32" && !
|
|
1271
|
-
if (!
|
|
1261
|
+
if (process.platform !== "win32" && !ct(n.stat, e.expectedStat)) throw new L("path-mismatch", "path changed during write");
|
|
1262
|
+
if (!z(t, n.realPath)) throw new L("outside-root", "file is outside workspace root");
|
|
1272
1263
|
} finally {
|
|
1273
1264
|
await n.handle.close().catch(() => {});
|
|
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
|
-
if (!
|
|
1283
|
-
|
|
1273
|
+
if (!z(t, e)) throw new L("outside-root", "file is outside workspace root");
|
|
1274
|
+
i = e, a = !0;
|
|
1284
1275
|
} catch (e) {
|
|
1285
|
-
if (e instanceof
|
|
1276
|
+
if (e instanceof L || !R(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 L("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
|
|
1301
|
+
throw R(e) ? new L("not-found", "file not found") : at(e) ? new L("symlink", "symlink open blocked", { cause: e }) : e;
|
|
1311
1302
|
}
|
|
1312
1303
|
try {
|
|
1313
1304
|
let n = await t.stat();
|
|
1314
|
-
if (!n.isFile()) throw new
|
|
1305
|
+
if (!n.isFile()) throw new L("not-file", "path is not a regular file");
|
|
1315
1306
|
let r = await v.lstat(e.ioPath);
|
|
1316
|
-
if (r.isSymbolicLink()) throw new
|
|
1317
|
-
if (!
|
|
1307
|
+
if (r.isSymbolicLink()) throw new L("symlink", "path is a symlink");
|
|
1308
|
+
if (!ct(n, r)) throw new L("path-mismatch", "path changed during write");
|
|
1318
1309
|
let i = await v.realpath(e.ioPath);
|
|
1319
|
-
if (!
|
|
1310
|
+
if (!z(e.rootWithSep, i)) throw new L("outside-root", "file is outside workspace root");
|
|
1320
1311
|
let a = typeof e.data == "string" ? Buffer.byteLength(e.data, e.encoding ?? "utf8") : e.data.length;
|
|
1321
|
-
if (e.maxBytes !== void 0 && n.size + a > e.maxBytes) throw new
|
|
1312
|
+
if (e.maxBytes !== void 0 && n.size + a > e.maxBytes) throw new L("too-large", `file would exceed limit of ${e.maxBytes} bytes`);
|
|
1322
1313
|
return typeof e.data == "string" ? await t.writeFile(e.data, e.encoding ?? "utf8") : await t.writeFile(e.data), {
|
|
1323
1314
|
realPath: i,
|
|
1324
1315
|
bytesWritten: a,
|
|
@@ -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,13 +1331,13 @@ 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
|
|
1347
1338
|
});
|
|
1348
1339
|
} catch (e) {
|
|
1349
|
-
throw e instanceof
|
|
1340
|
+
throw e instanceof L ? e : new L("write-failed", "atomic write verification failed", { cause: e });
|
|
1350
1341
|
}
|
|
1351
1342
|
return {
|
|
1352
1343
|
realPath: n,
|
|
@@ -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,76 +1385,76 @@ 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
1421
|
return e.legacyDeviceId && (r.legacyDeviceId = e.legacyDeviceId), e.deviceId && (r.deviceId = e.deviceId, r.publicKeyPem = e.publicKeyPem, r.privateKeyPem = e.privateKeyPem, r.createdAtMs = e.createdAtMs), e.version && (r.version = e.version), await B({
|
|
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
1433
|
//#region src/modules/device/registry.ts
|
|
1443
|
-
async function
|
|
1434
|
+
async function It(e, t) {
|
|
1444
1435
|
if (!e || !t) throw Error("设备信息或用户信息缺失");
|
|
1445
|
-
let n =
|
|
1446
|
-
if (!
|
|
1436
|
+
let n = M().getGatewayAuthConfig(), r = await P().registerDevice(e, t, n);
|
|
1437
|
+
if (!Fe(r)) throw Error(`注册失败:${r.data?.cnMessage}`);
|
|
1447
1438
|
}
|
|
1448
1439
|
//#endregion
|
|
1449
1440
|
//#region src/modules/device/identity.ts
|
|
1450
1441
|
var H = Buffer.from("302a300506032b6570032100", "hex");
|
|
1451
|
-
function
|
|
1442
|
+
function Lt(e) {
|
|
1452
1443
|
return e.toString("base64").replaceAll("+", "-").replaceAll("/", "_").replace(/=+$/g, "");
|
|
1453
1444
|
}
|
|
1454
|
-
function
|
|
1455
|
-
let t =
|
|
1445
|
+
function Rt(e) {
|
|
1446
|
+
let t = h.createPublicKey(e).export({
|
|
1456
1447
|
type: "spki",
|
|
1457
1448
|
format: "der"
|
|
1458
1449
|
});
|
|
1459
1450
|
return t.length === H.length + 32 && t.subarray(0, H.length).equals(H) ? t.subarray(H.length) : t;
|
|
1460
1451
|
}
|
|
1461
|
-
function
|
|
1462
|
-
let t =
|
|
1463
|
-
return
|
|
1452
|
+
function zt(e) {
|
|
1453
|
+
let t = Rt(e);
|
|
1454
|
+
return h.createHash("sha256").update(t).digest("hex");
|
|
1464
1455
|
}
|
|
1465
|
-
async function
|
|
1466
|
-
let { publicKey: e, privateKey: t } =
|
|
1456
|
+
async function Bt() {
|
|
1457
|
+
let { publicKey: e, privateKey: t } = h.generateKeyPairSync("ed25519"), n = e.export({
|
|
1467
1458
|
type: "spki",
|
|
1468
1459
|
format: "pem"
|
|
1469
1460
|
}).toString(), r = t.export({
|
|
@@ -1471,17 +1462,17 @@ async function Wt() {
|
|
|
1471
1462
|
format: "pem"
|
|
1472
1463
|
}).toString();
|
|
1473
1464
|
return {
|
|
1474
|
-
deviceId:
|
|
1465
|
+
deviceId: zt(n),
|
|
1475
1466
|
publicKeyPem: n,
|
|
1476
1467
|
privateKeyPem: r,
|
|
1477
1468
|
createdAtMs: Date.now()
|
|
1478
1469
|
};
|
|
1479
1470
|
}
|
|
1480
|
-
async function
|
|
1481
|
-
let e = await
|
|
1471
|
+
async function Vt() {
|
|
1472
|
+
let e = await Nt();
|
|
1482
1473
|
if (e && e.deviceId && e.publicKeyPem && e.privateKeyPem && e.createdAtMs) {
|
|
1483
|
-
let t = e.deviceId, n =
|
|
1484
|
-
return n && n !== e.deviceId && (await
|
|
1474
|
+
let t = e.deviceId, n = zt(e.publicKeyPem);
|
|
1475
|
+
return n && n !== e.deviceId && (await Pt({
|
|
1485
1476
|
...e,
|
|
1486
1477
|
deviceId: n
|
|
1487
1478
|
}), t = n), {
|
|
@@ -1492,32 +1483,32 @@ async function Gt() {
|
|
|
1492
1483
|
createdAtMs: e.createdAtMs
|
|
1493
1484
|
};
|
|
1494
1485
|
}
|
|
1495
|
-
let t = await
|
|
1496
|
-
return await
|
|
1486
|
+
let t = await Bt();
|
|
1487
|
+
return await Pt(t), t;
|
|
1497
1488
|
}
|
|
1498
|
-
function
|
|
1499
|
-
let n =
|
|
1500
|
-
return
|
|
1489
|
+
function Ht(e, t) {
|
|
1490
|
+
let n = h.createPrivateKey(e);
|
|
1491
|
+
return Lt(h.sign(null, Buffer.from(t, "utf8"), n));
|
|
1501
1492
|
}
|
|
1502
|
-
function
|
|
1503
|
-
return
|
|
1493
|
+
function Ut(e) {
|
|
1494
|
+
return Lt(Rt(e));
|
|
1504
1495
|
}
|
|
1505
1496
|
//#endregion
|
|
1506
1497
|
//#region src/modules/device/providers/linux.ts
|
|
1507
|
-
function
|
|
1498
|
+
function Wt(e) {
|
|
1508
1499
|
try {
|
|
1509
|
-
return
|
|
1500
|
+
return b.existsSync(e) ? b.readFileSync(e, "utf-8").trim() : "";
|
|
1510
1501
|
} catch {
|
|
1511
1502
|
return "";
|
|
1512
1503
|
}
|
|
1513
1504
|
}
|
|
1514
|
-
var
|
|
1505
|
+
var Gt = class {
|
|
1515
1506
|
async ensureInitialized() {}
|
|
1516
1507
|
getLinuxDeviceModel() {
|
|
1517
|
-
return
|
|
1508
|
+
return Wt("/sys/class/dmi/id/product_name") || Wt("/sys/class/dmi/id/board_name") || `${S.cpus()[0]?.model || "Linux PC"} (${S.arch()})`;
|
|
1518
1509
|
}
|
|
1519
1510
|
getLinuxDeviceName() {
|
|
1520
|
-
return `${
|
|
1511
|
+
return `${S.hostname()} (${this.getLinuxDeviceModel()})`;
|
|
1521
1512
|
}
|
|
1522
1513
|
getDeviceName() {
|
|
1523
1514
|
return this.getLinuxDeviceName();
|
|
@@ -1531,13 +1522,13 @@ var Yt = class {
|
|
|
1531
1522
|
getDeviceType() {
|
|
1532
1523
|
return "pc";
|
|
1533
1524
|
}
|
|
1534
|
-
},
|
|
1525
|
+
}, Kt = class {
|
|
1535
1526
|
async ensureInitialized() {}
|
|
1536
1527
|
getMacOSDeviceModel() {
|
|
1537
|
-
return `${
|
|
1528
|
+
return `${S.cpus()[0]?.model || "Mac"} (${S.machine?.() || S.arch()})`;
|
|
1538
1529
|
}
|
|
1539
1530
|
getMacOSDeviceName() {
|
|
1540
|
-
return `${
|
|
1531
|
+
return `${S.hostname()} (${this.getMacOSDeviceModel()})`;
|
|
1541
1532
|
}
|
|
1542
1533
|
getDeviceName() {
|
|
1543
1534
|
return this.getMacOSDeviceName();
|
|
@@ -1551,7 +1542,7 @@ var Yt = class {
|
|
|
1551
1542
|
getDeviceType() {
|
|
1552
1543
|
return "pc";
|
|
1553
1544
|
}
|
|
1554
|
-
},
|
|
1545
|
+
}, qt = te(ee), Jt = class {
|
|
1555
1546
|
cache = {
|
|
1556
1547
|
brand: "",
|
|
1557
1548
|
model: "",
|
|
@@ -1566,7 +1557,7 @@ var Yt = class {
|
|
|
1566
1557
|
}
|
|
1567
1558
|
async execAndroidCmd(e, t = 5e3) {
|
|
1568
1559
|
try {
|
|
1569
|
-
let { stdout: n } = await
|
|
1560
|
+
let { stdout: n } = await qt("/system/bin/sh", ["-c", e], {
|
|
1570
1561
|
timeout: t,
|
|
1571
1562
|
encoding: "utf-8"
|
|
1572
1563
|
});
|
|
@@ -1588,13 +1579,13 @@ var Yt = class {
|
|
|
1588
1579
|
getAndroidDeviceModel() {
|
|
1589
1580
|
if (this.cache.model) return this.cache.model;
|
|
1590
1581
|
try {
|
|
1591
|
-
let
|
|
1592
|
-
if (
|
|
1593
|
-
let
|
|
1594
|
-
if (
|
|
1582
|
+
let e = "/system/build.prop";
|
|
1583
|
+
if (b.existsSync(e)) {
|
|
1584
|
+
let t = b.readFileSync(e, "utf8").match(/ro\.product\.model=(.*)/);
|
|
1585
|
+
if (t && t[1]) return t[1].trim();
|
|
1595
1586
|
}
|
|
1596
1587
|
} catch {}
|
|
1597
|
-
return `Android(${
|
|
1588
|
+
return `Android(${S.arch()})`;
|
|
1598
1589
|
}
|
|
1599
1590
|
getAndroidDeviceName() {
|
|
1600
1591
|
return this.getAndroidDeviceModel();
|
|
@@ -1617,7 +1608,7 @@ var Yt = class {
|
|
|
1617
1608
|
function U(e, t, n) {
|
|
1618
1609
|
return new Promise((r) => {
|
|
1619
1610
|
try {
|
|
1620
|
-
new
|
|
1611
|
+
new C({
|
|
1621
1612
|
hive: e,
|
|
1622
1613
|
key: t
|
|
1623
1614
|
}).get(n, (e, t) => {
|
|
@@ -1628,10 +1619,10 @@ function U(e, t, n) {
|
|
|
1628
1619
|
}
|
|
1629
1620
|
});
|
|
1630
1621
|
}
|
|
1631
|
-
function
|
|
1622
|
+
function Yt(e, t) {
|
|
1632
1623
|
return new Promise((n) => {
|
|
1633
1624
|
try {
|
|
1634
|
-
new
|
|
1625
|
+
new C({
|
|
1635
1626
|
hive: e,
|
|
1636
1627
|
key: t
|
|
1637
1628
|
}).values((e) => {
|
|
@@ -1642,7 +1633,7 @@ function $t(e, t) {
|
|
|
1642
1633
|
}
|
|
1643
1634
|
});
|
|
1644
1635
|
}
|
|
1645
|
-
var
|
|
1636
|
+
var Xt = class {
|
|
1646
1637
|
cache = { deviceBrand: "" };
|
|
1647
1638
|
initPromise;
|
|
1648
1639
|
constructor() {
|
|
@@ -1654,26 +1645,26 @@ var en = class {
|
|
|
1654
1645
|
async _initializeCache() {
|
|
1655
1646
|
try {
|
|
1656
1647
|
let [e, t, n, r] = await Promise.all([
|
|
1657
|
-
U(
|
|
1658
|
-
U(
|
|
1659
|
-
U(
|
|
1660
|
-
U(
|
|
1648
|
+
U(C.HKLM, "\\HARDWARE\\DESCRIPTION\\System", "SystemManufacturer"),
|
|
1649
|
+
U(C.HKLM, "\\HARDWARE\\DESCRIPTION\\System", "SystemBiosVendor"),
|
|
1650
|
+
U(C.HKLM, "\\HARDWARE\\DESCRIPTION\\System\\BIOS", "Vendor"),
|
|
1651
|
+
U(C.HKLM, "\\HARDWARE\\DESCRIPTION\\System\\BIOS", "SystemManufacturer")
|
|
1661
1652
|
]);
|
|
1662
1653
|
[
|
|
1663
1654
|
e,
|
|
1664
1655
|
t,
|
|
1665
1656
|
n,
|
|
1666
1657
|
r
|
|
1667
|
-
].find((e) => e && e.toLowerCase().includes("honor")) || await
|
|
1658
|
+
].find((e) => e && e.toLowerCase().includes("honor")) || await Yt(C.HKLM, "\\SOFTWARE\\HONOR\\PCManager") ? this.cache.deviceBrand = "HONOR" : this.cache.deviceBrand = "";
|
|
1668
1659
|
} catch {
|
|
1669
1660
|
this.cache.deviceBrand = "";
|
|
1670
1661
|
}
|
|
1671
1662
|
}
|
|
1672
1663
|
getWindowsDeviceModel() {
|
|
1673
|
-
return `Windows ${
|
|
1664
|
+
return `Windows ${S.release()}`;
|
|
1674
1665
|
}
|
|
1675
1666
|
getWindowsDeviceName() {
|
|
1676
|
-
return `${
|
|
1667
|
+
return `${S.hostname()} (${this.getWindowsDeviceModel()})`;
|
|
1677
1668
|
}
|
|
1678
1669
|
getDeviceName() {
|
|
1679
1670
|
return this.getWindowsDeviceName();
|
|
@@ -1690,33 +1681,33 @@ var en = class {
|
|
|
1690
1681
|
};
|
|
1691
1682
|
//#endregion
|
|
1692
1683
|
//#region src/modules/device/providers/index.ts
|
|
1693
|
-
function
|
|
1694
|
-
let
|
|
1695
|
-
if (
|
|
1696
|
-
if (
|
|
1684
|
+
function Zt() {
|
|
1685
|
+
let t = process.platform;
|
|
1686
|
+
if (t === "win32") return "windows";
|
|
1687
|
+
if (t === "linux") {
|
|
1697
1688
|
try {
|
|
1698
|
-
if (
|
|
1689
|
+
if (e.existsSync("/system/bin/getprop")) return "pad";
|
|
1699
1690
|
} catch {}
|
|
1700
1691
|
return "linux";
|
|
1701
1692
|
}
|
|
1702
|
-
return
|
|
1693
|
+
return t === "darwin" ? "macos" : "linux";
|
|
1703
1694
|
}
|
|
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
|
|
1695
|
+
function Qt() {
|
|
1696
|
+
switch (Zt()) {
|
|
1697
|
+
case "pad": return new Jt();
|
|
1698
|
+
case "windows": return new Xt();
|
|
1699
|
+
case "linux": return new Gt();
|
|
1700
|
+
case "macos": return new Kt();
|
|
1701
|
+
default: return new Gt();
|
|
1711
1702
|
}
|
|
1712
1703
|
}
|
|
1713
1704
|
//#endregion
|
|
1714
1705
|
//#region src/modules/device/device-info.ts
|
|
1715
1706
|
async function W() {
|
|
1716
|
-
let e =
|
|
1707
|
+
let e = Qt(), t = M();
|
|
1717
1708
|
await e.ensureInitialized();
|
|
1718
|
-
let n = await
|
|
1719
|
-
|
|
1709
|
+
let n = await Vt(), r = n.legacyDeviceId ?? n.deviceId, i = pe(), a = t.getDeviceConfig();
|
|
1710
|
+
O().debug?.(`[yoyoclaw-device] env: ${JSON.stringify(i)}, config: ${JSON.stringify(a)}`);
|
|
1720
1711
|
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
1712
|
deviceId: r,
|
|
1722
1713
|
deviceName: l,
|
|
@@ -1726,7 +1717,7 @@ async function W() {
|
|
|
1726
1717
|
manufacture: c,
|
|
1727
1718
|
port: t.getGatewayPort()
|
|
1728
1719
|
}, f = i.brand || i.deviceType || i.manufacture ? "env" : "config";
|
|
1729
|
-
|
|
1720
|
+
O().info(`[yoyoclaw-device] device info: ${JSON.stringify(d)} (source: ${f})`);
|
|
1730
1721
|
let p = !!(i.brand && i.brand !== a?.brand || i.manufacture && i.manufacture !== a?.manufacture || i.deviceType && i.deviceType !== a?.type);
|
|
1731
1722
|
if (!a || p) {
|
|
1732
1723
|
let e = {
|
|
@@ -1737,27 +1728,27 @@ async function W() {
|
|
|
1737
1728
|
model: u
|
|
1738
1729
|
};
|
|
1739
1730
|
t.updateDeviceConfig(e).catch((e) => {
|
|
1740
|
-
|
|
1731
|
+
O().warn(`[yoyoclaw-device] failed to persist device config: ${String(e)}`);
|
|
1741
1732
|
});
|
|
1742
1733
|
}
|
|
1743
1734
|
return d;
|
|
1744
1735
|
}
|
|
1745
1736
|
//#endregion
|
|
1746
1737
|
//#region src/modules/device/helpers.ts
|
|
1747
|
-
function
|
|
1738
|
+
function $t(e) {
|
|
1748
1739
|
return typeof e == "string" && e.trim() || "";
|
|
1749
1740
|
}
|
|
1750
|
-
function
|
|
1741
|
+
function en(e) {
|
|
1751
1742
|
return e.replace(/[A-Z]/g, (e) => String.fromCharCode(e.charCodeAt(0) + 32));
|
|
1752
1743
|
}
|
|
1753
|
-
function
|
|
1754
|
-
let t =
|
|
1755
|
-
return t ?
|
|
1744
|
+
function tn(e) {
|
|
1745
|
+
let t = $t(e);
|
|
1746
|
+
return t ? en(t) : "";
|
|
1756
1747
|
}
|
|
1757
1748
|
//#endregion
|
|
1758
1749
|
//#region src/modules/device/auth.ts
|
|
1759
|
-
function
|
|
1760
|
-
let t = e.scopes.join(","), n = e.token ?? "", r =
|
|
1750
|
+
function nn(e) {
|
|
1751
|
+
let t = e.scopes.join(","), n = e.token ?? "", r = tn(e.platform), i = tn(e.deviceFamily);
|
|
1761
1752
|
return [
|
|
1762
1753
|
"v3",
|
|
1763
1754
|
e.deviceId,
|
|
@@ -1774,10 +1765,10 @@ function sn(e) {
|
|
|
1774
1765
|
}
|
|
1775
1766
|
//#endregion
|
|
1776
1767
|
//#region src/modules/device/credential-builder.ts
|
|
1777
|
-
function
|
|
1768
|
+
function rn(e) {
|
|
1778
1769
|
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
1770
|
if (!t) return;
|
|
1780
|
-
let d =
|
|
1771
|
+
let d = nn({
|
|
1781
1772
|
deviceId: t.deviceId,
|
|
1782
1773
|
clientId: n,
|
|
1783
1774
|
clientMode: r,
|
|
@@ -1788,10 +1779,10 @@ function cn(e) {
|
|
|
1788
1779
|
nonce: l,
|
|
1789
1780
|
platform: o,
|
|
1790
1781
|
deviceFamily: s
|
|
1791
|
-
}), f =
|
|
1782
|
+
}), f = Ht(t.privateKeyPem, d);
|
|
1792
1783
|
return {
|
|
1793
1784
|
id: t.deviceId,
|
|
1794
|
-
publicKey:
|
|
1785
|
+
publicKey: Ut(t.publicKeyPem),
|
|
1795
1786
|
signature: f,
|
|
1796
1787
|
signedAt: u,
|
|
1797
1788
|
nonce: l
|
|
@@ -1799,15 +1790,15 @@ function cn(e) {
|
|
|
1799
1790
|
}
|
|
1800
1791
|
//#endregion
|
|
1801
1792
|
//#region src/honor-auth/token-manager.ts
|
|
1802
|
-
async function
|
|
1793
|
+
async function an(e, t = !0) {
|
|
1803
1794
|
try {
|
|
1804
|
-
let n =
|
|
1795
|
+
let n = M(), r = e.jwtToken;
|
|
1805
1796
|
if (!r && e.userId) {
|
|
1806
1797
|
let t = e.deviceInfo || await W();
|
|
1807
|
-
r = (await
|
|
1798
|
+
r = (await P().exchangeToken(t, { userId: e.userId })).jwtToken;
|
|
1808
1799
|
}
|
|
1809
1800
|
if (!r) throw Error("no token available");
|
|
1810
|
-
if (!t) return
|
|
1801
|
+
if (!t) return O().info("💾 token got, but not to save"), { token: r };
|
|
1811
1802
|
let i = Math.floor(Date.now() / 1e3) + 720 * 60 * 60;
|
|
1812
1803
|
return await n.updateUserConfig({
|
|
1813
1804
|
token: r,
|
|
@@ -1815,53 +1806,53 @@ async function ln(e, t = !0) {
|
|
|
1815
1806
|
expired: i
|
|
1816
1807
|
}), { token: r };
|
|
1817
1808
|
} catch (e) {
|
|
1818
|
-
throw
|
|
1809
|
+
throw D(e, "保存Token失败");
|
|
1819
1810
|
}
|
|
1820
1811
|
}
|
|
1821
|
-
async function
|
|
1822
|
-
let t = await W(), n = await
|
|
1812
|
+
async function on(e) {
|
|
1813
|
+
let t = await W(), n = await P().exchangeToken(t, { userId: e });
|
|
1823
1814
|
if (n.jwtToken) {
|
|
1824
1815
|
let e = Math.floor(Date.now() / 1e3) + 720 * 60 * 60;
|
|
1825
|
-
return await
|
|
1816
|
+
return await M().updateUserConfig({
|
|
1826
1817
|
token: n.jwtToken,
|
|
1827
1818
|
userId: void 0,
|
|
1828
1819
|
userName: void 0,
|
|
1829
1820
|
expired: e
|
|
1830
1821
|
}), { token: n.jwtToken };
|
|
1831
1822
|
}
|
|
1832
|
-
return await
|
|
1823
|
+
return await M().clearUserConfig(), null;
|
|
1833
1824
|
}
|
|
1834
|
-
async function
|
|
1835
|
-
let e =
|
|
1825
|
+
async function sn() {
|
|
1826
|
+
let e = O();
|
|
1836
1827
|
try {
|
|
1837
|
-
let t =
|
|
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
|
|
1828
|
+
let t = M(), n = t.getUserConfig(), r = me();
|
|
1829
|
+
if (e.debug?.(`[yoyoclaw-auth] env userId: ${r ? "present" : "absent"}, config userId: ${n?.userId ? "present" : "absent"}, config token: ${n?.token ? "present" : "absent"}`), n?.userId) return await on(r || n.userId);
|
|
1839
1830
|
if (n?.token) {
|
|
1840
1831
|
if (!n.expired || n.expired >= Math.floor(Date.now() / 1e3)) return { token: n.token };
|
|
1841
1832
|
e.debug?.("[yoyoclaw-auth] cached token expired");
|
|
1842
1833
|
}
|
|
1843
|
-
return r ? (e.debug?.("[yoyoclaw-auth] token expired, using env userId to exchange token"), await
|
|
1834
|
+
return r ? (e.debug?.("[yoyoclaw-auth] token expired, using env userId to exchange token"), await on(r)) : (n?.token && (e.debug?.("[yoyoclaw-auth] clearing expired token"), await t.clearUserConfig()), null);
|
|
1844
1835
|
} catch (e) {
|
|
1845
|
-
throw
|
|
1836
|
+
throw D(e, "加载Token失败");
|
|
1846
1837
|
}
|
|
1847
1838
|
}
|
|
1848
|
-
async function
|
|
1839
|
+
async function cn() {
|
|
1849
1840
|
try {
|
|
1850
|
-
await
|
|
1841
|
+
await M().clearUserConfig(), O().info("[yoyoclaw-auth] token cleared");
|
|
1851
1842
|
} catch (e) {
|
|
1852
|
-
throw
|
|
1843
|
+
throw D(e, "清除Token失败");
|
|
1853
1844
|
}
|
|
1854
1845
|
}
|
|
1855
1846
|
//#endregion
|
|
1856
1847
|
//#region src/honor-auth/browser.ts
|
|
1857
|
-
async function
|
|
1858
|
-
let n =
|
|
1859
|
-
|
|
1860
|
-
let r =
|
|
1848
|
+
async function ln(e, t) {
|
|
1849
|
+
let n = $e(t);
|
|
1850
|
+
O().debug?.("Starting Honor login flow...");
|
|
1851
|
+
let r = tt(n), a = r.generatePKCEParams(), o = r.buildAuthUrl(a), s = null, c = Xe({
|
|
1861
1852
|
port: n.localPort,
|
|
1862
1853
|
timeout: 6e5,
|
|
1863
1854
|
onCodeReceived: (e) => {
|
|
1864
|
-
|
|
1855
|
+
s = e;
|
|
1865
1856
|
},
|
|
1866
1857
|
onError: (e) => {
|
|
1867
1858
|
console.error("callback server error:", e);
|
|
@@ -1869,47 +1860,47 @@ async function pn(e, t) {
|
|
|
1869
1860
|
});
|
|
1870
1861
|
console.log("🌐 open browser...");
|
|
1871
1862
|
try {
|
|
1872
|
-
await
|
|
1863
|
+
await i(o);
|
|
1873
1864
|
} catch (e) {
|
|
1874
|
-
throw
|
|
1865
|
+
throw D(e, "failed to open browser, check your permissions");
|
|
1875
1866
|
}
|
|
1876
1867
|
try {
|
|
1877
|
-
await
|
|
1868
|
+
await c;
|
|
1878
1869
|
} catch (e) {
|
|
1879
|
-
throw
|
|
1870
|
+
throw D(e, "authorization timeout");
|
|
1880
1871
|
}
|
|
1881
|
-
if (!
|
|
1872
|
+
if (!s) throw Error("no auth code");
|
|
1882
1873
|
try {
|
|
1883
|
-
let t = await
|
|
1884
|
-
code:
|
|
1874
|
+
let t = await P().exchangeToken(e, {
|
|
1875
|
+
code: s,
|
|
1885
1876
|
authConfig: n
|
|
1886
1877
|
});
|
|
1887
1878
|
if (!t?.jwtToken) throw Error("failed to get jwt token");
|
|
1888
|
-
return await
|
|
1879
|
+
return await an({ jwtToken: t.jwtToken }, n.saveToFile !== !1), { token: t.jwtToken };
|
|
1889
1880
|
} catch (e) {
|
|
1890
|
-
throw
|
|
1881
|
+
throw D(e, "get token failed");
|
|
1891
1882
|
}
|
|
1892
1883
|
}
|
|
1893
1884
|
//#endregion
|
|
1894
1885
|
//#region src/honor-auth/cloud.ts
|
|
1895
|
-
async function
|
|
1896
|
-
let e =
|
|
1886
|
+
async function un() {
|
|
1887
|
+
let e = M().getUserConfig();
|
|
1897
1888
|
if (!e?.token) throw Error("⚠️ Not logged in");
|
|
1898
|
-
let t = await W(), n =
|
|
1899
|
-
if (!
|
|
1900
|
-
await
|
|
1889
|
+
let t = await W(), n = P(), r = { token: e.token }, i = await n.logoutDevice(t, r);
|
|
1890
|
+
if (!Fe(i)) throw Error(i.data?.cnMessage || "Unknown error");
|
|
1891
|
+
await cn();
|
|
1901
1892
|
}
|
|
1902
1893
|
//#endregion
|
|
1903
1894
|
//#region src/modules/login/impl.ts
|
|
1904
|
-
async function
|
|
1905
|
-
let { userId: t } = e, n =
|
|
1895
|
+
async function dn(e = {}) {
|
|
1896
|
+
let { userId: t } = e, n = O();
|
|
1906
1897
|
try {
|
|
1907
1898
|
n.debug?.("Starting login process...");
|
|
1908
1899
|
let e = await W(), r;
|
|
1909
|
-
t ? (r = await
|
|
1900
|
+
t ? (r = await an({
|
|
1910
1901
|
userId: t,
|
|
1911
1902
|
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
|
|
1903
|
+
}), n.debug?.("Using provided user info"), n.debug?.(`User: ${t}`), n.debug?.(`Device ID: ${e?.deviceId}`)) : (n.debug?.("Starting OAuth2 authentication..."), r = await ln(e), n.debug?.("OAuth2 authentication successful"), n.debug?.(`Device ID: ${e?.deviceId}`)), console.log("📡 Registering device to Claw Cloud..."), await It(e, r), console.log("✅ Device registered successfully"), console.log("🔗 Channel connection in progress, use 'openclaw honor status' to check device status");
|
|
1913
1904
|
} catch (e) {
|
|
1914
1905
|
let t = e instanceof Error ? e.message : String(e);
|
|
1915
1906
|
console.error("❌ Login process failed:", t);
|
|
@@ -1917,11 +1908,11 @@ async function hn(e = {}) {
|
|
|
1917
1908
|
}
|
|
1918
1909
|
//#endregion
|
|
1919
1910
|
//#region src/commands/login/impl.ts
|
|
1920
|
-
function
|
|
1911
|
+
function fn(e, t) {
|
|
1921
1912
|
let n = t.command("login").description("login to yoyoclaw and register devices");
|
|
1922
1913
|
return n = n.option("-u, --uid <userId>", "user ID for direct login").option("--token <token>", "token for direct login").action(async (t) => {
|
|
1923
1914
|
let { uid: n, token: r } = t;
|
|
1924
|
-
e.logger.debug?.("honor login CLI command called"), await
|
|
1915
|
+
e.logger.debug?.("honor login CLI command called"), await dn({
|
|
1925
1916
|
userId: n,
|
|
1926
1917
|
token: r
|
|
1927
1918
|
});
|
|
@@ -1929,11 +1920,11 @@ function gn(e, t) {
|
|
|
1929
1920
|
}
|
|
1930
1921
|
//#endregion
|
|
1931
1922
|
//#region src/commands/logout/impl.ts
|
|
1932
|
-
function
|
|
1923
|
+
function pn(e, t) {
|
|
1933
1924
|
return t.command("logout").description("Logout and clear user configuration").action(async () => {
|
|
1934
1925
|
e.logger.info("logout CLI command called");
|
|
1935
1926
|
try {
|
|
1936
|
-
await
|
|
1927
|
+
await un(), console.log("✅ Logout successful, gateway will automatically restart to handle new configuration");
|
|
1937
1928
|
} catch (e) {
|
|
1938
1929
|
let t = e instanceof Error ? e.message : String(e);
|
|
1939
1930
|
console.error("❌ Logout failed:", t);
|
|
@@ -1944,26 +1935,26 @@ function _n(e, t) {
|
|
|
1944
1935
|
//#region src/services/connection/status-tracker/events.ts
|
|
1945
1936
|
var G = /* @__PURE__ */ function(e) {
|
|
1946
1937
|
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
|
-
}({}),
|
|
1938
|
+
}({}), mn = class {
|
|
1948
1939
|
statusFilePath;
|
|
1949
1940
|
statusDir;
|
|
1950
1941
|
constructor() {
|
|
1951
|
-
let e =
|
|
1952
|
-
this.statusDir =
|
|
1942
|
+
let e = Ct();
|
|
1943
|
+
this.statusDir = ne.join(e, ".yoyo-cache"), this.statusFilePath = ne.join(this.statusDir, "yoyo-status.json");
|
|
1953
1944
|
}
|
|
1954
1945
|
async save(e) {
|
|
1955
1946
|
try {
|
|
1956
|
-
await
|
|
1957
|
-
let
|
|
1958
|
-
await
|
|
1947
|
+
await x.mkdir(this.statusDir, { recursive: !0 });
|
|
1948
|
+
let t = JSON.stringify(e, null, 2);
|
|
1949
|
+
await x.writeFile(this.statusFilePath, t, "utf-8");
|
|
1959
1950
|
} catch (e) {
|
|
1960
1951
|
throw console.error(`[StatusStorage] Failed to save status: ${e instanceof Error ? e.message : String(e)}`), e;
|
|
1961
1952
|
}
|
|
1962
1953
|
}
|
|
1963
1954
|
async load() {
|
|
1964
1955
|
try {
|
|
1965
|
-
await
|
|
1966
|
-
let e = await
|
|
1956
|
+
await x.access(this.statusFilePath);
|
|
1957
|
+
let e = await x.readFile(this.statusFilePath, "utf-8");
|
|
1967
1958
|
return JSON.parse(e);
|
|
1968
1959
|
} catch (e) {
|
|
1969
1960
|
return e.code === "ENOENT" || console.error(`[StatusStorage] Failed to load status: ${e instanceof Error ? e.message : String(e)}`), null;
|
|
@@ -1971,7 +1962,7 @@ var G = /* @__PURE__ */ function(e) {
|
|
|
1971
1962
|
}
|
|
1972
1963
|
async clear() {
|
|
1973
1964
|
try {
|
|
1974
|
-
await
|
|
1965
|
+
await x.unlink(this.statusFilePath);
|
|
1975
1966
|
} catch (e) {
|
|
1976
1967
|
if (e.code !== "ENOENT") throw console.error(`[StatusStorage] Failed to clear status: ${e instanceof Error ? e.message : String(e)}`), e;
|
|
1977
1968
|
}
|
|
@@ -1981,7 +1972,7 @@ var G = /* @__PURE__ */ function(e) {
|
|
|
1981
1972
|
}
|
|
1982
1973
|
async exists() {
|
|
1983
1974
|
try {
|
|
1984
|
-
return await
|
|
1975
|
+
return await x.access(this.statusFilePath), !0;
|
|
1985
1976
|
} catch {
|
|
1986
1977
|
return !1;
|
|
1987
1978
|
}
|
|
@@ -1989,7 +1980,7 @@ var G = /* @__PURE__ */ function(e) {
|
|
|
1989
1980
|
};
|
|
1990
1981
|
//#endregion
|
|
1991
1982
|
//#region src/services/connection/status-tracker/types.ts
|
|
1992
|
-
function
|
|
1983
|
+
function hn() {
|
|
1993
1984
|
return {
|
|
1994
1985
|
status: "idle",
|
|
1995
1986
|
updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
@@ -2024,13 +2015,13 @@ function yn() {
|
|
|
2024
2015
|
}
|
|
2025
2016
|
//#endregion
|
|
2026
2017
|
//#region src/services/connection/status-tracker/tracker.ts
|
|
2027
|
-
var
|
|
2018
|
+
var gn = class {
|
|
2028
2019
|
currentStatus;
|
|
2029
2020
|
storage;
|
|
2030
2021
|
autoSave;
|
|
2031
2022
|
saveTimer;
|
|
2032
2023
|
constructor(e = !0) {
|
|
2033
|
-
this.currentStatus =
|
|
2024
|
+
this.currentStatus = hn(), this.storage = new mn(), this.autoSave = e, this.saveTimer = null;
|
|
2034
2025
|
}
|
|
2035
2026
|
async handleEvent(e) {
|
|
2036
2027
|
let { type: t, timestamp: n, data: r } = e;
|
|
@@ -2081,7 +2072,7 @@ var bn = class {
|
|
|
2081
2072
|
let e = await this.storage.load();
|
|
2082
2073
|
if (e) {
|
|
2083
2074
|
let t = e.cloudSocket, n = e.history;
|
|
2084
|
-
this.currentStatus =
|
|
2075
|
+
this.currentStatus = hn(), this.currentStatus.cloudSocket = t, this.currentStatus.history = n, this.currentStatus.cloudSocket.connected = !1, this.currentStatus.cloudSocket.readyState = 3, await this.saveStatus();
|
|
2085
2076
|
}
|
|
2086
2077
|
return this.getStatus();
|
|
2087
2078
|
}
|
|
@@ -2089,7 +2080,7 @@ var bn = class {
|
|
|
2089
2080
|
await this.storage.save(this.currentStatus);
|
|
2090
2081
|
}
|
|
2091
2082
|
async clearStatus() {
|
|
2092
|
-
this.currentStatus =
|
|
2083
|
+
this.currentStatus = hn(), await this.storage.clear();
|
|
2093
2084
|
}
|
|
2094
2085
|
handleCloudSocketConnecting(e, t) {
|
|
2095
2086
|
this.currentStatus.cloudSocket.url = e.url || "", this.currentStatus.cloudSocket.connected = !1;
|
|
@@ -2162,21 +2153,21 @@ var bn = class {
|
|
|
2162
2153
|
};
|
|
2163
2154
|
//#endregion
|
|
2164
2155
|
//#region src/commands/status/index.ts
|
|
2165
|
-
function
|
|
2156
|
+
function _n(e, t) {
|
|
2166
2157
|
return t.command("status").description("Show YOYOClaw connection status").action(async () => {
|
|
2167
|
-
if (e.logger.debug?.("YOYOClaw status CLI command called"), !await
|
|
2158
|
+
if (e.logger.debug?.("YOYOClaw status CLI command called"), !await sn()) {
|
|
2168
2159
|
console.log("❌ You need to login first. Please run: openclaw honor login");
|
|
2169
2160
|
return;
|
|
2170
2161
|
}
|
|
2171
|
-
let t = await new
|
|
2162
|
+
let t = await new mn().load(), n = null;
|
|
2172
2163
|
try {
|
|
2173
2164
|
n = await W();
|
|
2174
2165
|
} catch {}
|
|
2175
|
-
let r =
|
|
2176
|
-
|
|
2166
|
+
let r = M().getEnvInfo();
|
|
2167
|
+
vn(t, n, r);
|
|
2177
2168
|
});
|
|
2178
2169
|
}
|
|
2179
|
-
function
|
|
2170
|
+
function vn(e, t, n) {
|
|
2180
2171
|
if (!e) {
|
|
2181
2172
|
console.log("\n❌ No status data available");
|
|
2182
2173
|
return;
|
|
@@ -2186,7 +2177,7 @@ function Sn(e, t, n) {
|
|
|
2186
2177
|
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
2178
|
console.log(" ┌────────────────────────────┬────────────────────────────┬────────────┐"), console.log(" │ Session ID │ Hardware Device ID │ Connected │"), console.log(" ├────────────────────────────┼────────────────────────────┼────────────┤");
|
|
2188
2179
|
for (let t of e.gateway.connections) {
|
|
2189
|
-
let e =
|
|
2180
|
+
let e = bn(t.sessionId, 26), n = bn(t.hardwareDeviceId, 26), r = yn(t.connectedAt);
|
|
2190
2181
|
console.log(` │ ${e.padEnd(28)}│ ${n.padEnd(28)}│ ${r.padEnd(12)}│`);
|
|
2191
2182
|
}
|
|
2192
2183
|
console.log(" └────────────────────────────┴────────────────────────────┴────────────┘");
|
|
@@ -2194,7 +2185,7 @@ function Sn(e, t, n) {
|
|
|
2194
2185
|
if (console.log("\n📱 Physical Devices:"), console.log(` Unique devices: ${e.devices.uniqueHardwareDevices}`), e.devices.devices.length > 0) {
|
|
2195
2186
|
console.log(" ┌────────────────────────────┬─────────┬────────────┐"), console.log(" │ Hardware Device ID │ Sessions │ Last Active│"), console.log(" ├────────────────────────────┼─────────┼────────────┤");
|
|
2196
2187
|
for (let t of e.devices.devices) {
|
|
2197
|
-
let e =
|
|
2188
|
+
let e = bn(t.hardwareDeviceId, 26), n = String(t.sessions).padEnd(9), r = yn(t.lastActiveAt);
|
|
2198
2189
|
console.log(` │ ${e.padEnd(28)}│ ${n}│ ${r.padEnd(12)}│`);
|
|
2199
2190
|
}
|
|
2200
2191
|
console.log(" └────────────────────────────┴─────────┴────────────┘");
|
|
@@ -2205,60 +2196,60 @@ function K(e) {
|
|
|
2205
2196
|
let t = new Date(e);
|
|
2206
2197
|
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
2198
|
}
|
|
2208
|
-
function
|
|
2199
|
+
function yn(e) {
|
|
2209
2200
|
let t = new Date(e);
|
|
2210
2201
|
return `${String(t.getHours()).padStart(2, "0")}:${String(t.getMinutes()).padStart(2, "0")}:${String(t.getSeconds()).padStart(2, "0")}`;
|
|
2211
2202
|
}
|
|
2212
|
-
function
|
|
2203
|
+
function bn(e, t) {
|
|
2213
2204
|
return e.length <= t ? e : e.substring(0, t - 3) + "...";
|
|
2214
2205
|
}
|
|
2215
2206
|
//#endregion
|
|
2216
2207
|
//#region src/commands/index.ts
|
|
2217
|
-
function
|
|
2208
|
+
function xn(e) {
|
|
2218
2209
|
e.registerCli((t) => {
|
|
2219
2210
|
let n = t.program.command("honor").description("Commands for honor yoyoclaw");
|
|
2220
|
-
|
|
2211
|
+
fn(e, n), _n(e, n), pn(e, n), oe() && Ne(e, n);
|
|
2221
2212
|
}, { commands: ["honor"] });
|
|
2222
2213
|
}
|
|
2223
2214
|
//#endregion
|
|
2224
2215
|
//#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:
|
|
2216
|
+
var Sn = " ## 手机控制规则\n\n - 涉及手机控制的任务时,必须强制调用 yoyo_phone_control 技能完成任务。\n - 手机是可直接操控的设备,你的职责是执行操作,而不是向用户解释如何操作。 \n - 多步骤任务需**按顺序多次调用**,不得合并。 \n", Cn = w.object({
|
|
2217
|
+
token: w.string().optional(),
|
|
2218
|
+
expired: w.number().optional(),
|
|
2219
|
+
userId: w.string().optional(),
|
|
2220
|
+
userName: w.string().optional()
|
|
2221
|
+
}), wn = w.object({
|
|
2222
|
+
type: w.string().optional(),
|
|
2223
|
+
manufacture: w.string().optional(),
|
|
2224
|
+
brand: w.string().optional(),
|
|
2225
|
+
name: w.string().optional(),
|
|
2226
|
+
model: w.string().optional()
|
|
2227
|
+
}), Tn = w.object({
|
|
2228
|
+
user: Cn.optional(),
|
|
2229
|
+
device: wn.optional(),
|
|
2230
|
+
envInfo: w.object({
|
|
2231
|
+
env: w.enum([
|
|
2241
2232
|
"dev",
|
|
2242
2233
|
"test",
|
|
2243
2234
|
"production"
|
|
2244
2235
|
]),
|
|
2245
|
-
source:
|
|
2236
|
+
source: w.enum(["env", "manual"])
|
|
2246
2237
|
}).optional(),
|
|
2247
|
-
env:
|
|
2238
|
+
env: w.enum([
|
|
2248
2239
|
"dev",
|
|
2249
2240
|
"test",
|
|
2250
2241
|
"production"
|
|
2251
2242
|
]).optional(),
|
|
2252
|
-
gray:
|
|
2243
|
+
gray: w.string().optional()
|
|
2253
2244
|
});
|
|
2254
2245
|
//#endregion
|
|
2255
2246
|
//#region src/utils/ws.ts
|
|
2256
|
-
function
|
|
2257
|
-
return typeof e == "string" ? e :
|
|
2247
|
+
function En(e, t = "utf8") {
|
|
2248
|
+
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
2249
|
}
|
|
2259
2250
|
//#endregion
|
|
2260
2251
|
//#region src/gateway-client/client.ts
|
|
2261
|
-
var
|
|
2252
|
+
var Dn = class {
|
|
2262
2253
|
ws = null;
|
|
2263
2254
|
opts;
|
|
2264
2255
|
closed = !1;
|
|
@@ -2266,21 +2257,21 @@ var jn = class {
|
|
|
2266
2257
|
this.opts = e;
|
|
2267
2258
|
}
|
|
2268
2259
|
getUrl() {
|
|
2269
|
-
return `ws://127.0.0.1:${
|
|
2260
|
+
return `ws://127.0.0.1:${M().getGatewayPort()}`;
|
|
2270
2261
|
}
|
|
2271
2262
|
isConnected() {
|
|
2272
|
-
return this.ws !== null && this.ws.readyState ===
|
|
2263
|
+
return this.ws !== null && this.ws.readyState === re.OPEN;
|
|
2273
2264
|
}
|
|
2274
2265
|
connect() {
|
|
2275
2266
|
if (this.closed) return;
|
|
2276
2267
|
let e = this.getUrl();
|
|
2277
|
-
this.ws = new
|
|
2268
|
+
this.ws = new re(e, { maxPayload: 25 * 1024 * 1024 }), this.ws.on("open", () => {
|
|
2278
2269
|
this.opts.onOpen?.(), this.onOpen();
|
|
2279
2270
|
}), this.ws.on("message", async (e) => {
|
|
2280
|
-
let t =
|
|
2271
|
+
let t = En(e);
|
|
2281
2272
|
await this.opts.onMessage?.(t), await this.onMessage(t);
|
|
2282
2273
|
}), this.ws.on("close", (e, t) => {
|
|
2283
|
-
let n =
|
|
2274
|
+
let n = En(t);
|
|
2284
2275
|
this.ws = null, this.onClose(e, n), this.opts.onClose?.(`code: ${e}, reason: ${n ?? ""}`);
|
|
2285
2276
|
}), this.ws.on("error", (e) => {
|
|
2286
2277
|
this.onError(e), this.opts.onClose?.(`socket error: ${e.message}`);
|
|
@@ -2290,14 +2281,14 @@ var jn = class {
|
|
|
2290
2281
|
this.closed = !0, this.ws?.close(), this.ws = null;
|
|
2291
2282
|
}
|
|
2292
2283
|
send(e) {
|
|
2293
|
-
if (!this.ws || this.ws.readyState !==
|
|
2284
|
+
if (!this.ws || this.ws.readyState !== re.OPEN) throw Error("gateway not connected");
|
|
2294
2285
|
this.ws.send(e);
|
|
2295
2286
|
}
|
|
2296
2287
|
onOpen() {}
|
|
2297
2288
|
onMessage(e) {}
|
|
2298
2289
|
onClose(e, t) {}
|
|
2299
2290
|
onError(e) {}
|
|
2300
|
-
},
|
|
2291
|
+
}, On = {
|
|
2301
2292
|
WEBCHAT_UI: "webchat-ui",
|
|
2302
2293
|
CONTROL_UI: "openclaw-control-ui",
|
|
2303
2294
|
WEBCHAT: "webchat",
|
|
@@ -2309,7 +2300,7 @@ var jn = class {
|
|
|
2309
2300
|
NODE_HOST: "node-host",
|
|
2310
2301
|
FINGERPRINT: "fingerprint",
|
|
2311
2302
|
PROBE: "openclaw-probe"
|
|
2312
|
-
},
|
|
2303
|
+
}, kn = {
|
|
2313
2304
|
WEBCHAT: "webchat",
|
|
2314
2305
|
CLI: "cli",
|
|
2315
2306
|
UI: "ui",
|
|
@@ -2325,13 +2316,13 @@ var jn = class {
|
|
|
2325
2316
|
constructor(e, t, n, r) {
|
|
2326
2317
|
super(t), this.name = "WebSocketClientError", this.code = e, this.details = n, this.retryable = r;
|
|
2327
2318
|
}
|
|
2328
|
-
},
|
|
2319
|
+
}, An = {
|
|
2329
2320
|
role: "operator",
|
|
2330
2321
|
scopes: [],
|
|
2331
|
-
clientId:
|
|
2322
|
+
clientId: On.CLI,
|
|
2332
2323
|
displayName: "Protocol Client",
|
|
2333
|
-
clientMode:
|
|
2334
|
-
},
|
|
2324
|
+
clientMode: kn.CLI
|
|
2325
|
+
}, jn = 3e4, Mn = "1.0.0", Nn = "server", Pn = 2, Fn = 1e3, In = class extends Dn {
|
|
2335
2326
|
protocolOpts;
|
|
2336
2327
|
config;
|
|
2337
2328
|
pendingRequests = /* @__PURE__ */ new Map();
|
|
@@ -2347,7 +2338,7 @@ var jn = class {
|
|
|
2347
2338
|
isReconnecting = !1;
|
|
2348
2339
|
constructor(e = {}, t = {}) {
|
|
2349
2340
|
super(e), this.protocolOpts = e, this.config = {
|
|
2350
|
-
...
|
|
2341
|
+
...An,
|
|
2351
2342
|
...t
|
|
2352
2343
|
}, this.debug = process.env.DEBUG_GATEWAY === "true";
|
|
2353
2344
|
}
|
|
@@ -2373,7 +2364,7 @@ var jn = class {
|
|
|
2373
2364
|
handleEvent(e) {
|
|
2374
2365
|
if (e.event === "connect.challenge") {
|
|
2375
2366
|
let t = e.payload;
|
|
2376
|
-
t?.nonce ? (this.connectNonce = t.nonce, this.clearConnectNonceTimer(), this.sendConnect()) :
|
|
2367
|
+
t?.nonce ? (this.connectNonce = t.nonce, this.clearConnectNonceTimer(), this.sendConnect()) : O().error("[protocol-gateway] connect challenge missing nonce");
|
|
2377
2368
|
}
|
|
2378
2369
|
}
|
|
2379
2370
|
clearConnectNonceTimer() {
|
|
@@ -2394,7 +2385,7 @@ var jn = class {
|
|
|
2394
2385
|
}
|
|
2395
2386
|
}
|
|
2396
2387
|
async sendConnect() {
|
|
2397
|
-
let e = this.config.clientMode ??
|
|
2388
|
+
let e = this.config.clientMode ?? kn.CLI, t = await Vt(), n = this.connectNonce ? rn({
|
|
2398
2389
|
deviceIdentity: t,
|
|
2399
2390
|
clientName: this.config.clientId,
|
|
2400
2391
|
clientMode: e,
|
|
@@ -2403,16 +2394,16 @@ var jn = class {
|
|
|
2403
2394
|
authToken: this.protocolOpts.token,
|
|
2404
2395
|
nonce: this.connectNonce,
|
|
2405
2396
|
platform: process.platform,
|
|
2406
|
-
deviceFamily:
|
|
2397
|
+
deviceFamily: Nn
|
|
2407
2398
|
}) : void 0, r = {
|
|
2408
2399
|
minProtocol: 3,
|
|
2409
2400
|
maxProtocol: 3,
|
|
2410
2401
|
client: {
|
|
2411
2402
|
id: this.config.clientId,
|
|
2412
2403
|
displayName: this.config.displayName,
|
|
2413
|
-
version:
|
|
2404
|
+
version: Mn,
|
|
2414
2405
|
platform: process.platform,
|
|
2415
|
-
deviceFamily:
|
|
2406
|
+
deviceFamily: Nn,
|
|
2416
2407
|
mode: e
|
|
2417
2408
|
},
|
|
2418
2409
|
role: this.config.role,
|
|
@@ -2427,7 +2418,7 @@ var jn = class {
|
|
|
2427
2418
|
});
|
|
2428
2419
|
}
|
|
2429
2420
|
async sendRequest(e, t) {
|
|
2430
|
-
let n =
|
|
2421
|
+
let n = _();
|
|
2431
2422
|
return this.logDebug("request", {
|
|
2432
2423
|
id: n,
|
|
2433
2424
|
method: e,
|
|
@@ -2455,7 +2446,7 @@ var jn = class {
|
|
|
2455
2446
|
let t = this.pendingTimers.get(n);
|
|
2456
2447
|
t && clearTimeout(t), this.pendingTimers.delete(n), i(new J(q.TIMEOUT, `Request timeout: ${e}`));
|
|
2457
2448
|
}
|
|
2458
|
-
},
|
|
2449
|
+
}, jn);
|
|
2459
2450
|
this.pendingTimers.set(n, o);
|
|
2460
2451
|
});
|
|
2461
2452
|
}
|
|
@@ -2477,7 +2468,7 @@ var jn = class {
|
|
|
2477
2468
|
this.pendingTimers.clear(), this.pendingRequests.clear();
|
|
2478
2469
|
}
|
|
2479
2470
|
logDebug(e, t) {
|
|
2480
|
-
this.debug &&
|
|
2471
|
+
this.debug && O().info(`[yoyoclaw-protocolGatewayClient:${e}] ${JSON.stringify(t)}`);
|
|
2481
2472
|
}
|
|
2482
2473
|
connect() {
|
|
2483
2474
|
this.closed || (this.isReconnecting = !1, super.connect());
|
|
@@ -2487,16 +2478,16 @@ var jn = class {
|
|
|
2487
2478
|
}
|
|
2488
2479
|
scheduleReconnect() {
|
|
2489
2480
|
if (!(this.closed || this.isReconnecting)) {
|
|
2490
|
-
if (this.reconnectAttempts >=
|
|
2491
|
-
|
|
2481
|
+
if (this.reconnectAttempts >= Pn) {
|
|
2482
|
+
O().error(`[protocol-gateway] max reconnect attempts (${Pn}) reached, giving up`), this.protocolOpts.onReconnectFailed?.();
|
|
2492
2483
|
return;
|
|
2493
2484
|
}
|
|
2494
|
-
this.reconnectAttempts++, this.isReconnecting = !0,
|
|
2485
|
+
this.reconnectAttempts++, this.isReconnecting = !0, O().info(`[protocol-gateway] attempting to reconnect (attempt ${this.reconnectAttempts}/${Pn})`), this.reconnectTimer = setTimeout(() => {
|
|
2495
2486
|
this.isReconnecting = !1, this.closed || super.connect();
|
|
2496
|
-
},
|
|
2487
|
+
}, Fn);
|
|
2497
2488
|
}
|
|
2498
2489
|
}
|
|
2499
|
-
},
|
|
2490
|
+
}, Ln = {
|
|
2500
2491
|
role: "operator",
|
|
2501
2492
|
scopes: [
|
|
2502
2493
|
"operator.admin",
|
|
@@ -2506,12 +2497,12 @@ var jn = class {
|
|
|
2506
2497
|
"operator.approvals",
|
|
2507
2498
|
"operator.pairing"
|
|
2508
2499
|
],
|
|
2509
|
-
clientId:
|
|
2500
|
+
clientId: On.CLI,
|
|
2510
2501
|
displayName: "YOYO-Control",
|
|
2511
|
-
clientMode:
|
|
2512
|
-
},
|
|
2502
|
+
clientMode: kn.BACKEND
|
|
2503
|
+
}, Rn = class extends In {
|
|
2513
2504
|
constructor(e = {}) {
|
|
2514
|
-
super(e,
|
|
2505
|
+
super(e, Ln);
|
|
2515
2506
|
}
|
|
2516
2507
|
async setAgentFile(e, t, n = "main") {
|
|
2517
2508
|
return this.sendRequest("agents.files.set", {
|
|
@@ -2544,7 +2535,7 @@ var jn = class {
|
|
|
2544
2535
|
async devicePairApprove(e) {
|
|
2545
2536
|
return this.sendRequest("device.pair.approve", { requestId: e });
|
|
2546
2537
|
}
|
|
2547
|
-
},
|
|
2538
|
+
}, zn = class {
|
|
2548
2539
|
client = null;
|
|
2549
2540
|
ready = !1;
|
|
2550
2541
|
options;
|
|
@@ -2555,17 +2546,17 @@ var jn = class {
|
|
|
2555
2546
|
}
|
|
2556
2547
|
init() {
|
|
2557
2548
|
if (this.client !== null) return;
|
|
2558
|
-
let e =
|
|
2559
|
-
this.client = new
|
|
2549
|
+
let e = M().getGatewayAuthConfig()?.token || "";
|
|
2550
|
+
this.client = new Rn({
|
|
2560
2551
|
token: e,
|
|
2561
2552
|
onAuthenticated: () => {
|
|
2562
|
-
|
|
2553
|
+
O().info("[yoyoclaw-channel] admin gateway client authenticated"), this.ready = !0, this.resolveAllPending(!0);
|
|
2563
2554
|
},
|
|
2564
2555
|
onClose: (e) => {
|
|
2565
|
-
|
|
2556
|
+
O().info(`[yoyoclaw-channel] admin gateway client closed: ${e}`), this.ready = !1;
|
|
2566
2557
|
},
|
|
2567
2558
|
onReconnectFailed: () => {
|
|
2568
|
-
|
|
2559
|
+
O().error("[yoyoclaw-channel] admin gateway client reconnect failed, notifying status tracker"), this.options.onStatusEvent?.({
|
|
2569
2560
|
type: G.ADMIN_CLIENT_RECONNECT_FAILED,
|
|
2570
2561
|
timestamp: Date.now(),
|
|
2571
2562
|
data: {}
|
|
@@ -2577,7 +2568,7 @@ var jn = class {
|
|
|
2577
2568
|
this.client?.connect();
|
|
2578
2569
|
}
|
|
2579
2570
|
destroy() {
|
|
2580
|
-
this.client &&= (this.client.stop(), null), this.ready = !1, this.cancelAllPending(),
|
|
2571
|
+
this.client &&= (this.client.stop(), null), this.ready = !1, this.cancelAllPending(), O().info("[yoyoclaw-channel] admin gateway client closed");
|
|
2581
2572
|
}
|
|
2582
2573
|
cancelAllPending() {
|
|
2583
2574
|
for (let [e, t] of this.pendingReadyRequests) clearTimeout(t.timeout), t.resolve(!1);
|
|
@@ -2593,12 +2584,12 @@ var jn = class {
|
|
|
2593
2584
|
return this.client !== null && this.ready;
|
|
2594
2585
|
}
|
|
2595
2586
|
ensureConnected() {
|
|
2596
|
-
return this.client === null && (
|
|
2587
|
+
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
2588
|
}
|
|
2598
2589
|
waitForReady(e = 5e3) {
|
|
2599
2590
|
return this.canOperate() ? Promise.resolve(!0) : new Promise((t) => {
|
|
2600
2591
|
let n = `req_${++this.requestIdCounter}`, r = setTimeout(() => {
|
|
2601
|
-
this.pendingReadyRequests.delete(n), this.pendingReadyRequests.size === 0 &&
|
|
2592
|
+
this.pendingReadyRequests.delete(n), this.pendingReadyRequests.size === 0 && O().warn("[yoyoclaw-channel] admin gateway client waitForReady timeout, all requests rejected"), t(!1);
|
|
2602
2593
|
}, e);
|
|
2603
2594
|
this.pendingReadyRequests.set(n, {
|
|
2604
2595
|
resolve: t,
|
|
@@ -2610,11 +2601,11 @@ var jn = class {
|
|
|
2610
2601
|
for (let [t, n] of this.pendingReadyRequests) clearTimeout(n.timeout), n.resolve(e);
|
|
2611
2602
|
this.pendingReadyRequests.clear();
|
|
2612
2603
|
}
|
|
2613
|
-
},
|
|
2614
|
-
function
|
|
2615
|
-
let n =
|
|
2604
|
+
}, Bn = "/aicloud/yoyo-claw-service/v1/yoyoclaw/fullduplex", Vn = 25 * 1024 * 1024;
|
|
2605
|
+
function Hn(e, t) {
|
|
2606
|
+
let n = Ie(), r = n.grayTag ? { "x-gray": n.grayTag } : void 0, i = N(), a = `wss://${n.clawCloud}${Bn}`, o = Un(e, t, i, r), s = ze(a), c = {
|
|
2616
2607
|
headers: o,
|
|
2617
|
-
maxPayload:
|
|
2608
|
+
maxPayload: Vn
|
|
2618
2609
|
};
|
|
2619
2610
|
return s && (c.agent = s), {
|
|
2620
2611
|
url: a,
|
|
@@ -2622,7 +2613,7 @@ function Kn(e, t) {
|
|
|
2622
2613
|
wsOptions: c
|
|
2623
2614
|
};
|
|
2624
2615
|
}
|
|
2625
|
-
function
|
|
2616
|
+
function Un(e, t, n, r) {
|
|
2626
2617
|
let i = {
|
|
2627
2618
|
"x-role": "yoyoclaw",
|
|
2628
2619
|
"x-trace-id": n,
|
|
@@ -2633,7 +2624,7 @@ function qn(e, t, n, r) {
|
|
|
2633
2624
|
}
|
|
2634
2625
|
//#endregion
|
|
2635
2626
|
//#region src/cloud-channel/client.ts
|
|
2636
|
-
var
|
|
2627
|
+
var Wn = 3e4, Gn = 4e3, Kn = 1e3, qn = 2, Jn = 999, Yn = class {
|
|
2637
2628
|
ws = null;
|
|
2638
2629
|
options;
|
|
2639
2630
|
retryCount = 0;
|
|
@@ -2646,18 +2637,18 @@ var Jn = 3e4, Yn = 4e3, Xn = 1e3, Zn = 2, Qn = 999, $n = class {
|
|
|
2646
2637
|
this.options = e;
|
|
2647
2638
|
}
|
|
2648
2639
|
connect(e = !1) {
|
|
2649
|
-
if (this.ws?.readyState ===
|
|
2640
|
+
if (this.ws?.readyState === T.OPEN) return;
|
|
2650
2641
|
this.clearRetryTimer();
|
|
2651
|
-
let { deviceInfo: t, userInfo: n } = this.options, { url: r, traceId: i, wsOptions: a } =
|
|
2642
|
+
let { deviceInfo: t, userInfo: n } = this.options, { url: r, traceId: i, wsOptions: a } = Hn(t, n);
|
|
2652
2643
|
this.currentTraceId = i, this.options.onStatusEvent?.({
|
|
2653
2644
|
type: G.CLOUD_SOCKET_CONNECTING,
|
|
2654
2645
|
timestamp: Date.now(),
|
|
2655
2646
|
data: { url: r }
|
|
2656
|
-
}), this.ws = new
|
|
2647
|
+
}), 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
2648
|
}
|
|
2658
2649
|
handleOpen = (e, t) => {
|
|
2659
2650
|
let n = t ? "reconnected" : "connected";
|
|
2660
|
-
|
|
2651
|
+
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
2652
|
type: G.CLOUD_SOCKET_CONNECTED,
|
|
2662
2653
|
timestamp: Date.now(),
|
|
2663
2654
|
data: {
|
|
@@ -2667,11 +2658,11 @@ var Jn = 3e4, Yn = 4e3, Xn = 1e3, Zn = 2, Qn = 999, $n = class {
|
|
|
2667
2658
|
}), this.options.onOpen?.();
|
|
2668
2659
|
};
|
|
2669
2660
|
handlePong = () => {
|
|
2670
|
-
|
|
2661
|
+
O().debug?.("[claw-cloud-socket] received pong from server");
|
|
2671
2662
|
};
|
|
2672
2663
|
handleClose = (e, t) => {
|
|
2673
2664
|
let n = t.toString();
|
|
2674
|
-
|
|
2665
|
+
O().info(`[claw-cloud-socket][${this.currentTraceId}] connection closed: ${e} - ${n}`), this.options.onStatusEvent?.({
|
|
2675
2666
|
type: G.CLOUD_SOCKET_DISCONNECTED,
|
|
2676
2667
|
timestamp: Date.now(),
|
|
2677
2668
|
data: {
|
|
@@ -2682,7 +2673,7 @@ var Jn = 3e4, Yn = 4e3, Xn = 1e3, Zn = 2, Qn = 999, $n = class {
|
|
|
2682
2673
|
}), this.isManualClose ? (this.stopPingTimer(), this.options.onClose?.()) : this.scheduleReconnect();
|
|
2683
2674
|
};
|
|
2684
2675
|
handleError = (e) => {
|
|
2685
|
-
|
|
2676
|
+
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
2677
|
type: G.CLOUD_SOCKET_ERROR,
|
|
2687
2678
|
timestamp: Date.now(),
|
|
2688
2679
|
data: {
|
|
@@ -2692,12 +2683,12 @@ var Jn = 3e4, Yn = 4e3, Xn = 1e3, Zn = 2, Qn = 999, $n = class {
|
|
|
2692
2683
|
});
|
|
2693
2684
|
};
|
|
2694
2685
|
send(e) {
|
|
2695
|
-
if (!this.ws || this.ws.readyState !==
|
|
2686
|
+
if (!this.ws || this.ws.readyState !== T.OPEN) return O().error("[claw-cloud-socket] cannot send message: connection not open"), !1;
|
|
2696
2687
|
try {
|
|
2697
2688
|
let t = JSON.stringify(e);
|
|
2698
2689
|
return this.ws.send(t), !0;
|
|
2699
2690
|
} catch (t) {
|
|
2700
|
-
return
|
|
2691
|
+
return O().error(`[claw-cloud-socket] failed to send message to cloud session ${e.targetDeviceId},
|
|
2701
2692
|
${t instanceof Error ? t.message : String(t)}`), !1;
|
|
2702
2693
|
}
|
|
2703
2694
|
}
|
|
@@ -2709,34 +2700,34 @@ var Jn = 3e4, Yn = 4e3, Xn = 1e3, Zn = 2, Qn = 999, $n = class {
|
|
|
2709
2700
|
}
|
|
2710
2701
|
onMessage = async (e) => {
|
|
2711
2702
|
try {
|
|
2712
|
-
let t =
|
|
2713
|
-
if (
|
|
2703
|
+
let t = En(e), n = JSON.parse(t);
|
|
2704
|
+
if (O().debug?.(`[yoyoclaw-channel] received cloud message from session ${n.wsOutputEvent?.sourceDeviceId}, deviceId ${n.wsOutputEvent?.sourceDeviceInfo?.deviceId || "nil"}, ${t.slice(0, 1e3)}`), n.code === "YOYO_CLAW_100000") {
|
|
2714
2705
|
if (n.wsOutputEvent) {
|
|
2715
2706
|
n.sessionInfo && (n.wsOutputEvent.sessionInfo = n.sessionInfo), this.options.onMessage?.(n.wsOutputEvent);
|
|
2716
2707
|
return;
|
|
2717
2708
|
}
|
|
2718
2709
|
} else if (n.code === "YOYO_CLAW_100002") {
|
|
2719
2710
|
if (n.extData?.offlineSocketId) {
|
|
2720
|
-
|
|
2711
|
+
O().info(`[claw-cloud-socket] remote device offline, session: ${n.extData.offlineSocketId}`), this.options.onRemoteDeviceOffline?.(n.extData.offlineSocketId);
|
|
2721
2712
|
return;
|
|
2722
2713
|
}
|
|
2723
2714
|
} else if (n.code === "YOYO_CLAW_100001") {
|
|
2724
|
-
this.pauseRetry(),
|
|
2715
|
+
this.pauseRetry(), O().info("[claw-cloud-socket] device not registered, closing connection"), this.options.onDeviceNotRegistered?.();
|
|
2725
2716
|
return;
|
|
2726
2717
|
}
|
|
2727
|
-
|
|
2718
|
+
O().warn(`[claw-cloud-socket] unexpected message: ${n.cnMessage}, code: ${n.code}`);
|
|
2728
2719
|
} catch (e) {
|
|
2729
|
-
|
|
2720
|
+
O().error(`[claw-cloud-socket] failed to parse message: ${e instanceof Error ? e.message : String(e)}`);
|
|
2730
2721
|
}
|
|
2731
2722
|
};
|
|
2732
2723
|
scheduleReconnect() {
|
|
2733
2724
|
if (this.isRetryPaused) {
|
|
2734
|
-
|
|
2725
|
+
O().info("[claw-cloud-socket] retry paused, skipping reconnect"), this.reset(), this.options.onClose?.();
|
|
2735
2726
|
return;
|
|
2736
2727
|
}
|
|
2737
2728
|
this.clearRetryTimer();
|
|
2738
2729
|
let e = this.calculateRetryDelay();
|
|
2739
|
-
this.retryCount = Math.min(this.retryCount + 1,
|
|
2730
|
+
this.retryCount = Math.min(this.retryCount + 1, Jn), O().info(`[claw-cloud-socket] scheduling reconnect attempt ${this.retryCount} in ${e}ms`), this.options.onStatusEvent?.({
|
|
2740
2731
|
type: G.CLOUD_SOCKET_RETRY,
|
|
2741
2732
|
timestamp: Date.now(),
|
|
2742
2733
|
data: {
|
|
@@ -2751,16 +2742,16 @@ var Jn = 3e4, Yn = 4e3, Xn = 1e3, Zn = 2, Qn = 999, $n = class {
|
|
|
2751
2742
|
this.retryTimer &&= (clearTimeout(this.retryTimer), null);
|
|
2752
2743
|
}
|
|
2753
2744
|
calculateRetryDelay() {
|
|
2754
|
-
let e =
|
|
2755
|
-
return Math.min(e,
|
|
2745
|
+
let e = Kn * qn ** +Math.min(this.retryCount, 2);
|
|
2746
|
+
return Math.min(e, Gn);
|
|
2756
2747
|
}
|
|
2757
2748
|
startPingTimer() {
|
|
2758
2749
|
this.pingTimer = setInterval(() => {
|
|
2759
|
-
if (!this.ws || this.ws.readyState !==
|
|
2750
|
+
if (!this.ws || this.ws.readyState !== T.OPEN) {
|
|
2760
2751
|
this.stopPingTimer();
|
|
2761
2752
|
return;
|
|
2762
2753
|
}
|
|
2763
|
-
this.ws.ping(),
|
|
2754
|
+
this.ws.ping(), O().debug?.("[claw-cloud-socket] sent ping to server");
|
|
2764
2755
|
let { deviceInfo: e } = this.options, t = {
|
|
2765
2756
|
msgType: "pingMessage",
|
|
2766
2757
|
sourceRole: "yoyoclaw",
|
|
@@ -2769,115 +2760,115 @@ var Jn = 3e4, Yn = 4e3, Xn = 1e3, Zn = 2, Qn = 999, $n = class {
|
|
|
2769
2760
|
port: e.port
|
|
2770
2761
|
};
|
|
2771
2762
|
try {
|
|
2772
|
-
this.ws.send(JSON.stringify(t)),
|
|
2763
|
+
this.ws.send(JSON.stringify(t)), O().debug?.("[claw-cloud-socket] sent pingMessage to server");
|
|
2773
2764
|
} catch {
|
|
2774
|
-
|
|
2765
|
+
O().error("[claw-cloud-socket] failed to send pingMessage");
|
|
2775
2766
|
}
|
|
2776
|
-
},
|
|
2767
|
+
}, Wn);
|
|
2777
2768
|
}
|
|
2778
2769
|
stopPingTimer() {
|
|
2779
2770
|
this.pingTimer &&= (clearInterval(this.pingTimer), null);
|
|
2780
2771
|
}
|
|
2781
2772
|
pauseRetry() {
|
|
2782
|
-
this.isRetryPaused || (this.isRetryPaused = !0, this.clearRetryTimer(),
|
|
2773
|
+
this.isRetryPaused || (this.isRetryPaused = !0, this.clearRetryTimer(), O().info("[claw-cloud-socket] retry paused"));
|
|
2783
2774
|
}
|
|
2784
2775
|
resumeRetry() {
|
|
2785
|
-
this.isRetryPaused && (this.isRetryPaused = !1,
|
|
2776
|
+
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
2777
|
}
|
|
2787
|
-
},
|
|
2788
|
-
async function
|
|
2789
|
-
let n = 0,
|
|
2790
|
-
for (let
|
|
2791
|
-
let t =
|
|
2778
|
+
}, Xn = ".openclaw/yoyo/tools", Zn = /[<>:"/\\|?*]/;
|
|
2779
|
+
async function Qn(e, t) {
|
|
2780
|
+
let n = 0, i = 0;
|
|
2781
|
+
for (let a of t) {
|
|
2782
|
+
let t = $n(a.name);
|
|
2792
2783
|
if (!t) {
|
|
2793
|
-
|
|
2784
|
+
i += 1;
|
|
2794
2785
|
continue;
|
|
2795
2786
|
}
|
|
2796
2787
|
await B({
|
|
2797
2788
|
rootDir: e,
|
|
2798
|
-
relativePath:
|
|
2799
|
-
data: JSON.stringify(
|
|
2789
|
+
relativePath: r.join(Xn, t),
|
|
2790
|
+
data: JSON.stringify(a, null, 2),
|
|
2800
2791
|
encoding: "utf8",
|
|
2801
2792
|
mkdir: !0
|
|
2802
2793
|
}), n += 1;
|
|
2803
2794
|
}
|
|
2804
2795
|
return {
|
|
2805
|
-
archiveDir:
|
|
2796
|
+
archiveDir: r.join(e, ".openclaw", "yoyo", "tools"),
|
|
2806
2797
|
writtenCount: n,
|
|
2807
|
-
skippedCount:
|
|
2798
|
+
skippedCount: i
|
|
2808
2799
|
};
|
|
2809
2800
|
}
|
|
2810
|
-
function
|
|
2801
|
+
function $n(e) {
|
|
2811
2802
|
let t = e.trim();
|
|
2812
|
-
if (!(!t ||
|
|
2803
|
+
if (!(!t || Zn.test(t) || er(t))) return `${t}.json`;
|
|
2813
2804
|
}
|
|
2814
|
-
function
|
|
2805
|
+
function er(e) {
|
|
2815
2806
|
for (let t of e) if (t.codePointAt(0) < 32) return !0;
|
|
2816
2807
|
return !1;
|
|
2817
2808
|
}
|
|
2818
2809
|
//#endregion
|
|
2819
2810
|
//#region src/modules/device-toolset/copy-fallback.ts
|
|
2820
|
-
var
|
|
2821
|
-
async function
|
|
2822
|
-
await
|
|
2811
|
+
var tr = ".yoyo-device-toolset-copy-fallback";
|
|
2812
|
+
async function nr(e, t) {
|
|
2813
|
+
await ir(t), await v.rm(t, {
|
|
2823
2814
|
recursive: !0,
|
|
2824
2815
|
force: !0
|
|
2825
|
-
}), await v.mkdir(t, { recursive: !0 }), await
|
|
2816
|
+
}), await v.mkdir(t, { recursive: !0 }), await ar(e, t), await v.writeFile(r.join(t, tr), "Managed copy fallback for DeviceToolSet MCP tools.\n", "utf8");
|
|
2826
2817
|
}
|
|
2827
|
-
async function
|
|
2818
|
+
async function rr(e) {
|
|
2828
2819
|
try {
|
|
2829
|
-
return (await v.stat(
|
|
2820
|
+
return (await v.stat(r.join(e, tr))).isFile();
|
|
2830
2821
|
} catch {
|
|
2831
2822
|
return !1;
|
|
2832
2823
|
}
|
|
2833
2824
|
}
|
|
2834
|
-
async function
|
|
2825
|
+
async function ir(e) {
|
|
2835
2826
|
let t;
|
|
2836
2827
|
try {
|
|
2837
2828
|
t = await v.lstat(e);
|
|
2838
2829
|
} catch (e) {
|
|
2839
|
-
if (
|
|
2830
|
+
if (or(e)) return;
|
|
2840
2831
|
throw e;
|
|
2841
2832
|
}
|
|
2842
2833
|
if (!t.isSymbolicLink()) {
|
|
2843
2834
|
if (!t.isDirectory()) throw Error(`Cannot replace unmanaged mcptools path: ${e}`);
|
|
2844
|
-
if (!((await v.readdir(e)).length === 0 || await
|
|
2835
|
+
if (!((await v.readdir(e)).length === 0 || await rr(e))) throw Error(`Cannot replace unmanaged mcptools directory: ${e}`);
|
|
2845
2836
|
}
|
|
2846
2837
|
}
|
|
2847
|
-
async function
|
|
2838
|
+
async function ar(e, t) {
|
|
2848
2839
|
let n = await v.readdir(e, { withFileTypes: !0 });
|
|
2849
|
-
for (let
|
|
2850
|
-
let n =
|
|
2851
|
-
|
|
2840
|
+
for (let i of n) {
|
|
2841
|
+
let n = r.join(e, i.name), a = r.join(t, i.name);
|
|
2842
|
+
i.isDirectory() ? (await v.mkdir(a, { recursive: !0 }), await ar(n, a)) : i.isFile() && await v.copyFile(n, a);
|
|
2852
2843
|
}
|
|
2853
2844
|
}
|
|
2854
|
-
function
|
|
2845
|
+
function or(e) {
|
|
2855
2846
|
return !!(e && typeof e == "object" && "code" in e && e.code === "ENOENT");
|
|
2856
2847
|
}
|
|
2857
2848
|
//#endregion
|
|
2858
2849
|
//#region src/modules/device-toolset/link.ts
|
|
2859
|
-
async function
|
|
2850
|
+
async function sr(e, t, n = {}) {
|
|
2860
2851
|
await v.mkdir(e, { recursive: !0 });
|
|
2861
|
-
let
|
|
2862
|
-
if (
|
|
2863
|
-
if (
|
|
2864
|
-
if (await
|
|
2852
|
+
let i = await v.realpath(e), a = await cr(t);
|
|
2853
|
+
if (a.exists) {
|
|
2854
|
+
if (a.isLink) {
|
|
2855
|
+
if (await lr(t, i)) return { mode: "already-linked" };
|
|
2865
2856
|
throw Error(`Cannot replace unmanaged mcptools link: ${t}`);
|
|
2866
2857
|
}
|
|
2867
|
-
if (!await
|
|
2858
|
+
if (!await ur(t, a.isDirectory)) throw Error(`Cannot replace unmanaged mcptools directory: ${t}`);
|
|
2868
2859
|
await v.rm(t, {
|
|
2869
2860
|
recursive: !0,
|
|
2870
2861
|
force: !0
|
|
2871
2862
|
});
|
|
2872
2863
|
}
|
|
2873
|
-
await v.mkdir(
|
|
2864
|
+
await v.mkdir(r.dirname(t), { recursive: !0 });
|
|
2874
2865
|
try {
|
|
2875
|
-
return await (n.symlink ?? v.symlink)(
|
|
2866
|
+
return await (n.symlink ?? v.symlink)(i, t, process.platform === "win32" ? "junction" : "dir"), { mode: "linked" };
|
|
2876
2867
|
} catch {
|
|
2877
|
-
return await (n.copyFallback ??
|
|
2868
|
+
return await (n.copyFallback ?? nr)(i, t), { mode: "copy-fallback" };
|
|
2878
2869
|
}
|
|
2879
2870
|
}
|
|
2880
|
-
async function
|
|
2871
|
+
async function cr(e) {
|
|
2881
2872
|
try {
|
|
2882
2873
|
let t = await v.lstat(e);
|
|
2883
2874
|
return {
|
|
@@ -2886,7 +2877,7 @@ async function fr(e) {
|
|
|
2886
2877
|
isDirectory: t.isDirectory()
|
|
2887
2878
|
};
|
|
2888
2879
|
} catch (e) {
|
|
2889
|
-
if (
|
|
2880
|
+
if (fr(e)) return {
|
|
2890
2881
|
exists: !1,
|
|
2891
2882
|
isLink: !1,
|
|
2892
2883
|
isDirectory: !1
|
|
@@ -2894,66 +2885,66 @@ async function fr(e) {
|
|
|
2894
2885
|
throw e;
|
|
2895
2886
|
}
|
|
2896
2887
|
}
|
|
2897
|
-
async function
|
|
2888
|
+
async function lr(e, t) {
|
|
2898
2889
|
try {
|
|
2899
|
-
return
|
|
2890
|
+
return dr(await v.realpath(e), t);
|
|
2900
2891
|
} catch {
|
|
2901
2892
|
return !1;
|
|
2902
2893
|
}
|
|
2903
2894
|
}
|
|
2904
|
-
async function
|
|
2905
|
-
return t ? (await v.readdir(e)).length === 0 || await
|
|
2895
|
+
async function ur(e, t) {
|
|
2896
|
+
return t ? (await v.readdir(e)).length === 0 || await rr(e) : !1;
|
|
2906
2897
|
}
|
|
2907
|
-
function
|
|
2898
|
+
function dr(e, t) {
|
|
2908
2899
|
return process.platform === "win32" ? e.toLowerCase() === t.toLowerCase() : e === t;
|
|
2909
2900
|
}
|
|
2910
|
-
function
|
|
2901
|
+
function fr(e) {
|
|
2911
2902
|
return !!(e && typeof e == "object" && "code" in e && e.code === "ENOENT");
|
|
2912
2903
|
}
|
|
2913
2904
|
//#endregion
|
|
2914
2905
|
//#region src/modules/device-toolset/md5-index.ts
|
|
2915
|
-
var
|
|
2916
|
-
function
|
|
2906
|
+
var pr = ".openclaw/yoyo/toolset-md5.json", mr = 1024 * 1024;
|
|
2907
|
+
function hr() {
|
|
2917
2908
|
return {
|
|
2918
2909
|
version: 1,
|
|
2919
2910
|
nodes: {}
|
|
2920
2911
|
};
|
|
2921
2912
|
}
|
|
2922
|
-
function
|
|
2923
|
-
return JSON.stringify(
|
|
2913
|
+
function gr(e) {
|
|
2914
|
+
return JSON.stringify(xr(e));
|
|
2924
2915
|
}
|
|
2925
|
-
function
|
|
2926
|
-
return
|
|
2916
|
+
function _r(e) {
|
|
2917
|
+
return g("md5").update(gr(e)).digest("hex");
|
|
2927
2918
|
}
|
|
2928
|
-
async function
|
|
2919
|
+
async function vr(e) {
|
|
2929
2920
|
try {
|
|
2930
|
-
let t = await
|
|
2921
|
+
let t = await _t({
|
|
2931
2922
|
rootDir: e,
|
|
2932
|
-
relativePath:
|
|
2933
|
-
maxBytes:
|
|
2923
|
+
relativePath: pr,
|
|
2924
|
+
maxBytes: mr
|
|
2934
2925
|
}), n = JSON.parse(t.buffer.toString("utf8"));
|
|
2935
2926
|
return {
|
|
2936
2927
|
version: 1,
|
|
2937
2928
|
nodes: n && typeof n.nodes == "object" && n.nodes ? n.nodes : {}
|
|
2938
2929
|
};
|
|
2939
2930
|
} catch (e) {
|
|
2940
|
-
if (e instanceof
|
|
2931
|
+
if (e instanceof L && e.code === "not-found") return hr();
|
|
2941
2932
|
throw e;
|
|
2942
2933
|
}
|
|
2943
2934
|
}
|
|
2944
|
-
async function
|
|
2945
|
-
let r = (await
|
|
2935
|
+
async function yr(e, t, n) {
|
|
2936
|
+
let r = (await vr(e)).nodes[t]?.md5;
|
|
2946
2937
|
return {
|
|
2947
2938
|
changed: r !== n,
|
|
2948
2939
|
md5: n,
|
|
2949
2940
|
previousMd5: r
|
|
2950
2941
|
};
|
|
2951
2942
|
}
|
|
2952
|
-
async function
|
|
2943
|
+
async function br(e, t, n, r = Date.now()) {
|
|
2953
2944
|
let i = {
|
|
2954
2945
|
version: 1,
|
|
2955
2946
|
nodes: {
|
|
2956
|
-
...(await
|
|
2947
|
+
...(await vr(e)).nodes,
|
|
2957
2948
|
[t]: {
|
|
2958
2949
|
md5: n,
|
|
2959
2950
|
updatedAtMs: r
|
|
@@ -2962,19 +2953,19 @@ async function wr(e, t, n, r = Date.now()) {
|
|
|
2962
2953
|
};
|
|
2963
2954
|
return await B({
|
|
2964
2955
|
rootDir: e,
|
|
2965
|
-
relativePath:
|
|
2956
|
+
relativePath: pr,
|
|
2966
2957
|
data: JSON.stringify(i, null, 2),
|
|
2967
2958
|
encoding: "utf8",
|
|
2968
2959
|
mkdir: !0
|
|
2969
2960
|
}), i;
|
|
2970
2961
|
}
|
|
2971
|
-
function
|
|
2972
|
-
if (Array.isArray(e)) return e.map(
|
|
2962
|
+
function xr(e) {
|
|
2963
|
+
if (Array.isArray(e)) return e.map(xr);
|
|
2973
2964
|
if (!e || typeof e != "object") return e;
|
|
2974
2965
|
let t = {};
|
|
2975
2966
|
for (let n of Object.keys(e).toSorted()) {
|
|
2976
2967
|
let r = e[n];
|
|
2977
|
-
r !== void 0 && (t[n] =
|
|
2968
|
+
r !== void 0 && (t[n] = xr(r));
|
|
2978
2969
|
}
|
|
2979
2970
|
return t;
|
|
2980
2971
|
}
|
|
@@ -2983,17 +2974,17 @@ function Tr(e) {
|
|
|
2983
2974
|
function Y(e) {
|
|
2984
2975
|
return typeof e == "string" && e.trim() ? e : void 0;
|
|
2985
2976
|
}
|
|
2986
|
-
function
|
|
2977
|
+
function Sr(e) {
|
|
2987
2978
|
if (!e || typeof e != "object") throw Error("DeviceToolSet payload must be an object");
|
|
2988
2979
|
let t = e;
|
|
2989
2980
|
if (!Y(t.nodeId)) throw Error("DeviceToolSet payload missing nodeId");
|
|
2990
2981
|
if (!Array.isArray(t.toolSet)) throw Error("DeviceToolSet payload toolSet must be an array");
|
|
2991
2982
|
return e;
|
|
2992
2983
|
}
|
|
2993
|
-
function
|
|
2984
|
+
function Cr(e) {
|
|
2994
2985
|
let t = e.nodeId, n = [], r = 0;
|
|
2995
2986
|
for (let t of e.toolSet) {
|
|
2996
|
-
let e =
|
|
2987
|
+
let e = wr(t);
|
|
2997
2988
|
e ? n.push(e) : r += 1;
|
|
2998
2989
|
}
|
|
2999
2990
|
return {
|
|
@@ -3002,7 +2993,7 @@ function Dr(e) {
|
|
|
3002
2993
|
skippedCount: r
|
|
3003
2994
|
};
|
|
3004
2995
|
}
|
|
3005
|
-
function
|
|
2996
|
+
function wr(e) {
|
|
3006
2997
|
let t = Y(e.tool?.id), n = Y(e.tool?.function?.name), r = Y(e.tool?.function?.description);
|
|
3007
2998
|
if (!t || e.tool?.type !== "function" || !n || !r) return;
|
|
3008
2999
|
let i = {
|
|
@@ -3017,48 +3008,48 @@ function Or(e) {
|
|
|
3017
3008
|
}
|
|
3018
3009
|
//#endregion
|
|
3019
3010
|
//#region src/modules/device-toolset/persist.ts
|
|
3020
|
-
var
|
|
3021
|
-
function
|
|
3011
|
+
var Tr = ".openclaw/yoyo/device-toolsets.json", Er = 10 * 1024 * 1024;
|
|
3012
|
+
function Dr() {
|
|
3022
3013
|
return {
|
|
3023
3014
|
version: 1,
|
|
3024
3015
|
tools: {}
|
|
3025
3016
|
};
|
|
3026
3017
|
}
|
|
3027
|
-
async function
|
|
3018
|
+
async function Or(e) {
|
|
3028
3019
|
try {
|
|
3029
|
-
let t = await
|
|
3020
|
+
let t = await _t({
|
|
3030
3021
|
rootDir: e,
|
|
3031
|
-
relativePath:
|
|
3032
|
-
maxBytes:
|
|
3022
|
+
relativePath: Tr,
|
|
3023
|
+
maxBytes: Er
|
|
3033
3024
|
}), n = JSON.parse(t.buffer.toString("utf8"));
|
|
3034
3025
|
return {
|
|
3035
3026
|
version: 1,
|
|
3036
3027
|
tools: n && typeof n.tools == "object" && n.tools ? n.tools : {}
|
|
3037
3028
|
};
|
|
3038
3029
|
} catch (e) {
|
|
3039
|
-
if (e instanceof
|
|
3030
|
+
if (e instanceof L && e.code === "not-found") return Dr();
|
|
3040
3031
|
throw e;
|
|
3041
3032
|
}
|
|
3042
3033
|
}
|
|
3043
|
-
async function
|
|
3034
|
+
async function kr(e, t, n) {
|
|
3044
3035
|
let r = {
|
|
3045
3036
|
version: 1,
|
|
3046
|
-
tools:
|
|
3037
|
+
tools: Ar((await Or(e)).tools, t, n)
|
|
3047
3038
|
};
|
|
3048
3039
|
return await B({
|
|
3049
3040
|
rootDir: e,
|
|
3050
|
-
relativePath:
|
|
3041
|
+
relativePath: Tr,
|
|
3051
3042
|
data: JSON.stringify(r, null, 2),
|
|
3052
3043
|
encoding: "utf8",
|
|
3053
3044
|
mkdir: !0
|
|
3054
3045
|
}), {
|
|
3055
3046
|
changed: !0,
|
|
3056
|
-
nodeCount:
|
|
3047
|
+
nodeCount: Mr(r.tools),
|
|
3057
3048
|
toolCount: Object.keys(r.tools).length,
|
|
3058
3049
|
cache: r
|
|
3059
3050
|
};
|
|
3060
3051
|
}
|
|
3061
|
-
function
|
|
3052
|
+
function Ar(e, t, n) {
|
|
3062
3053
|
let r = { ...e };
|
|
3063
3054
|
for (let e of n) {
|
|
3064
3055
|
let n = r[e.id];
|
|
@@ -3066,98 +3057,98 @@ function Pr(e, t, n) {
|
|
|
3066
3057
|
id: e.id,
|
|
3067
3058
|
name: e.name,
|
|
3068
3059
|
description: e.description,
|
|
3069
|
-
supportedNodeIds:
|
|
3060
|
+
supportedNodeIds: jr(n?.supportedNodeIds ?? [], t)
|
|
3070
3061
|
};
|
|
3071
3062
|
}
|
|
3072
3063
|
return r;
|
|
3073
3064
|
}
|
|
3074
|
-
function
|
|
3065
|
+
function jr(e, t) {
|
|
3075
3066
|
return [...new Set([...e, t])];
|
|
3076
3067
|
}
|
|
3077
|
-
function
|
|
3068
|
+
function Mr(e) {
|
|
3078
3069
|
let t = /* @__PURE__ */ new Set();
|
|
3079
3070
|
for (let n of Object.values(e)) for (let e of n.supportedNodeIds) t.add(e);
|
|
3080
3071
|
return t.size;
|
|
3081
3072
|
}
|
|
3082
3073
|
//#endregion
|
|
3083
3074
|
//#region src/modules/device-toolset/skill-inject.ts
|
|
3084
|
-
var
|
|
3085
|
-
async function
|
|
3086
|
-
let n =
|
|
3087
|
-
return
|
|
3075
|
+
var Nr = r.join("skills", "yoyo-control", "SKILL.md"), Pr = r.join("skills", "yoyo-control", "configs", "sub-skills.json"), Fr = "{{full-mcp-tool-list}}", Ir = "<!-- yoyo-mcp-tools:start -->", Lr = "<!-- yoyo-mcp-tools:end -->";
|
|
3076
|
+
async function Rr(e, t) {
|
|
3077
|
+
let n = r.join(e, Nr), i = await v.readFile(n, "utf8"), a = Br(t, await zr(e)), o = Hr(i, Vr(a));
|
|
3078
|
+
return o !== i && await v.writeFile(n, o, "utf8"), {
|
|
3088
3079
|
skillPath: n,
|
|
3089
|
-
rowCount: Object.keys(
|
|
3080
|
+
rowCount: Object.keys(a).length
|
|
3090
3081
|
};
|
|
3091
3082
|
}
|
|
3092
|
-
async function
|
|
3093
|
-
let t =
|
|
3083
|
+
async function zr(e) {
|
|
3084
|
+
let t = r.join(e, Pr), n;
|
|
3094
3085
|
try {
|
|
3095
3086
|
n = await v.readFile(t, "utf8");
|
|
3096
3087
|
} catch (e) {
|
|
3097
|
-
if (
|
|
3088
|
+
if (Gr(e) && e.code === "ENOENT") return /* @__PURE__ */ new Set();
|
|
3098
3089
|
throw e;
|
|
3099
3090
|
}
|
|
3100
|
-
let
|
|
3101
|
-
if (!Array.isArray(
|
|
3102
|
-
return new Set(
|
|
3091
|
+
let i = JSON.parse(n);
|
|
3092
|
+
if (!Array.isArray(i) || i.some((e) => typeof e != "string")) throw Error("sub-skills config must be a JSON array of tool names");
|
|
3093
|
+
return new Set(i.map((e) => e.trim()).filter(Boolean));
|
|
3103
3094
|
}
|
|
3104
|
-
function
|
|
3095
|
+
function Br(e, t) {
|
|
3105
3096
|
return t.size === 0 ? e : Object.fromEntries(Object.entries(e).filter(([e, n]) => !t.has(e) && !t.has(n.name)));
|
|
3106
3097
|
}
|
|
3107
|
-
function
|
|
3098
|
+
function Vr(e) {
|
|
3108
3099
|
return [
|
|
3109
|
-
|
|
3110
|
-
...Object.values(e).toSorted((e, t) => e.name.localeCompare(t.name)).map((e) => `| ${
|
|
3111
|
-
|
|
3100
|
+
Ir,
|
|
3101
|
+
...Object.values(e).toSorted((e, t) => e.name.localeCompare(t.name)).map((e) => `| ${Ur(e.name)} | ${Ur(e.description)} | ${Ur(e.supportedNodeIds.join(", "))} |`),
|
|
3102
|
+
Lr
|
|
3112
3103
|
].join("\n");
|
|
3113
3104
|
}
|
|
3114
|
-
function
|
|
3115
|
-
let n = RegExp(`${
|
|
3105
|
+
function Hr(e, t) {
|
|
3106
|
+
let n = RegExp(`${Wr(Ir)}[\\s\\S]*?${Wr(Lr)}`);
|
|
3116
3107
|
if (n.test(e)) return e.replace(n, t);
|
|
3117
|
-
if (e.includes(
|
|
3108
|
+
if (e.includes(Fr)) return e.replace(Fr, t);
|
|
3118
3109
|
throw Error("Unable to find MCP tools placeholder or generated block in yoyo-control skill");
|
|
3119
3110
|
}
|
|
3120
|
-
function
|
|
3111
|
+
function Ur(e) {
|
|
3121
3112
|
return e.replaceAll("|", "\\|").replace(/\r?\n/g, " ");
|
|
3122
3113
|
}
|
|
3123
|
-
function
|
|
3114
|
+
function Wr(e) {
|
|
3124
3115
|
return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
3125
3116
|
}
|
|
3126
|
-
function
|
|
3117
|
+
function Gr(e) {
|
|
3127
3118
|
return e instanceof Error && "code" in e;
|
|
3128
3119
|
}
|
|
3129
3120
|
//#endregion
|
|
3130
3121
|
//#region src/modules/device-toolset/processor.ts
|
|
3131
|
-
var
|
|
3132
|
-
async function
|
|
3133
|
-
let t =
|
|
3122
|
+
var Kr = Ct();
|
|
3123
|
+
async function qr(e) {
|
|
3124
|
+
let t = Sr(e), n = wt();
|
|
3134
3125
|
if (!n) throw Error("Unable to resolve home directory for DeviceToolSet persistence");
|
|
3135
|
-
let
|
|
3136
|
-
|
|
3137
|
-
let
|
|
3138
|
-
if (
|
|
3126
|
+
let i = Cr(t);
|
|
3127
|
+
O().info(`[yoyoclaw-device-toolset] process start, nodeId: ${i.nodeId}, tools: ${i.tools.length}, skipped: ${i.skippedCount}`);
|
|
3128
|
+
let a = _r(i.tools);
|
|
3129
|
+
if (O().debug?.(`[yoyoclaw-device-toolset] computed md5, nodeId: ${i.nodeId}, md5: ${a}`), !(await yr(n, i.nodeId, a)).changed) return O().info(`[yoyoclaw-device-toolset] unchanged, skip refresh, nodeId: ${i.nodeId}`), {
|
|
3139
3130
|
changed: !1,
|
|
3140
|
-
nodeId:
|
|
3141
|
-
skippedCount:
|
|
3131
|
+
nodeId: i.nodeId,
|
|
3132
|
+
skippedCount: i.skippedCount
|
|
3142
3133
|
};
|
|
3143
|
-
let
|
|
3144
|
-
|
|
3145
|
-
let
|
|
3146
|
-
|
|
3147
|
-
let
|
|
3148
|
-
|
|
3149
|
-
let
|
|
3150
|
-
return
|
|
3134
|
+
let o = await kr(n, i.nodeId, i.tools);
|
|
3135
|
+
O().info(`[yoyoclaw-device-toolset] cache merged, nodeId: ${i.nodeId}, supportedNodes: ${o.nodeCount}, tools: ${o.toolCount}`);
|
|
3136
|
+
let s = o.cache.tools, c = await Qn(n, i.tools);
|
|
3137
|
+
O().info(`[yoyoclaw-device-toolset] archive refreshed, nodeId: ${i.nodeId}, written: ${c.writtenCount}, skipped: ${c.skippedCount}`);
|
|
3138
|
+
let l = await Rr(Kr, s);
|
|
3139
|
+
O().info(`[yoyoclaw-device-toolset] skill refreshed, nodeId: ${i.nodeId}, rows: ${l.rowCount}`);
|
|
3140
|
+
let u = await sr(c.archiveDir, r.join(Kr, "skills", "yoyo-control", "mcptools"));
|
|
3141
|
+
return O().info(`[yoyoclaw-device-toolset] mapping ready, nodeId: ${i.nodeId}, mode: ${u.mode}`), await br(n, i.nodeId, a, Date.now()), O().info(`[yoyoclaw-device-toolset] process complete, nodeId: ${i.nodeId}`), {
|
|
3151
3142
|
changed: !0,
|
|
3152
|
-
nodeId:
|
|
3153
|
-
nodeCount:
|
|
3154
|
-
toolCount:
|
|
3155
|
-
skippedCount:
|
|
3143
|
+
nodeId: i.nodeId,
|
|
3144
|
+
nodeCount: o.nodeCount,
|
|
3145
|
+
toolCount: o.toolCount,
|
|
3146
|
+
skippedCount: i.skippedCount
|
|
3156
3147
|
};
|
|
3157
3148
|
}
|
|
3158
3149
|
//#endregion
|
|
3159
3150
|
//#region src/cloud-channel/message-handler.ts
|
|
3160
|
-
var
|
|
3151
|
+
var Jr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", Yr = class {
|
|
3161
3152
|
sessionManager;
|
|
3162
3153
|
adminClientManager;
|
|
3163
3154
|
config;
|
|
@@ -3197,7 +3188,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3197
3188
|
let { sourceDeviceId: t, sourceDeviceInfo: n, targetDeviceId: r, port: i, sessionInfo: a, traceInfo: o } = e;
|
|
3198
3189
|
if (!t || !r || !i || !n?.deviceId) return;
|
|
3199
3190
|
let s = n.deviceId, c = a?.nodeConnectTimestamp;
|
|
3200
|
-
c ? (this.sessionManager.closePreviousNodeGatewayClients(s, c), this.flushPendingMessage(s), this.initializedDeviceIds.delete(s)) :
|
|
3191
|
+
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
3192
|
let l = {
|
|
3202
3193
|
sessionId: t,
|
|
3203
3194
|
timestamp: c || 0,
|
|
@@ -3229,11 +3220,11 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3229
3220
|
handleUnPairMessage(e) {
|
|
3230
3221
|
let { sourceDeviceId: t } = e;
|
|
3231
3222
|
if (!t) {
|
|
3232
|
-
|
|
3223
|
+
O().warn(`${X} unpair message missing sourceDeviceId`);
|
|
3233
3224
|
return;
|
|
3234
3225
|
}
|
|
3235
3226
|
let n = this.sessionManager.getHardwareDeviceId(t);
|
|
3236
|
-
|
|
3227
|
+
O().info(`${X} received unpair message, session: ${t}, hardware device: ${n}`), this.config.onStatusEvent?.({
|
|
3237
3228
|
type: G.DEVICE_UNPAIRING,
|
|
3238
3229
|
timestamp: Date.now(),
|
|
3239
3230
|
data: {
|
|
@@ -3247,27 +3238,27 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3247
3238
|
handleUserMessage(e) {
|
|
3248
3239
|
let { sourceDeviceId: t } = e || {};
|
|
3249
3240
|
if (!t) {
|
|
3250
|
-
|
|
3241
|
+
O().warn(`${X} user message missing sourceDeviceId`);
|
|
3251
3242
|
return;
|
|
3252
3243
|
}
|
|
3253
3244
|
let n = this.sessionManager.getHardwareDeviceId(t);
|
|
3254
3245
|
if (!n) {
|
|
3255
|
-
|
|
3246
|
+
O().warn(`${X} user message missing hardwareDeviceId, session: ${t}`);
|
|
3256
3247
|
return;
|
|
3257
3248
|
}
|
|
3258
3249
|
try {
|
|
3259
3250
|
let r = this.sessionManager.getNodeGatewayClient(t);
|
|
3260
3251
|
if (!r) {
|
|
3261
|
-
|
|
3252
|
+
O().warn(`${X} no node gateway client found for source device: ${n}, session: ${t}`);
|
|
3262
3253
|
return;
|
|
3263
3254
|
}
|
|
3264
3255
|
e.data && (this.initializedDeviceIds.has(n) || this.processMessageBuffer(t, n, e.data, r)) && this.forwardToNodeGateway(t, n, r, e.data);
|
|
3265
3256
|
} catch (e) {
|
|
3266
|
-
|
|
3257
|
+
O().error(`${X} failed to send gateway message to device: ${n}, session: ${t}, ${String(e)}`);
|
|
3267
3258
|
}
|
|
3268
3259
|
}
|
|
3269
3260
|
forwardToNodeGateway(e, t, n, r) {
|
|
3270
|
-
|
|
3261
|
+
O().info(`${X} forwarding user message to node gateway from ${t}, session: ${e}`), n.send(r);
|
|
3271
3262
|
}
|
|
3272
3263
|
processMessageBuffer(e, t, n, r) {
|
|
3273
3264
|
let i = this.pendingFirstMessages.get(t);
|
|
@@ -3295,22 +3286,22 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3295
3286
|
handleNodeGatewayMessage = async (e, t, n) => {
|
|
3296
3287
|
let r = this.sessionManager.getHardwareDeviceId(e), i = this.sessionManager.getSession(e), a = i?.sourceInfo.sourceDeviceInfo?.deviceId;
|
|
3297
3288
|
if (!r || !i) {
|
|
3298
|
-
|
|
3289
|
+
O().warn(`${X} gateway source offline, session: ${e}`);
|
|
3299
3290
|
return;
|
|
3300
3291
|
}
|
|
3301
|
-
|
|
3292
|
+
O().info(`${X} received gateway message from ${a}`);
|
|
3302
3293
|
try {
|
|
3303
3294
|
let e = i.sourceInfo.sourceDeviceId, r;
|
|
3304
3295
|
try {
|
|
3305
3296
|
r = JSON.parse(n);
|
|
3306
3297
|
} catch {
|
|
3307
|
-
|
|
3298
|
+
O().warn(`${X} gateway message is not valid JSON`);
|
|
3308
3299
|
return;
|
|
3309
3300
|
}
|
|
3310
3301
|
if (!r.ok && r.error?.code === "NOT_PAIRED") {
|
|
3311
3302
|
let n = r.error?.details?.requestId;
|
|
3312
3303
|
if (!n) {
|
|
3313
|
-
|
|
3304
|
+
O().warn(`${X} NOT_PAIRED without requestId, ignoring...`);
|
|
3314
3305
|
return;
|
|
3315
3306
|
}
|
|
3316
3307
|
await this.handleAutoPair(n);
|
|
@@ -3318,30 +3309,30 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3318
3309
|
id: r.id,
|
|
3319
3310
|
type: "reconnect-required"
|
|
3320
3311
|
};
|
|
3321
|
-
this.sendMessage("deviceControl", e, t, "", void 0, i),
|
|
3312
|
+
this.sendMessage("deviceControl", e, t, "", void 0, i), O().info(`${X} auto pair is completed, requestId: ${n}`);
|
|
3322
3313
|
return;
|
|
3323
3314
|
}
|
|
3324
|
-
|
|
3315
|
+
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
3316
|
} catch (e) {
|
|
3326
|
-
|
|
3317
|
+
O().error(`${X} failed to handle gateway message: ${String(e)}`);
|
|
3327
3318
|
}
|
|
3328
3319
|
};
|
|
3329
3320
|
async handleAutoPair(e) {
|
|
3330
3321
|
let t = this.adminClientManager.getClient();
|
|
3331
|
-
if (!t) return
|
|
3322
|
+
if (!t) return O().warn(`${X} admin client not available for auto pair`), !1;
|
|
3332
3323
|
try {
|
|
3333
|
-
|
|
3324
|
+
O().info(`${X} auto pair approve, requestId: ${e}`), await t.devicePairApprove(e);
|
|
3334
3325
|
} catch (t) {
|
|
3335
|
-
|
|
3326
|
+
O().error(`${X} auto pair approve failed, requestId: ${e}, error: ${String(t)}, ignore...`);
|
|
3336
3327
|
}
|
|
3337
3328
|
}
|
|
3338
3329
|
async handleContextRequest(e) {
|
|
3339
3330
|
let { sourceDeviceId: t, traceInfo: n } = e, r = e.msgType, i = r === "updateContexts";
|
|
3340
3331
|
if (!t) {
|
|
3341
|
-
|
|
3332
|
+
O().warn(`${X} context request missing sourceDeviceId`);
|
|
3342
3333
|
return;
|
|
3343
3334
|
}
|
|
3344
|
-
|
|
3335
|
+
O().info(`${X} handling ${r} from ${t} traceInfo: ${JSON.stringify(n)}`);
|
|
3345
3336
|
let a = e.contexts?.[0], o = this.validateContext(a);
|
|
3346
3337
|
if (!o.valid) {
|
|
3347
3338
|
this.replyContextError(r, t, n, a, o.error);
|
|
@@ -3357,13 +3348,13 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3357
3348
|
if (this.contextHandlerRequiresAdminClient(i, c) && !await this.ensureAdminClientReady(r, t, n, s)) return;
|
|
3358
3349
|
let o = this.adminClientManager.getClient(), l = i ? await e(o ?? void 0, s.payload, s) : await e(o);
|
|
3359
3350
|
if (l.noReply) {
|
|
3360
|
-
|
|
3351
|
+
O().info(`${X} ${i ? "update" : "fetch"} context '${c}' processed (no reply)`);
|
|
3361
3352
|
return;
|
|
3362
3353
|
}
|
|
3363
|
-
l.ok ? (
|
|
3354
|
+
l.ok ? (O().info(`${X} ${i ? "update" : "fetch"} context successfully`), this.sendContextResponse(r, t, n, a, {
|
|
3364
3355
|
ok: !0,
|
|
3365
3356
|
...l.data
|
|
3366
|
-
})) : (
|
|
3357
|
+
})) : (O().error(`${X} failed to ${i ? "update" : "fetch"} context: ${l.error}`), this.sendContextResponse(r, t, n, a, {
|
|
3367
3358
|
ok: !1,
|
|
3368
3359
|
error: l.error,
|
|
3369
3360
|
...l?.data,
|
|
@@ -3371,7 +3362,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3371
3362
|
}));
|
|
3372
3363
|
} catch (e) {
|
|
3373
3364
|
let o = e instanceof Error ? e.message : String(e);
|
|
3374
|
-
|
|
3365
|
+
O().error(`${X} error ${i ? "updating" : "fetching"} context '${c}': ${o}`), this.replyContextError(r, t, n, a, o);
|
|
3375
3366
|
}
|
|
3376
3367
|
}
|
|
3377
3368
|
sendMessage(e, t, n, r, i, a) {
|
|
@@ -3408,7 +3399,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3408
3399
|
}];
|
|
3409
3400
|
}
|
|
3410
3401
|
replyContextError(e, t, n, r, i) {
|
|
3411
|
-
|
|
3402
|
+
O().error(`${X} ${i}`), this.sendContextResponse(e, t, n, r, {
|
|
3412
3403
|
ok: !1,
|
|
3413
3404
|
error: i
|
|
3414
3405
|
});
|
|
@@ -3434,7 +3425,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3434
3425
|
ok: !1,
|
|
3435
3426
|
error: "Missing content in context payload"
|
|
3436
3427
|
};
|
|
3437
|
-
let r =
|
|
3428
|
+
let r = Jr.style, i = await e.setAgentFile(r, n);
|
|
3438
3429
|
return i.ok ? {
|
|
3439
3430
|
ok: !0,
|
|
3440
3431
|
data: { name: "style" }
|
|
@@ -3454,21 +3445,21 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3454
3445
|
error: "Missing provider or id in context payload"
|
|
3455
3446
|
};
|
|
3456
3447
|
try {
|
|
3457
|
-
return (await e.switchPrimaryModel(n, r)).ok ? (
|
|
3448
|
+
return (await e.switchPrimaryModel(n, r)).ok ? (O().info(`[yoyoclaw-channel] switchPrimaryModel success: ${n}/${r}`), {
|
|
3458
3449
|
ok: !0,
|
|
3459
3450
|
data: { resolved: {
|
|
3460
3451
|
provider: n,
|
|
3461
3452
|
id: r
|
|
3462
3453
|
} }
|
|
3463
|
-
}) : (
|
|
3454
|
+
}) : (O().error("[yoyoclaw-channel] switchPrimaryModel failed, try to fallback main session model"), this.getMainSessionModel(e));
|
|
3464
3455
|
} catch (t) {
|
|
3465
|
-
return
|
|
3456
|
+
return O().error(`[yoyoclaw-channel] updatePrimaryModel error: ${t}, try to fallback main session model`), this.getMainSessionModel(e);
|
|
3466
3457
|
}
|
|
3467
3458
|
}
|
|
3468
3459
|
async getMainSessionModel(e) {
|
|
3469
3460
|
try {
|
|
3470
3461
|
let t = await e.getMainSession(), { modelProvider: n = "", model: r = "" } = t;
|
|
3471
|
-
return
|
|
3462
|
+
return O().warn(`[yoyoclaw-channel] switchPrimaryModel failed, fallback to current: ${n}/${r}`), !n || !r ? {
|
|
3472
3463
|
ok: !1,
|
|
3473
3464
|
error: `Missing primary model: mainSession-${JSON.stringify(t)}`
|
|
3474
3465
|
} : {
|
|
@@ -3499,7 +3490,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3499
3490
|
async fetchModelsList(e) {
|
|
3500
3491
|
try {
|
|
3501
3492
|
let t = await e.getModelList(), { modelProvider: n = "", model: r = "" } = await e.getMainSession();
|
|
3502
|
-
return
|
|
3493
|
+
return O().info(`[yoyoclaw-channel] current primary model: ${n}/${r}`), {
|
|
3503
3494
|
ok: !0,
|
|
3504
3495
|
data: { models: t?.models?.map((e) => {
|
|
3505
3496
|
let t = e.provider === n && e.id === r;
|
|
@@ -3511,7 +3502,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3511
3502
|
};
|
|
3512
3503
|
} catch (e) {
|
|
3513
3504
|
let t = e instanceof Error ? e.message : String(e);
|
|
3514
|
-
return
|
|
3505
|
+
return O().error(`[yoyoclaw-channel] fetchModelsList failed: ${t}`), {
|
|
3515
3506
|
ok: !1,
|
|
3516
3507
|
error: `fetchModelsList error: ${t}`
|
|
3517
3508
|
};
|
|
@@ -3523,14 +3514,14 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3523
3514
|
async updateDeviceToolSetContext(e, t, n) {
|
|
3524
3515
|
return n?.header.namespace === "yoyoclaw" ? {
|
|
3525
3516
|
ok: !0,
|
|
3526
|
-
data: await
|
|
3517
|
+
data: await qr(t),
|
|
3527
3518
|
noReply: !0
|
|
3528
3519
|
} : {
|
|
3529
3520
|
ok: !1,
|
|
3530
3521
|
error: `Unsupported DeviceToolSet namespace: ${n?.header.namespace ?? "unknown"}`
|
|
3531
3522
|
};
|
|
3532
3523
|
}
|
|
3533
|
-
},
|
|
3524
|
+
}, Xr = class extends Dn {
|
|
3534
3525
|
nodeOpts;
|
|
3535
3526
|
sessionId;
|
|
3536
3527
|
hardwareDeviceId;
|
|
@@ -3546,7 +3537,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3546
3537
|
return this.hardwareDeviceId;
|
|
3547
3538
|
}
|
|
3548
3539
|
onOpen() {
|
|
3549
|
-
this.connectedAt = (/* @__PURE__ */ new Date()).toISOString(),
|
|
3540
|
+
this.connectedAt = (/* @__PURE__ */ new Date()).toISOString(), O().info(`[yoyoclaw-nodeGatewayClient] connected for session: ${this.sessionId}, device: ${this.hardwareDeviceId}`), this.nodeOpts.onStatusEvent?.({
|
|
3550
3541
|
type: G.GATEWAY_CLIENT_CONNECTED,
|
|
3551
3542
|
timestamp: Date.now(),
|
|
3552
3543
|
data: {
|
|
@@ -3558,7 +3549,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3558
3549
|
});
|
|
3559
3550
|
}
|
|
3560
3551
|
onClose(e, t) {
|
|
3561
|
-
|
|
3552
|
+
O().info(`[yoyoclaw-nodeGatewayClient] disconnected for session: ${this.sessionId}, device: ${this.hardwareDeviceId}, reason: ${t}`), this.nodeOpts.onStatusEvent?.({
|
|
3562
3553
|
type: G.GATEWAY_CLIENT_DISCONNECTED,
|
|
3563
3554
|
timestamp: Date.now(),
|
|
3564
3555
|
data: {
|
|
@@ -3570,9 +3561,9 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3570
3561
|
});
|
|
3571
3562
|
}
|
|
3572
3563
|
onError(e) {
|
|
3573
|
-
|
|
3564
|
+
O().error(`[yoyoclaw-nodeGatewayClient] error for session: ${this.sessionId}, device: ${this.hardwareDeviceId}: ${e.message}`);
|
|
3574
3565
|
}
|
|
3575
|
-
},
|
|
3566
|
+
}, Zr = class {
|
|
3576
3567
|
nodeGatewayClientsMap = /* @__PURE__ */ new Map();
|
|
3577
3568
|
deviceSessionsMap = /* @__PURE__ */ new Map();
|
|
3578
3569
|
sessionIdToHardwareDeviceMap = /* @__PURE__ */ new Map();
|
|
@@ -3605,7 +3596,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3605
3596
|
this.nodeGatewayClientsMap.set(e, t);
|
|
3606
3597
|
}
|
|
3607
3598
|
createNodeGatewayClient(e) {
|
|
3608
|
-
let t = new
|
|
3599
|
+
let t = new Xr({
|
|
3609
3600
|
sessionId: e.sessionId,
|
|
3610
3601
|
hardwareDeviceId: e.hardwareDeviceId,
|
|
3611
3602
|
deviceInfo: e.deviceInfo,
|
|
@@ -3616,19 +3607,19 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3616
3607
|
}
|
|
3617
3608
|
closeNodeGatewayClient(e) {
|
|
3618
3609
|
let t = this.nodeGatewayClientsMap.get(e);
|
|
3619
|
-
t && (t.stop(), this.nodeGatewayClientsMap.delete(e), this.removeSession(e),
|
|
3610
|
+
t && (t.stop(), this.nodeGatewayClientsMap.delete(e), this.removeSession(e), O().info(`[yoyoclaw-channel] closed node gateway client for session: ${e}`));
|
|
3620
3611
|
}
|
|
3621
3612
|
closePreviousNodeGatewayClients(e, t) {
|
|
3622
3613
|
let n = this.deviceSessionsMap.get(e);
|
|
3623
3614
|
if (!n || n.length === 0) return;
|
|
3624
3615
|
let r = n.filter((e) => e.timestamp < t);
|
|
3625
3616
|
if (r.length > 0) {
|
|
3626
|
-
|
|
3617
|
+
O().info(`[yoyoclaw-channel] closing ${r.length} previous node gateway client(s) for hardware device: ${e}, new timestamp: ${t}`);
|
|
3627
3618
|
for (let e of r) this.closeNodeGatewayClient(e.sessionId);
|
|
3628
3619
|
}
|
|
3629
3620
|
}
|
|
3630
3621
|
closeAllNodeGatewayClients() {
|
|
3631
|
-
for (let [e, t] of this.nodeGatewayClientsMap.entries()) t.stop(),
|
|
3622
|
+
for (let [e, t] of this.nodeGatewayClientsMap.entries()) t.stop(), O().info(`[yoyoclaw-channel] closed node gateway client for session: ${e}`);
|
|
3632
3623
|
this.nodeGatewayClientsMap.clear(), this.deviceSessionsMap.clear(), this.sessionIdToHardwareDeviceMap.clear();
|
|
3633
3624
|
}
|
|
3634
3625
|
hasSession(e) {
|
|
@@ -3637,14 +3628,14 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3637
3628
|
getSessionCount() {
|
|
3638
3629
|
return this.sessionIdToHardwareDeviceMap.size;
|
|
3639
3630
|
}
|
|
3640
|
-
},
|
|
3631
|
+
}, Qr = class {
|
|
3641
3632
|
cloudClient;
|
|
3642
3633
|
sessionManager;
|
|
3643
3634
|
adminClientManager;
|
|
3644
3635
|
messageHandler;
|
|
3645
3636
|
config;
|
|
3646
3637
|
constructor(e) {
|
|
3647
|
-
this.config = e, this.sessionManager = new
|
|
3638
|
+
this.config = e, this.sessionManager = new Zr(), this.adminClientManager = new zn({ onStatusEvent: this.handleStatusEvent }), this.messageHandler = new Yr({
|
|
3648
3639
|
sessionManager: this.sessionManager,
|
|
3649
3640
|
adminClientManager: this.adminClientManager,
|
|
3650
3641
|
config: {
|
|
@@ -3652,7 +3643,7 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3652
3643
|
onStatusEvent: this.handleStatusEvent,
|
|
3653
3644
|
onReply: (e) => this.cloudClient.send(e)
|
|
3654
3645
|
}
|
|
3655
|
-
}), this.cloudClient = new
|
|
3646
|
+
}), this.cloudClient = new Yn({
|
|
3656
3647
|
deviceInfo: e.deviceInfo,
|
|
3657
3648
|
userInfo: e.userInfo,
|
|
3658
3649
|
onMessage: this.messageHandler.handleCloudMessage,
|
|
@@ -3665,60 +3656,60 @@ var Qr = { style: "SOUL.md" }, X = "[yoyoclaw-channel]", $r = class {
|
|
|
3665
3656
|
}), this.adminClientManager.init();
|
|
3666
3657
|
}
|
|
3667
3658
|
start() {
|
|
3668
|
-
|
|
3659
|
+
O().info("[yoyoclaw-channel] starting connection"), this.adminClientManager.ensureConnected(), this.cloudClient.connect();
|
|
3669
3660
|
}
|
|
3670
3661
|
destroy() {
|
|
3671
|
-
|
|
3662
|
+
O().info("[yoyoclaw-channel] closing connection"), this.sessionManager.closeAllNodeGatewayClients(), this.adminClientManager.destroy(), this.cloudClient.close();
|
|
3672
3663
|
}
|
|
3673
3664
|
handleCloudOpen = () => {
|
|
3674
|
-
|
|
3665
|
+
O().info("[yoyoclaw-channel] cloud connection established"), this.config.onOpen?.();
|
|
3675
3666
|
};
|
|
3676
3667
|
handleStatusEvent = (e) => {
|
|
3677
3668
|
this.config.onStatusEvent?.(e);
|
|
3678
3669
|
};
|
|
3679
3670
|
handleCloudClose = () => {
|
|
3680
|
-
|
|
3671
|
+
O().info("[yoyoclaw-channel] cloud connection closed"), this.config.onClose?.();
|
|
3681
3672
|
};
|
|
3682
3673
|
handleRemoteDeviceOffline = (e) => {
|
|
3683
3674
|
this.sessionManager.closeNodeGatewayClient(e);
|
|
3684
3675
|
};
|
|
3685
3676
|
handleDeviceNotRegistered = () => {
|
|
3686
|
-
|
|
3677
|
+
O().info("[yoyoclaw-channel] device not registered, notifying connection layer"), this.config.onDeviceNotRegistered?.();
|
|
3687
3678
|
};
|
|
3688
3679
|
handleUnauthorized = () => {
|
|
3689
|
-
|
|
3680
|
+
O().info("[yoyoclaw-channel] unauthorized connection, notifying connection layer"), this.config.onUnauthorized?.();
|
|
3690
3681
|
};
|
|
3691
3682
|
}, Z = {
|
|
3692
3683
|
channel: null,
|
|
3693
3684
|
status: "idle"
|
|
3694
|
-
}, Q = null,
|
|
3685
|
+
}, Q = null, $r = (e) => ({
|
|
3695
3686
|
id: "yoyoclaw-connection",
|
|
3696
3687
|
async start() {
|
|
3697
|
-
|
|
3688
|
+
O().info("[yoyoclaw] plugin service enabled"), Q = new gn(!0);
|
|
3698
3689
|
try {
|
|
3699
|
-
await Q.loadAndCleanStatus(),
|
|
3690
|
+
await Q.loadAndCleanStatus(), O().info("[yoyoclaw-conn] status tracker initialized and cleaned");
|
|
3700
3691
|
} catch (e) {
|
|
3701
|
-
|
|
3692
|
+
O().warn(`[yoyoclaw-conn] failed to load saved status: ${String(e)}`);
|
|
3702
3693
|
}
|
|
3703
|
-
|
|
3694
|
+
O().debug?.(`[yoyoclaw] agents: ${JSON.stringify(e.config.agents?.defaults)}`);
|
|
3704
3695
|
try {
|
|
3705
|
-
await
|
|
3696
|
+
await M().initializePluginConfig("yoyo"), O().info("[yoyoclaw] plugin config initialized");
|
|
3706
3697
|
} catch (e) {
|
|
3707
|
-
|
|
3698
|
+
O().error(`[yoyoclaw] failed to initialize plugin config: ${String(e)}`);
|
|
3708
3699
|
}
|
|
3709
3700
|
try {
|
|
3710
|
-
let e = await
|
|
3711
|
-
e?.token ? (
|
|
3701
|
+
let e = await sn();
|
|
3702
|
+
e?.token ? (O().info("[yoyoclaw-conn] token found, creating channel"), await ei(await W(), e)) : O().info("[yoyoclaw-conn] no token found, skipping channel creation");
|
|
3712
3703
|
} catch (e) {
|
|
3713
|
-
|
|
3704
|
+
O().error(`[yoyoclaw-conn] failed to initialize connection: ${String(e)}`);
|
|
3714
3705
|
}
|
|
3715
3706
|
},
|
|
3716
3707
|
async stop(e) {
|
|
3717
|
-
$(),
|
|
3708
|
+
$(), O().info("[yoyoclaw-conn] stopping connection service"), Q &&= (await Q.destroy(), null);
|
|
3718
3709
|
}
|
|
3719
3710
|
});
|
|
3720
|
-
async function
|
|
3721
|
-
return Z.status = "connecting",
|
|
3711
|
+
async function ei(e, t) {
|
|
3712
|
+
return Z.status = "connecting", O().info(`[yoyoclaw-conn] creating new channel for device: ${e.deviceId}`), Q && await Q.handleEvent({
|
|
3722
3713
|
type: G.CONNECTION_STATUS_CHANGED,
|
|
3723
3714
|
timestamp: Date.now(),
|
|
3724
3715
|
data: {
|
|
@@ -3726,11 +3717,11 @@ async function ii(e, t) {
|
|
|
3726
3717
|
previousStatus: Z.status
|
|
3727
3718
|
}
|
|
3728
3719
|
}), new Promise((n, r) => {
|
|
3729
|
-
Z.channel = new
|
|
3720
|
+
Z.channel = new Qr({
|
|
3730
3721
|
deviceInfo: e,
|
|
3731
3722
|
userInfo: t,
|
|
3732
3723
|
onOpen: () => {
|
|
3733
|
-
Z.status = "connected",
|
|
3724
|
+
Z.status = "connected", O().info("[yoyoclaw-conn] channel connected successfully"), Q && Q.handleEvent({
|
|
3734
3725
|
type: G.CONNECTION_STATUS_CHANGED,
|
|
3735
3726
|
timestamp: Date.now(),
|
|
3736
3727
|
data: {
|
|
@@ -3740,7 +3731,7 @@ async function ii(e, t) {
|
|
|
3740
3731
|
}), n(void 0);
|
|
3741
3732
|
},
|
|
3742
3733
|
onClose: () => {
|
|
3743
|
-
Z.status = "idle", Z.channel = null,
|
|
3734
|
+
Z.status = "idle", Z.channel = null, O().info("[yoyoclaw-conn] channel closed"), Q && Q.handleEvent({
|
|
3744
3735
|
type: G.CONNECTION_STATUS_CHANGED,
|
|
3745
3736
|
timestamp: Date.now(),
|
|
3746
3737
|
data: {
|
|
@@ -3750,30 +3741,30 @@ async function ii(e, t) {
|
|
|
3750
3741
|
}), n(void 0);
|
|
3751
3742
|
},
|
|
3752
3743
|
onDeviceNotRegistered: async () => {
|
|
3753
|
-
|
|
3754
|
-
let t = await
|
|
3744
|
+
O().info("[yoyoclaw-conn] device not registered, handling...");
|
|
3745
|
+
let t = await sn();
|
|
3755
3746
|
if (!t?.token) {
|
|
3756
|
-
|
|
3747
|
+
O().info("[yoyoclaw-conn] no token available, treating as logout"), $();
|
|
3757
3748
|
return;
|
|
3758
3749
|
}
|
|
3759
3750
|
try {
|
|
3760
|
-
|
|
3751
|
+
O().info("[yoyoclaw-conn] attempting to register device"), await It(e, t), O().info("[yoyoclaw-conn] device registered successfully, reconnecting..."), $(), await ei(e, t);
|
|
3761
3752
|
} catch (e) {
|
|
3762
|
-
|
|
3753
|
+
O().error(`[yoyoclaw-conn] device registration failed: ${String(e)}`), O().info("[yoyoclaw-conn] clearing token and destroying channel");
|
|
3763
3754
|
try {
|
|
3764
|
-
await
|
|
3755
|
+
await cn();
|
|
3765
3756
|
} catch (e) {
|
|
3766
|
-
|
|
3757
|
+
O().error(`[yoyoclaw-conn] failed to clear token: ${String(e)}`);
|
|
3767
3758
|
}
|
|
3768
3759
|
$();
|
|
3769
3760
|
}
|
|
3770
3761
|
},
|
|
3771
3762
|
onUnauthorized: async () => {
|
|
3772
|
-
|
|
3763
|
+
O().warn("[yoyoclaw-conn] connection unauthorized (401), clearing token and destroying channel");
|
|
3773
3764
|
try {
|
|
3774
|
-
await
|
|
3765
|
+
await cn();
|
|
3775
3766
|
} catch (e) {
|
|
3776
|
-
|
|
3767
|
+
O().error(`[yoyoclaw-conn] failed to clear token: ${String(e)}`);
|
|
3777
3768
|
}
|
|
3778
3769
|
$();
|
|
3779
3770
|
},
|
|
@@ -3784,31 +3775,31 @@ async function ii(e, t) {
|
|
|
3784
3775
|
try {
|
|
3785
3776
|
Z.channel.start();
|
|
3786
3777
|
} catch (e) {
|
|
3787
|
-
Z.status = "idle", Z.channel = null,
|
|
3778
|
+
Z.status = "idle", Z.channel = null, O().error(`[yoyoclaw-conn] failed to launch channel: ${String(e)}`), r(e);
|
|
3788
3779
|
}
|
|
3789
3780
|
});
|
|
3790
3781
|
}
|
|
3791
3782
|
function $() {
|
|
3792
3783
|
try {
|
|
3793
3784
|
if (!Z.channel) {
|
|
3794
|
-
|
|
3785
|
+
O().warn("[yoyoclaw-conn] no channel to destroy");
|
|
3795
3786
|
return;
|
|
3796
3787
|
}
|
|
3797
|
-
|
|
3788
|
+
O().info("[yoyoclaw-conn] destroying channel"), Z.channel.destroy(), Z.channel = null, Z.status = "idle", O().info("[yoyoclaw-conn] channel destroyed successfully");
|
|
3798
3789
|
} catch (e) {
|
|
3799
|
-
|
|
3790
|
+
O().error(`[yoyoclaw-conn] failed to destroy channel: ${String(e)}`);
|
|
3800
3791
|
}
|
|
3801
3792
|
}
|
|
3802
3793
|
//#endregion
|
|
3803
3794
|
//#region index.ts
|
|
3804
|
-
var
|
|
3795
|
+
var ti = {
|
|
3805
3796
|
id: "yoyo",
|
|
3806
3797
|
name: "YOYOClaw",
|
|
3807
3798
|
description: "OpenClaw Honor Yoyo connection plugin",
|
|
3808
|
-
configSchema:
|
|
3799
|
+
configSchema: Tn,
|
|
3809
3800
|
register(e) {
|
|
3810
|
-
|
|
3801
|
+
ce(e.runtime), _e(e.logger), e.registerService($r(e)), e.on("before_prompt_build", async () => ({ prependSystemContext: Sn })), xn(e);
|
|
3811
3802
|
}
|
|
3812
3803
|
};
|
|
3813
3804
|
//#endregion
|
|
3814
|
-
export {
|
|
3805
|
+
export { ti as default };
|