@honor-claw/yoyo 2026.7.1 → 2026.9.2-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/apis/claw-cloud.mjs +20 -9
- package/dist/apis/helpers.mjs +4 -1
- package/dist/apis/hosts.mjs +9 -12
- package/dist/apis/http-client.mjs +5 -6
- package/dist/capabilities/node/invoke.mjs +2 -2
- package/dist/capabilities/node/types.mjs +1 -1
- package/dist/capabilities/remote-file/errors.mjs +22 -0
- package/dist/capabilities/remote-file/index.mjs +5 -0
- package/dist/capabilities/remote-file/normalize.mjs +27 -0
- package/dist/capabilities/remote-file/obs-transfer.mjs +52 -0
- package/dist/capabilities/remote-file/paths.mjs +74 -0
- package/dist/capabilities/remote-file/progress.mjs +31 -0
- package/dist/capabilities/remote-file/remote-file.mjs +71 -0
- package/dist/cli/env/impl.mjs +3 -3
- package/dist/cloud-channel/handlers/context/handler.mjs +6 -3
- package/dist/core/hooks/tool-trace.mjs +10 -6
- package/dist/diagnose/collectors/account.mjs +15 -18
- package/dist/gateway/client/auth/index.mjs +0 -1
- package/dist/messaging/dispatchers/stream/controller.mjs +186 -33
- package/dist/messaging/dispatchers/stream/emitters.mjs +62 -0
- package/dist/messaging/dispatchers/stream/index.mjs +1 -1
- package/dist/messaging/dispatchers/stream/resolvers.mjs +40 -17
- package/dist/messaging/dispatchers/stream/session.mjs +72 -51
- package/dist/messaging/send/text.mjs +8 -0
- package/dist/messaging/target/outbound.mjs +13 -13
- package/dist/messaging/trace/lifecycle.mjs +16 -3
- package/dist/messaging/trace/tool-context.mjs +30 -17
- package/dist/modules/configs/plugin-init.mjs +3 -1
- package/dist/provisioning/registration/register.mjs +34 -39
- package/dist/schemas.mjs +4 -0
- package/dist/tools/index.mjs +7 -3
- package/dist/tools/node-invoke/status-mapper.mjs +14 -10
- package/dist/tools/node-invoke/task-result-query.mjs +22 -0
- package/dist/tools/node-invoke/tool.mjs +19 -18
- package/dist/tools/remote-file-download/helpers.mjs +30 -0
- package/dist/tools/remote-file-download/index.mjs +1 -0
- package/dist/tools/remote-file-download/run.mjs +137 -0
- package/dist/tools/remote-file-download/tool.mjs +37 -0
- package/dist/tools/remote-file-upload/helpers.mjs +67 -0
- package/dist/tools/remote-file-upload/index.mjs +1 -0
- package/dist/tools/remote-file-upload/run.mjs +278 -0
- package/dist/tools/remote-file-upload/tool.mjs +23 -0
- package/dist/utils/env.mjs +2 -0
- package/dist/utils/stringify.mjs +14 -1
- package/openclaw.plugin.json +10 -3
- package/package.json +1 -1
- package/skills/yoyo-file-transfer/SKILL.md +143 -0
- package/skills/yoyo-file-transfer/references/pc-to-phone.md +148 -0
- package/skills/yoyo-file-transfer/references/phone-to-pc.md +157 -0
- package/skills/yoyo-phone-control/SKILL.md +12 -220
- package/skills/yoyo-phone-control/mcptools/adjust_brightness.json +84 -0
- package/skills/yoyo-phone-control/mcptools/airplane_mode.json +1 -1
- package/skills/yoyo-phone-control/mcptools/battery.json +1 -1
- package/skills/yoyo-phone-control/mcptools/bluetooth.json +1 -1
- package/skills/yoyo-phone-control/mcptools/call.json +1 -1
- package/skills/yoyo-phone-control/mcptools/camera.json +1 -4
- package/skills/yoyo-phone-control/mcptools/cancel_countdown_timer.json +1 -1
- package/skills/yoyo-phone-control/mcptools/cancel_countup_timer.json +9 -15
- package/skills/yoyo-phone-control/mcptools/capture_screenshot.json +7 -50
- package/skills/yoyo-phone-control/mcptools/check_alarm.json +2 -26
- package/skills/yoyo-phone-control/mcptools/check_countdown_timer.json +1 -1
- package/skills/yoyo-phone-control/mcptools/check_countup_timer.json +9 -15
- package/skills/yoyo-phone-control/mcptools/check_schedule.json +17 -14
- package/skills/yoyo-phone-control/mcptools/check_todo.json +11 -12
- package/skills/yoyo-phone-control/mcptools/clean_dirty.json +1 -1
- package/skills/yoyo-phone-control/mcptools/close_alarm.json +1 -1
- package/skills/yoyo-phone-control/mcptools/close_app.json +1 -1
- package/skills/yoyo-phone-control/mcptools/close_countdown_timer.json +1 -1
- package/skills/yoyo-phone-control/mcptools/close_countup_timer.json +8 -10
- package/skills/yoyo-phone-control/mcptools/close_ring.json +3 -5
- package/skills/yoyo-phone-control/mcptools/close_schedule.json +3 -5
- package/skills/yoyo-phone-control/mcptools/configure_auto_record.json +66 -0
- package/skills/yoyo-phone-control/mcptools/create_alarm.json +1 -1
- package/skills/yoyo-phone-control/mcptools/create_countdown_timer.json +1 -1
- package/skills/yoyo-phone-control/mcptools/create_countup_timer.json +8 -10
- package/skills/yoyo-phone-control/mcptools/create_schedule.json +29 -5
- package/skills/yoyo-phone-control/mcptools/create_todo.json +21 -5
- package/skills/yoyo-phone-control/mcptools/dark_mode.json +1 -1
- package/skills/yoyo-phone-control/mcptools/delay_ring.json +3 -4
- package/skills/yoyo-phone-control/mcptools/delete_alarm.json +1 -1
- package/skills/yoyo-phone-control/mcptools/delete_schedule.json +14 -2
- package/skills/yoyo-phone-control/mcptools/delete_todo.json +91 -7
- package/skills/yoyo-phone-control/mcptools/express_logistics_query.json +1 -1
- package/skills/yoyo-phone-control/mcptools/eyecomfort.json +2 -2
- package/skills/yoyo-phone-control/mcptools/flashlight.json +1 -1
- package/skills/yoyo-phone-control/mcptools/get_user_location.json +1 -1
- package/skills/yoyo-phone-control/mcptools/gui_task_create.json +116 -0
- package/skills/yoyo-phone-control/mcptools/gui_task_pause.json +1 -1
- package/skills/yoyo-phone-control/mcptools/gui_task_terminate.json +70 -0
- package/skills/yoyo-phone-control/mcptools/hotspot.json +1 -1
- package/skills/yoyo-phone-control/mcptools/hover_button.json +1 -1
- package/skills/yoyo-phone-control/mcptools/jump_video_progress.json +55 -0
- package/skills/yoyo-phone-control/mcptools/location_service.json +2 -2
- package/skills/yoyo-phone-control/mcptools/mobile_data.json +6 -15
- package/skills/yoyo-phone-control/mcptools/modify_alarm.json +31 -9
- package/skills/yoyo-phone-control/mcptools/modify_schedule.json +33 -8
- package/skills/yoyo-phone-control/mcptools/modify_todo.json +94 -6
- package/skills/yoyo-phone-control/mcptools/multi_screen.json +169 -0
- package/skills/yoyo-phone-control/mcptools/musicFeedbackAction.json +1 -1
- package/skills/yoyo-phone-control/mcptools/navigation_service.json +50 -14
- package/skills/yoyo-phone-control/mcptools/nfc.json +2 -2
- package/skills/yoyo-phone-control/mcptools/no_disturb.json +1 -1
- package/skills/yoyo-phone-control/mcptools/onehanded_mode.json +1 -1
- package/skills/yoyo-phone-control/mcptools/open_alarm.json +1 -1
- package/skills/yoyo-phone-control/mcptools/open_app.json +1 -1
- package/skills/yoyo-phone-control/mcptools/open_transport_code.json +1 -1
- package/skills/yoyo-phone-control/mcptools/operateMusic.json +1 -1
- package/skills/yoyo-phone-control/mcptools/operateVideo.json +2 -2
- package/skills/yoyo-phone-control/mcptools/operate_audio.json +64 -0
- package/skills/yoyo-phone-control/mcptools/pause_countdown_timer.json +1 -1
- package/skills/yoyo-phone-control/mcptools/pause_countup_timer.json +9 -15
- package/skills/yoyo-phone-control/mcptools/phone_service.json +83 -0
- package/skills/yoyo-phone-control/mcptools/playMusic.json +1 -1
- package/skills/yoyo-phone-control/mcptools/playVideo.json +1 -1
- package/skills/yoyo-phone-control/mcptools/play_audio.json +66 -0
- package/skills/yoyo-phone-control/mcptools/quiet_mode.json +2 -2
- package/skills/yoyo-phone-control/mcptools/record.json +1 -1
- package/skills/yoyo-phone-control/mcptools/redial_recall.json +7 -14
- package/skills/yoyo-phone-control/mcptools/restart_countdown_timer.json +1 -1
- package/skills/yoyo-phone-control/mcptools/restart_countup_timer.json +9 -7
- package/skills/yoyo-phone-control/mcptools/resume_countdown_timer.json +1 -1
- package/skills/yoyo-phone-control/mcptools/resume_countup_timer.json +9 -19
- package/skills/yoyo-phone-control/mcptools/ringing_mode.json +2 -2
- package/skills/yoyo-phone-control/mcptools/scan_code.json +1 -1
- package/skills/yoyo-phone-control/mcptools/search_call_record.json +80 -0
- package/skills/yoyo-phone-control/mcptools/search_contact.json +1 -1
- package/skills/yoyo-phone-control/mcptools/search_message.json +1 -1
- package/skills/yoyo-phone-control/mcptools/send_message.json +1 -1
- package/skills/yoyo-phone-control/mcptools/setMusicPlayMode.json +1 -1
- package/skills/yoyo-phone-control/mcptools/set_auto_record.json +53 -0
- package/skills/yoyo-phone-control/mcptools/set_specified_number_auto_record.json +77 -0
- package/skills/yoyo-phone-control/mcptools/set_video_clarity.json +63 -0
- package/skills/yoyo-phone-control/mcptools/set_video_play_mode.json +46 -0
- package/skills/yoyo-phone-control/mcptools/set_video_playback_speed.json +42 -0
- package/skills/yoyo-phone-control/mcptools/simple_mode.json +3 -4
- package/skills/yoyo-phone-control/mcptools/sound_and_vibration.json +71 -0
- package/skills/yoyo-phone-control/mcptools/status_bar_show.json +1 -1
- package/skills/yoyo-phone-control/mcptools/switchMusic.json +1 -1
- package/skills/yoyo-phone-control/mcptools/switch_audio.json +50 -0
- package/skills/yoyo-phone-control/mcptools/switch_video.json +60 -0
- package/skills/yoyo-phone-control/mcptools/toggle_auto_brightness.json +58 -0
- package/skills/yoyo-phone-control/mcptools/uninstall_app.json +1 -1
- package/skills/yoyo-phone-control/mcptools/usb_shared_network.json +4 -3
- package/skills/yoyo-phone-control/mcptools/wlan.json +1 -1
- package/skills/yoyo-phone-control/references/local-user-file-search.md +7 -0
- package/dist/gateway/client/auth/gateway-auth.mjs +0 -16
- package/dist/messaging/dispatchers/stream/hooks.mjs +0 -48
- package/dist/utils/hash.mjs +0 -10
package/dist/apis/claw-cloud.mjs
CHANGED
|
@@ -10,27 +10,24 @@ var o = class {
|
|
|
10
10
|
constructor(e, t) {
|
|
11
11
|
this.httpClient = new i(e, t);
|
|
12
12
|
}
|
|
13
|
-
async registerDevice(n, r
|
|
14
|
-
let
|
|
13
|
+
async registerDevice(n, r) {
|
|
14
|
+
let i = {
|
|
15
15
|
"x-trace-id": t(),
|
|
16
16
|
"x-jwt-token": r.token,
|
|
17
17
|
"x-device-id": n.deviceId
|
|
18
|
-
},
|
|
18
|
+
}, a = {
|
|
19
19
|
businessTag: "YOYO_CLAW",
|
|
20
20
|
role: "yoyoclaw",
|
|
21
21
|
deviceInfo: {
|
|
22
22
|
...n,
|
|
23
23
|
manufacture: n.manufacture,
|
|
24
24
|
brand: n.brand,
|
|
25
|
-
bizExtInfo: {
|
|
26
|
-
...i,
|
|
27
|
-
pluginVersionCode: String(e())
|
|
28
|
-
}
|
|
25
|
+
bizExtInfo: { pluginVersionCode: String(e()) }
|
|
29
26
|
}
|
|
30
27
|
};
|
|
31
28
|
return this.httpClient.post("/v1/device/registry", {
|
|
32
|
-
headers:
|
|
33
|
-
body:
|
|
29
|
+
headers: i,
|
|
30
|
+
body: a
|
|
34
31
|
});
|
|
35
32
|
}
|
|
36
33
|
async logoutDevice(e, n) {
|
|
@@ -88,6 +85,20 @@ var o = class {
|
|
|
88
85
|
timeout: r?.timeoutMs ?? 3e4
|
|
89
86
|
});
|
|
90
87
|
}
|
|
88
|
+
async getUploadLink(e, n, r, i) {
|
|
89
|
+
let a = {
|
|
90
|
+
"x-trace-id": t(),
|
|
91
|
+
"x-jwt-token": n.token,
|
|
92
|
+
"x-device-id": e.deviceId,
|
|
93
|
+
"x-udid": e.deviceId
|
|
94
|
+
};
|
|
95
|
+
return this.httpClient.post("/v1/files/upload/link", {
|
|
96
|
+
headers: a,
|
|
97
|
+
body: r,
|
|
98
|
+
timeout: i?.timeoutMs ?? 3e4,
|
|
99
|
+
...i?.signal ? { signal: i.signal } : {}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
91
102
|
async exchangeToken(e, r) {
|
|
92
103
|
let i = t(), o = {
|
|
93
104
|
"Content-Type": "application/json",
|
package/dist/apis/helpers.mjs
CHANGED
|
@@ -2,5 +2,8 @@
|
|
|
2
2
|
function e(e) {
|
|
3
3
|
return e.status >= 200 && e.status < 300 && e.data.code === "1";
|
|
4
4
|
}
|
|
5
|
+
function t(e) {
|
|
6
|
+
return e.status >= 200 && e.status < 300 && e.data.code === "YOYO_CLAW_100000";
|
|
7
|
+
}
|
|
5
8
|
//#endregion
|
|
6
|
-
export { e as isOKResponse };
|
|
9
|
+
export { t as isClawResponseOk, e as isOKResponse };
|
package/dist/apis/hosts.mjs
CHANGED
|
@@ -5,22 +5,19 @@ function t() {
|
|
|
5
5
|
let { envInfo: t, grayTag: n } = e(), r;
|
|
6
6
|
switch (t.env) {
|
|
7
7
|
case "dev":
|
|
8
|
-
r = {
|
|
9
|
-
clawCloud: "omni-dev-drcn.hiboard.hihonorcloud.com",
|
|
10
|
-
ics: "api-agd-test-drcn.hiboard.hihonorcloud.com"
|
|
11
|
-
};
|
|
8
|
+
r = { clawCloud: "omni-dev-drcn.hiboard.hihonorcloud.com" };
|
|
12
9
|
break;
|
|
13
10
|
case "test":
|
|
14
|
-
r = {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
};
|
|
11
|
+
r = { clawCloud: "omni-pre-drcn.hiboard.hihonorcloud.com" };
|
|
12
|
+
break;
|
|
13
|
+
case "sit":
|
|
14
|
+
r = { clawCloud: "omni-sit-drcn.hiboard.hihonorcloud.com" };
|
|
15
|
+
break;
|
|
16
|
+
case "auto":
|
|
17
|
+
r = { clawCloud: "omni-auto-drcn.hiboard.hihonorcloud.com" };
|
|
18
18
|
break;
|
|
19
19
|
default:
|
|
20
|
-
r = {
|
|
21
|
-
clawCloud: "yoyoclaw-drcn.hiboard.hihonorcloud.com",
|
|
22
|
-
ics: "api-prd-drcn.hiboard.hihonorcloud.com"
|
|
23
|
-
};
|
|
20
|
+
r = { clawCloud: "yoyoclaw-drcn.hiboard.hihonorcloud.com" };
|
|
24
21
|
break;
|
|
25
22
|
}
|
|
26
23
|
return n && (r.grayTag = n), r;
|
|
@@ -31,18 +31,17 @@ var a = class extends Error {
|
|
|
31
31
|
let f = {
|
|
32
32
|
...this.defaultHeaders,
|
|
33
33
|
...s
|
|
34
|
-
};
|
|
35
|
-
c && !f["Content-Type"] && (f["Content-Type"] = "application/json");
|
|
36
|
-
let p;
|
|
37
|
-
c != null && (p = typeof c == "string" ? c : JSON.stringify(c));
|
|
34
|
+
}, p = typeof c == "object" && !!c && (typeof c.read == "function" || Buffer.isBuffer(c)), m;
|
|
35
|
+
c != null && (m = p || typeof c == "string" ? c : JSON.stringify(c)), c && !p && !f["Content-Type"] && (f["Content-Type"] = "application/json");
|
|
38
36
|
try {
|
|
39
37
|
let e = n(t(), r.disableProxy) && this.proxyAgent ? this.proxyAgent : void 0, s = await i(d, {
|
|
40
38
|
method: o,
|
|
41
39
|
headers: f,
|
|
42
|
-
body:
|
|
40
|
+
body: m,
|
|
43
41
|
headersTimeout: l,
|
|
44
42
|
bodyTimeout: l,
|
|
45
|
-
dispatcher: e
|
|
43
|
+
dispatcher: e,
|
|
44
|
+
...r.signal ? { signal: r.signal } : {}
|
|
46
45
|
}), c = await s.body.text(), u;
|
|
47
46
|
try {
|
|
48
47
|
u = c ? JSON.parse(c) : {};
|
|
@@ -2,12 +2,12 @@ import { clawLogger as e } from "../../utils/claw-logger.mjs";
|
|
|
2
2
|
import { buildEndpoint as t } from "../../cloud-channel/protocol/target.mjs";
|
|
3
3
|
import { resolveEnabledYoyoAccountId as n } from "../../modules/configs/channel.mjs";
|
|
4
4
|
import { ClawClient as r } from "../../connection/registry.mjs";
|
|
5
|
-
import {
|
|
5
|
+
import { resolveOutboundTraceInfo as i } from "../../messaging/trace/tool-context.mjs";
|
|
6
6
|
import "../../messaging/trace/index.mjs";
|
|
7
7
|
//#region src/capabilities/node/invoke.ts
|
|
8
8
|
var a = e("capabilities");
|
|
9
9
|
async function o(e) {
|
|
10
|
-
let a = i(e.toolCallId)
|
|
10
|
+
let a = i(e.toolCallId), o = {
|
|
11
11
|
to: t("node", e.nodeId),
|
|
12
12
|
msgType: "nodeInvokeRequest",
|
|
13
13
|
data: { node: {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/capabilities/node/types.ts
|
|
2
2
|
var e = /* @__PURE__ */ function(e) {
|
|
3
|
-
return e[e.Processing = 0] = "Processing", e[e.ProcessingAlt = 100] = "ProcessingAlt", e[e.Suspended = 101] = "Suspended", e[e.Success = 200] = "Success", e[e.InternalError = 300] = "InternalError", e[e.CompensationFailed = 400] = "CompensationFailed", e;
|
|
3
|
+
return e[e.Processing = 0] = "Processing", e[e.ProcessingAlt = 100] = "ProcessingAlt", e[e.Suspended = 101] = "Suspended", e[e.Success = 200] = "Success", e[e.InternalError = 300] = "InternalError", e[e.CompensationFailed = 400] = "CompensationFailed", e[e.UserRejected = 403] = "UserRejected", e;
|
|
4
4
|
}({});
|
|
5
5
|
//#endregion
|
|
6
6
|
export { e as NodeInvokeRunStatusE };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
//#region src/capabilities/remote-file/errors.ts
|
|
2
|
+
var e = class extends Error {
|
|
3
|
+
kind;
|
|
4
|
+
retryable;
|
|
5
|
+
meta;
|
|
6
|
+
constructor(e, t, n) {
|
|
7
|
+
super(t, n), this.name = "RemoteFileCapabilityError", this.kind = e, this.retryable = n?.retryable ?? e === "rate_limited", this.meta = n?.meta ?? {};
|
|
8
|
+
}
|
|
9
|
+
toRemoteFileError() {
|
|
10
|
+
return {
|
|
11
|
+
kind: this.kind,
|
|
12
|
+
message: this.message,
|
|
13
|
+
retryable: this.retryable,
|
|
14
|
+
meta: this.meta
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
function t(e) {
|
|
19
|
+
return e instanceof Error ? e.name === "AbortError" || /aborted/i.test(e.message) : !1;
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
export { e as RemoteFileCapabilityError, t as isAbortError };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { HttpError as e } from "../../apis/http-client.mjs";
|
|
2
|
+
import { RemoteFileCapabilityError as t, isAbortError as n } from "./errors.mjs";
|
|
3
|
+
//#region src/capabilities/remote-file/normalize.ts
|
|
4
|
+
function r(r) {
|
|
5
|
+
if (n(r)) return new t("network", "已取消本次传输", { cause: r });
|
|
6
|
+
if (r instanceof e) {
|
|
7
|
+
let e = typeof r.data == "string" ? r.data : JSON.stringify(r.data), n = e ? ` body=${e.slice(0, 200)}` : "";
|
|
8
|
+
return new t("business", `HTTP ${r.status}${n}`, { cause: r });
|
|
9
|
+
}
|
|
10
|
+
return new t("network", r instanceof Error ? r.message : String(r), { cause: r });
|
|
11
|
+
}
|
|
12
|
+
function i(t) {
|
|
13
|
+
if (t instanceof e) {
|
|
14
|
+
let e = typeof t.data == "string" ? t.data : JSON.stringify(t.data);
|
|
15
|
+
return {
|
|
16
|
+
httpStatus: t.status,
|
|
17
|
+
body: e ? e.slice(0, 200) : void 0
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
return { error: t instanceof Error ? t.message : String(t) };
|
|
21
|
+
}
|
|
22
|
+
function a(e) {
|
|
23
|
+
let n = e.data?.code ?? "", r = e.data?.cnMessage ?? "";
|
|
24
|
+
return n === "FUS-RATE_LIMIT_EXCEEDED" ? new t("rate_limited", "文件上传触发频率限制") : new t("business", r || `文件上传失败 (code: ${n})`);
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { i as errorLogMeta, r as normalizeNetworkError, a as normalizeUploadLinkError };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { clawLogger as e } from "../../utils/claw-logger.mjs";
|
|
2
|
+
import { getProxyUrl as t, shouldUseProxy as n } from "../../utils/proxy.mjs";
|
|
3
|
+
import { RemoteFileCapabilityError as r } from "./errors.mjs";
|
|
4
|
+
import { errorLogMeta as i, normalizeNetworkError as a } from "./normalize.mjs";
|
|
5
|
+
import { createReadStream as o } from "node:fs";
|
|
6
|
+
import { ProxyAgent as s, request as c } from "undici";
|
|
7
|
+
//#region src/capabilities/remote-file/obs-transfer.ts
|
|
8
|
+
var l = e("capabilities"), u;
|
|
9
|
+
function d() {
|
|
10
|
+
if (u) return u;
|
|
11
|
+
let e = t();
|
|
12
|
+
return e && (u = new s(e)), u;
|
|
13
|
+
}
|
|
14
|
+
async function f(e, s, u) {
|
|
15
|
+
let f = o(s);
|
|
16
|
+
try {
|
|
17
|
+
let i = await c(e, {
|
|
18
|
+
method: "PUT",
|
|
19
|
+
body: f,
|
|
20
|
+
headersTimeout: 3e4,
|
|
21
|
+
bodyTimeout: 3e5,
|
|
22
|
+
dispatcher: n(t()) ? d() : void 0,
|
|
23
|
+
...u ? { signal: u } : {}
|
|
24
|
+
});
|
|
25
|
+
if (await i.body.dump(), i.statusCode < 200 || i.statusCode >= 300) throw l.error("OBS upload failed: non success status", null, {
|
|
26
|
+
status: i.statusCode,
|
|
27
|
+
file: s
|
|
28
|
+
}), new r("obs", `OBS 上传失败 (status: ${i.statusCode})`, { meta: { statusCode: i.statusCode } });
|
|
29
|
+
} catch (e) {
|
|
30
|
+
throw e instanceof r ? e : (l.error("OBS upload request failed", e, {
|
|
31
|
+
file: s,
|
|
32
|
+
...i(e)
|
|
33
|
+
}), a(e));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async function p(e, o) {
|
|
37
|
+
try {
|
|
38
|
+
let i = await c(e, {
|
|
39
|
+
method: "GET",
|
|
40
|
+
headersTimeout: 3e4,
|
|
41
|
+
bodyTimeout: 3e5,
|
|
42
|
+
dispatcher: n(t()) ? d() : void 0,
|
|
43
|
+
...o ? { signal: o } : {}
|
|
44
|
+
});
|
|
45
|
+
if (i.statusCode < 200 || i.statusCode >= 300) throw await i.body.dump(), l.error("OBS download failed: non success status", null, { status: i.statusCode }), new r("obs", `OBS 下载失败 (status: ${i.statusCode})`, { meta: { statusCode: i.statusCode } });
|
|
46
|
+
return i;
|
|
47
|
+
} catch (e) {
|
|
48
|
+
throw e instanceof r ? e : (l.error("OBS download request failed", e, i(e)), a(e));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//#endregion
|
|
52
|
+
export { p as getFromObs, f as putToObs };
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { toErrorMessage as e } from "../../utils/error.mjs";
|
|
2
|
+
import { clawLogger as t } from "../../utils/claw-logger.mjs";
|
|
3
|
+
import { existsSync as n, readdirSync as r } from "node:fs";
|
|
4
|
+
import i from "node:path";
|
|
5
|
+
import a from "node:os";
|
|
6
|
+
import { canonicalPathFromExistingAncestor as o, resolveAbsolutePathForRead as s, resolveAbsolutePathForWrite as c, sanitizeUntrustedFileName as l } from "openclaw/plugin-sdk/security-runtime";
|
|
7
|
+
import { ensureAbsoluteDirectory as u } from "openclaw/plugin-sdk/infra-runtime";
|
|
8
|
+
//#region src/capabilities/remote-file/paths.ts
|
|
9
|
+
var d = t("capabilities");
|
|
10
|
+
function f(e) {
|
|
11
|
+
if (!e) throw Error("path is required");
|
|
12
|
+
if (e.includes("\0")) throw Error("path must not contain NUL bytes");
|
|
13
|
+
if (!i.isAbsolute(e)) throw Error("path must be absolute");
|
|
14
|
+
}
|
|
15
|
+
var p = i.join(a.homedir(), ".openclaw", "downloads");
|
|
16
|
+
async function m(t) {
|
|
17
|
+
try {
|
|
18
|
+
return f(t), { absolutePath: await o((await s(t)).path) };
|
|
19
|
+
} catch (n) {
|
|
20
|
+
return d.error("resolve read path failed", n, { localPath: t }), {
|
|
21
|
+
error: !0,
|
|
22
|
+
message: `文件不存在或不可读: ${e(n)}`
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async function h(e, t) {
|
|
27
|
+
let r = e && e.trim().length > 0 ? e : p, i;
|
|
28
|
+
try {
|
|
29
|
+
f(r), i = (await c(r)).path;
|
|
30
|
+
} catch {
|
|
31
|
+
return {
|
|
32
|
+
ok: !1,
|
|
33
|
+
message: "目标目录路径格式不正确"
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
if (t === !1) return n(i) ? {
|
|
37
|
+
ok: !0,
|
|
38
|
+
dir: i
|
|
39
|
+
} : {
|
|
40
|
+
ok: !1,
|
|
41
|
+
message: "目标目录不存在"
|
|
42
|
+
};
|
|
43
|
+
try {
|
|
44
|
+
let e = await u(i);
|
|
45
|
+
return e.ok ? {
|
|
46
|
+
ok: !0,
|
|
47
|
+
dir: e.path
|
|
48
|
+
} : {
|
|
49
|
+
ok: !1,
|
|
50
|
+
message: "目标端权限不足"
|
|
51
|
+
};
|
|
52
|
+
} catch {
|
|
53
|
+
return {
|
|
54
|
+
ok: !1,
|
|
55
|
+
message: "目标端权限不足"
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function g(e, t) {
|
|
60
|
+
let n = l(e, "download"), r = i.extname(n), a = r ? n.slice(0, -r.length) : n;
|
|
61
|
+
if (!t.has(n)) return n;
|
|
62
|
+
let o = 1;
|
|
63
|
+
for (; t.has(`${a} (${o})${r}`);) o++;
|
|
64
|
+
return `${a} (${o})${r}`;
|
|
65
|
+
}
|
|
66
|
+
function _(e) {
|
|
67
|
+
try {
|
|
68
|
+
return new Set(r(e));
|
|
69
|
+
} catch {
|
|
70
|
+
return /* @__PURE__ */ new Set();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//#endregion
|
|
74
|
+
export { p as DEFAULT_DOWNLOAD_DIR, g as nextAvailableName, h as prepareSaveDir, _ as readExistingNames, m as resolveReadPath };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
//#region src/capabilities/remote-file/progress.ts
|
|
2
|
+
var e = class {
|
|
3
|
+
taskType;
|
|
4
|
+
totalCount;
|
|
5
|
+
files = [];
|
|
6
|
+
constructor(e, t) {
|
|
7
|
+
this.taskType = e, this.totalCount = t;
|
|
8
|
+
}
|
|
9
|
+
start() {
|
|
10
|
+
return {
|
|
11
|
+
taskType: this.taskType,
|
|
12
|
+
currentFileIndex: 0,
|
|
13
|
+
totalCount: this.totalCount,
|
|
14
|
+
successCount: 0,
|
|
15
|
+
failCount: 0,
|
|
16
|
+
files: []
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
complete(e) {
|
|
20
|
+
return this.files.push(e), {
|
|
21
|
+
taskType: this.taskType,
|
|
22
|
+
currentFileIndex: this.files.length,
|
|
23
|
+
totalCount: this.totalCount,
|
|
24
|
+
successCount: this.files.filter((e) => e.status === "SUCCEEDED").length,
|
|
25
|
+
failCount: this.files.filter((e) => e.status === "FAILED").length,
|
|
26
|
+
files: [...this.files]
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
//#endregion
|
|
31
|
+
export { e as RemoteFileTaskProgress };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { clawLogger as e } from "../../utils/claw-logger.mjs";
|
|
2
|
+
import { HonorAccount as t } from "../../honor-auth/vault/impl.mjs";
|
|
3
|
+
import { isClawResponseOk as n } from "../../apis/helpers.mjs";
|
|
4
|
+
import { createClawCloudClient as r } from "../../apis/claw-cloud.mjs";
|
|
5
|
+
import { loadDeviceInfo as i } from "../../modules/device/device-info.mjs";
|
|
6
|
+
import "../../modules/device/index.mjs";
|
|
7
|
+
import "../../honor-auth/vault/index.mjs";
|
|
8
|
+
import "../../apis/index.mjs";
|
|
9
|
+
import { ToolError as a } from "../../tools/error.mjs";
|
|
10
|
+
import { errorLogMeta as o, normalizeNetworkError as s, normalizeUploadLinkError as c } from "./normalize.mjs";
|
|
11
|
+
//#region src/capabilities/remote-file/remote-file.ts
|
|
12
|
+
var l = e("capabilities");
|
|
13
|
+
async function u() {
|
|
14
|
+
let e = await t.fromUser().current();
|
|
15
|
+
if (!e?.token || !e.userId) throw l.error("remote file skipped: no current user"), new a("unauthorized", "missing current user token");
|
|
16
|
+
let n;
|
|
17
|
+
try {
|
|
18
|
+
n = await i();
|
|
19
|
+
} catch (e) {
|
|
20
|
+
throw l.error("remote file failed to get device info", e), new a("device_info", "failed to get device info", { cause: e });
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
deviceInfo: n,
|
|
24
|
+
token: e.token,
|
|
25
|
+
userId: e.userId
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
async function d(e, t) {
|
|
29
|
+
let { deviceInfo: i, token: d } = await u(), f = { token: d }, p;
|
|
30
|
+
try {
|
|
31
|
+
p = await r().getUploadLink(i, f, { fileList: e }, { signal: t });
|
|
32
|
+
} catch (t) {
|
|
33
|
+
throw t instanceof a ? t : (l.error("upload link request failed", t, {
|
|
34
|
+
fileCount: e.length,
|
|
35
|
+
...o(t)
|
|
36
|
+
}), s(t));
|
|
37
|
+
}
|
|
38
|
+
if (n(p)) {
|
|
39
|
+
let e = p.data.data;
|
|
40
|
+
return {
|
|
41
|
+
code: "OK",
|
|
42
|
+
fileCountLimit: e?.fileCountLimit,
|
|
43
|
+
fileSizeLimit: e?.fileSizeLimit,
|
|
44
|
+
linkList: Array.isArray(e?.linkList) ? e.linkList : []
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
let m = p.data?.code ?? "";
|
|
48
|
+
if (l.error("upload link response not ok", null, {
|
|
49
|
+
status: p.status,
|
|
50
|
+
code: m,
|
|
51
|
+
cnMessage: p.data?.cnMessage,
|
|
52
|
+
fileCount: e.length
|
|
53
|
+
}), m === "FUS-RATE_LIMIT_EXCEEDED") throw c(p);
|
|
54
|
+
return m === "YOYO_CLAW_100019" ? {
|
|
55
|
+
code: "COUNT_LIMIT",
|
|
56
|
+
fileCountLimit: p.data.data?.fileCountLimit,
|
|
57
|
+
fileSizeLimit: p.data.data?.fileSizeLimit,
|
|
58
|
+
linkList: [],
|
|
59
|
+
message: "文件数量超过上限"
|
|
60
|
+
} : m === "YOYO_CLAW_100016" ? {
|
|
61
|
+
code: "INTERNAL_ERROR",
|
|
62
|
+
linkList: [],
|
|
63
|
+
message: "文件上传失败"
|
|
64
|
+
} : {
|
|
65
|
+
code: "BUSINESS_ERROR",
|
|
66
|
+
linkList: [],
|
|
67
|
+
message: p.data?.cnMessage || `文件上传失败 (code: ${m})`
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//#endregion
|
|
71
|
+
export { d as getUploadLink };
|
package/dist/cli/env/impl.mjs
CHANGED
|
@@ -7,12 +7,12 @@ var a = {
|
|
|
7
7
|
manual: "manual config"
|
|
8
8
|
};
|
|
9
9
|
function o(o, s) {
|
|
10
|
-
s.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 (s) => e(o.runtime, async () => {
|
|
10
|
+
s.command("env").description("Manage runtime environment (dev/test/sit/auto/production)").option("--set <env>", "Set environment: dev, test, sit, auto or production").option("--gray <tag>", "Set gray header").option("--reset", "Reset env source to environment variable").action(async (s) => e(o.runtime, async () => {
|
|
11
11
|
let { set: e, gray: o, reset: c } = s;
|
|
12
12
|
try {
|
|
13
13
|
if (c && (await n(), console.log("✅ Environment source reset to environment variable")), e) {
|
|
14
|
-
if (e !== "test" && e !== "dev" && e !== "production") {
|
|
15
|
-
console.error("❌ Invalid environment. Use 'dev', 'test' or 'production'.");
|
|
14
|
+
if (e !== "test" && e !== "dev" && e !== "sit" && e !== "auto" && e !== "production") {
|
|
15
|
+
console.error("❌ Invalid environment. Use 'dev', 'test', 'sit', 'auto' or 'production'.");
|
|
16
16
|
return;
|
|
17
17
|
}
|
|
18
18
|
await r(e), console.log(`✅ Environment set to: ${e}`);
|
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
import { bindToolCallContext as e, releaseToolCallContext as t } from "../../messaging/trace/tool-context.mjs";
|
|
2
2
|
import { resolveTurnSessionBySessionKey as n } from "../../messaging/trace/lifecycle.mjs";
|
|
3
3
|
import "../../messaging/trace/index.mjs";
|
|
4
|
-
import { recordToolCallEnd as r, recordToolCallStart as i } from "../../messaging/dispatchers/stream/
|
|
4
|
+
import { recordToolCallEnd as r, recordToolCallStart as i } from "../../messaging/dispatchers/stream/emitters.mjs";
|
|
5
5
|
//#region src/core/hooks/tool-trace.ts
|
|
6
6
|
function a(a) {
|
|
7
7
|
a.on("before_tool_call", (t, r) => {
|
|
8
|
-
let a = t.toolCallId ?? r.toolCallId;
|
|
9
|
-
i({
|
|
8
|
+
let a = t.toolCallId ?? r.toolCallId, o = t.runId ?? r.runId;
|
|
9
|
+
if (i({
|
|
10
10
|
sessionKey: r.sessionKey,
|
|
11
11
|
toolName: t.toolName,
|
|
12
12
|
params: t.params,
|
|
13
13
|
toolCallId: a,
|
|
14
|
-
runId:
|
|
14
|
+
runId: o
|
|
15
|
+
}), !a) return;
|
|
16
|
+
let s = n(r.sessionKey), c = s && o ? s.runId === o : !1;
|
|
17
|
+
!c && !r.sessionKey || e(a, {
|
|
18
|
+
...c ? s : {},
|
|
19
|
+
...r.sessionKey ? { sessionKey: r.sessionKey } : {},
|
|
20
|
+
...o ? { runId: o } : {}
|
|
15
21
|
});
|
|
16
|
-
let o = n(r.sessionKey);
|
|
17
|
-
a && o && e(a, o);
|
|
18
22
|
}), a.on("after_tool_call", (e, n) => {
|
|
19
23
|
r({
|
|
20
24
|
sessionKey: n.sessionKey,
|
|
@@ -1,32 +1,29 @@
|
|
|
1
1
|
import { getPersistedIdentity as e } from "../../modules/configs/identity-persist.mjs";
|
|
2
|
-
import { createGatewayAuthMd5 as t, isSameGatewayAuthMd5 as n } from "../../gateway/client/auth/gateway-auth.mjs";
|
|
3
|
-
import "../../gateway/client/auth/index.mjs";
|
|
4
|
-
import { getGatewayAuthConfig as r } from "../../modules/configs/gateway.mjs";
|
|
5
2
|
import "../../modules/configs/index.mjs";
|
|
6
|
-
import { HonorAccount as
|
|
3
|
+
import { HonorAccount as t } from "../../honor-auth/vault/impl.mjs";
|
|
7
4
|
import "../../honor-auth/vault/index.mjs";
|
|
8
5
|
//#region src/diagnose/collectors/account.ts
|
|
9
|
-
async function
|
|
10
|
-
let
|
|
6
|
+
async function n(n, r, i) {
|
|
7
|
+
let a = new Set(n.enabledAccountIds), o = n.configuredAccountIds.map((e) => ({
|
|
11
8
|
accountId: e,
|
|
12
|
-
enabled:
|
|
13
|
-
})),
|
|
14
|
-
if (!
|
|
15
|
-
let
|
|
9
|
+
enabled: a.has(e)
|
|
10
|
+
})), s = await e(), c = s?.pluginVersionCode !== void 0, l = !!(c && !s?.gatewayAuthMd5 && s?.pluginVersionCode === i);
|
|
11
|
+
if (!r) return { accounts: o };
|
|
12
|
+
let u = await t.fromUser(r).getTokenStatus();
|
|
16
13
|
return {
|
|
17
|
-
accounts:
|
|
14
|
+
accounts: o,
|
|
18
15
|
selected: {
|
|
19
|
-
accountId:
|
|
16
|
+
accountId: r,
|
|
20
17
|
enabled: !0,
|
|
21
|
-
loggedIn:
|
|
22
|
-
token:
|
|
18
|
+
loggedIn: u.status !== "absent",
|
|
19
|
+
token: u,
|
|
23
20
|
registration: {
|
|
24
|
-
registered:
|
|
25
|
-
matchesCurrent:
|
|
26
|
-
...
|
|
21
|
+
registered: c,
|
|
22
|
+
matchesCurrent: l,
|
|
23
|
+
...s?.pluginVersionCode === void 0 ? {} : { pluginVersionCode: s.pluginVersionCode }
|
|
27
24
|
}
|
|
28
25
|
}
|
|
29
26
|
};
|
|
30
27
|
}
|
|
31
28
|
//#endregion
|
|
32
|
-
export {
|
|
29
|
+
export { n as collectAccount };
|