@honor-claw/yoyo 2026.7.1 → 2026.9.2-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/dist/apis/claw-cloud.mjs +20 -9
  2. package/dist/apis/helpers.mjs +4 -1
  3. package/dist/apis/hosts.mjs +9 -12
  4. package/dist/apis/http-client.mjs +5 -6
  5. package/dist/capabilities/node/invoke.mjs +2 -2
  6. package/dist/capabilities/node/types.mjs +1 -1
  7. package/dist/capabilities/remote-file/errors.mjs +22 -0
  8. package/dist/capabilities/remote-file/index.mjs +5 -0
  9. package/dist/capabilities/remote-file/normalize.mjs +27 -0
  10. package/dist/capabilities/remote-file/obs-transfer.mjs +52 -0
  11. package/dist/capabilities/remote-file/paths.mjs +74 -0
  12. package/dist/capabilities/remote-file/progress.mjs +31 -0
  13. package/dist/capabilities/remote-file/remote-file.mjs +71 -0
  14. package/dist/cli/env/impl.mjs +3 -3
  15. package/dist/cloud-channel/handlers/context/handler.mjs +6 -3
  16. package/dist/core/hooks/tool-trace.mjs +10 -6
  17. package/dist/diagnose/collectors/account.mjs +15 -18
  18. package/dist/gateway/client/auth/index.mjs +0 -1
  19. package/dist/messaging/dispatchers/stream/controller.mjs +91 -27
  20. package/dist/messaging/dispatchers/stream/emitters.mjs +62 -0
  21. package/dist/messaging/dispatchers/stream/index.mjs +1 -1
  22. package/dist/messaging/dispatchers/stream/resolvers.mjs +27 -16
  23. package/dist/messaging/dispatchers/stream/session.mjs +20 -7
  24. package/dist/messaging/send/text.mjs +8 -2
  25. package/dist/messaging/target/outbound.mjs +13 -13
  26. package/dist/messaging/trace/lifecycle.mjs +16 -3
  27. package/dist/messaging/trace/tool-context.mjs +30 -17
  28. package/dist/modules/configs/plugin-init.mjs +3 -1
  29. package/dist/provisioning/registration/register.mjs +34 -39
  30. package/dist/schemas.mjs +4 -0
  31. package/dist/tools/index.mjs +7 -3
  32. package/dist/tools/node-invoke/status-mapper.mjs +14 -10
  33. package/dist/tools/node-invoke/task-result-query.mjs +22 -0
  34. package/dist/tools/node-invoke/tool.mjs +19 -18
  35. package/dist/tools/remote-file-download/helpers.mjs +30 -0
  36. package/dist/tools/remote-file-download/index.mjs +1 -0
  37. package/dist/tools/remote-file-download/run.mjs +137 -0
  38. package/dist/tools/remote-file-download/tool.mjs +37 -0
  39. package/dist/tools/remote-file-upload/helpers.mjs +67 -0
  40. package/dist/tools/remote-file-upload/index.mjs +1 -0
  41. package/dist/tools/remote-file-upload/run.mjs +278 -0
  42. package/dist/tools/remote-file-upload/tool.mjs +23 -0
  43. package/dist/utils/env.mjs +2 -0
  44. package/openclaw.plugin.json +10 -3
  45. package/package.json +1 -1
  46. package/skills/yoyo-file-transfer/SKILL.md +143 -0
  47. package/skills/yoyo-file-transfer/references/pc-to-phone.md +148 -0
  48. package/skills/yoyo-file-transfer/references/phone-to-pc.md +157 -0
  49. package/skills/yoyo-phone-control/SKILL.md +174 -74
  50. package/skills/yoyo-phone-control/mcptools/adjust_brightness.json +84 -0
  51. package/skills/yoyo-phone-control/mcptools/airplane_mode.json +1 -1
  52. package/skills/yoyo-phone-control/mcptools/battery.json +1 -1
  53. package/skills/yoyo-phone-control/mcptools/bluetooth.json +1 -1
  54. package/skills/yoyo-phone-control/mcptools/call.json +1 -1
  55. package/skills/yoyo-phone-control/mcptools/camera.json +1 -4
  56. package/skills/yoyo-phone-control/mcptools/cancel_countdown_timer.json +1 -1
  57. package/skills/yoyo-phone-control/mcptools/cancel_countup_timer.json +9 -15
  58. package/skills/yoyo-phone-control/mcptools/capture_screenshot.json +7 -50
  59. package/skills/yoyo-phone-control/mcptools/check_alarm.json +2 -26
  60. package/skills/yoyo-phone-control/mcptools/check_countdown_timer.json +1 -1
  61. package/skills/yoyo-phone-control/mcptools/check_countup_timer.json +9 -15
  62. package/skills/yoyo-phone-control/mcptools/check_schedule.json +17 -14
  63. package/skills/yoyo-phone-control/mcptools/check_todo.json +11 -12
  64. package/skills/yoyo-phone-control/mcptools/clean_dirty.json +1 -1
  65. package/skills/yoyo-phone-control/mcptools/close_alarm.json +1 -1
  66. package/skills/yoyo-phone-control/mcptools/close_app.json +1 -1
  67. package/skills/yoyo-phone-control/mcptools/close_countdown_timer.json +1 -1
  68. package/skills/yoyo-phone-control/mcptools/close_countup_timer.json +8 -10
  69. package/skills/yoyo-phone-control/mcptools/close_ring.json +3 -5
  70. package/skills/yoyo-phone-control/mcptools/close_schedule.json +3 -5
  71. package/skills/yoyo-phone-control/mcptools/configure_auto_record.json +66 -0
  72. package/skills/yoyo-phone-control/mcptools/create_alarm.json +1 -1
  73. package/skills/yoyo-phone-control/mcptools/create_countdown_timer.json +1 -1
  74. package/skills/yoyo-phone-control/mcptools/create_countup_timer.json +8 -10
  75. package/skills/yoyo-phone-control/mcptools/create_schedule.json +26 -2
  76. package/skills/yoyo-phone-control/mcptools/create_todo.json +21 -5
  77. package/skills/yoyo-phone-control/mcptools/dark_mode.json +1 -1
  78. package/skills/yoyo-phone-control/mcptools/delay_ring.json +3 -4
  79. package/skills/yoyo-phone-control/mcptools/delete_alarm.json +1 -1
  80. package/skills/yoyo-phone-control/mcptools/delete_schedule.json +14 -2
  81. package/skills/yoyo-phone-control/mcptools/delete_todo.json +91 -7
  82. package/skills/yoyo-phone-control/mcptools/express_logistics_query.json +1 -1
  83. package/skills/yoyo-phone-control/mcptools/eyecomfort.json +2 -2
  84. package/skills/yoyo-phone-control/mcptools/flashlight.json +1 -1
  85. package/skills/yoyo-phone-control/mcptools/get_user_location.json +1 -1
  86. package/skills/yoyo-phone-control/mcptools/gui_task_create.json +116 -0
  87. package/skills/yoyo-phone-control/mcptools/gui_task_pause.json +1 -1
  88. package/skills/yoyo-phone-control/mcptools/gui_task_terminate.json +70 -0
  89. package/skills/yoyo-phone-control/mcptools/hotspot.json +1 -1
  90. package/skills/yoyo-phone-control/mcptools/hover_button.json +1 -1
  91. package/skills/yoyo-phone-control/mcptools/jump_video_progress.json +55 -0
  92. package/skills/yoyo-phone-control/mcptools/location_service.json +2 -2
  93. package/skills/yoyo-phone-control/mcptools/mobile_data.json +6 -15
  94. package/skills/yoyo-phone-control/mcptools/modify_alarm.json +31 -9
  95. package/skills/yoyo-phone-control/mcptools/modify_schedule.json +25 -8
  96. package/skills/yoyo-phone-control/mcptools/modify_todo.json +94 -6
  97. package/skills/yoyo-phone-control/mcptools/multi_screen.json +169 -0
  98. package/skills/yoyo-phone-control/mcptools/musicFeedbackAction.json +1 -1
  99. package/skills/yoyo-phone-control/mcptools/navigation_service.json +50 -14
  100. package/skills/yoyo-phone-control/mcptools/nfc.json +2 -2
  101. package/skills/yoyo-phone-control/mcptools/no_disturb.json +1 -1
  102. package/skills/yoyo-phone-control/mcptools/onehanded_mode.json +1 -1
  103. package/skills/yoyo-phone-control/mcptools/open_alarm.json +1 -1
  104. package/skills/yoyo-phone-control/mcptools/open_app.json +1 -1
  105. package/skills/yoyo-phone-control/mcptools/open_transport_code.json +1 -1
  106. package/skills/yoyo-phone-control/mcptools/operateMusic.json +1 -1
  107. package/skills/yoyo-phone-control/mcptools/operateVideo.json +2 -2
  108. package/skills/yoyo-phone-control/mcptools/operate_audio.json +64 -0
  109. package/skills/yoyo-phone-control/mcptools/pause_countdown_timer.json +1 -1
  110. package/skills/yoyo-phone-control/mcptools/pause_countup_timer.json +9 -15
  111. package/skills/yoyo-phone-control/mcptools/phone_service.json +83 -0
  112. package/skills/yoyo-phone-control/mcptools/playMusic.json +1 -1
  113. package/skills/yoyo-phone-control/mcptools/playVideo.json +1 -1
  114. package/skills/yoyo-phone-control/mcptools/play_audio.json +66 -0
  115. package/skills/yoyo-phone-control/mcptools/quiet_mode.json +2 -2
  116. package/skills/yoyo-phone-control/mcptools/record.json +1 -1
  117. package/skills/yoyo-phone-control/mcptools/redial_recall.json +7 -14
  118. package/skills/yoyo-phone-control/mcptools/restart_countdown_timer.json +1 -1
  119. package/skills/yoyo-phone-control/mcptools/restart_countup_timer.json +9 -7
  120. package/skills/yoyo-phone-control/mcptools/resume_countdown_timer.json +1 -1
  121. package/skills/yoyo-phone-control/mcptools/resume_countup_timer.json +9 -19
  122. package/skills/yoyo-phone-control/mcptools/ringing_mode.json +2 -2
  123. package/skills/yoyo-phone-control/mcptools/scan_code.json +1 -1
  124. package/skills/yoyo-phone-control/mcptools/search_call_record.json +80 -0
  125. package/skills/yoyo-phone-control/mcptools/search_contact.json +1 -1
  126. package/skills/yoyo-phone-control/mcptools/search_message.json +1 -1
  127. package/skills/yoyo-phone-control/mcptools/send_message.json +1 -1
  128. package/skills/yoyo-phone-control/mcptools/setMusicPlayMode.json +1 -1
  129. package/skills/yoyo-phone-control/mcptools/set_auto_record.json +53 -0
  130. package/skills/yoyo-phone-control/mcptools/set_specified_number_auto_record.json +77 -0
  131. package/skills/yoyo-phone-control/mcptools/set_video_clarity.json +63 -0
  132. package/skills/yoyo-phone-control/mcptools/set_video_play_mode.json +46 -0
  133. package/skills/yoyo-phone-control/mcptools/set_video_playback_speed.json +42 -0
  134. package/skills/yoyo-phone-control/mcptools/simple_mode.json +3 -4
  135. package/skills/yoyo-phone-control/mcptools/sound_and_vibration.json +71 -0
  136. package/skills/yoyo-phone-control/mcptools/status_bar_show.json +1 -1
  137. package/skills/yoyo-phone-control/mcptools/switchMusic.json +1 -1
  138. package/skills/yoyo-phone-control/mcptools/switch_audio.json +50 -0
  139. package/skills/yoyo-phone-control/mcptools/switch_video.json +60 -0
  140. package/skills/yoyo-phone-control/mcptools/toggle_auto_brightness.json +58 -0
  141. package/skills/yoyo-phone-control/mcptools/uninstall_app.json +1 -1
  142. package/skills/yoyo-phone-control/mcptools/usb_shared_network.json +4 -3
  143. package/skills/yoyo-phone-control/mcptools/wlan.json +1 -1
  144. package/skills/yoyo-phone-control/references/local-user-file-search.md +7 -0
  145. package/dist/gateway/client/auth/gateway-auth.mjs +0 -16
  146. package/dist/messaging/dispatchers/stream/hooks.mjs +0 -48
  147. package/dist/utils/hash.mjs +0 -10
@@ -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, i) {
14
- let a = {
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
- }, o = {
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: a,
33
- body: o
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",
@@ -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 };
@@ -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
- clawCloud: "omni-pre-drcn.hiboard.hihonorcloud.com",
16
- ics: "api-agd-test-drcn.hiboard.hihonorcloud.com"
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: p,
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 { getToolCallContext as i } from "../../messaging/trace/tool-context.mjs";
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) ?? void 0, o = {
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,5 @@
1
+ import "./errors.mjs";
2
+ import "./remote-file.mjs";
3
+ import "./obs-transfer.mjs";
4
+ import "./paths.mjs";
5
+ import "./progress.mjs";
@@ -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 };
@@ -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}`);
@@ -47,9 +47,12 @@ async function p(e, t) {
47
47
  });
48
48
  return {
49
49
  ok: !0,
50
- data: {
51
- provider: o.provider,
52
- model: o.model
50
+ responsePayload: {
51
+ ok: !0,
52
+ resolved: {
53
+ provider: o.provider,
54
+ id: o.model
55
+ }
53
56
  }
54
57
  };
55
58
  }
@@ -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/hooks.mjs";
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: t.runId ?? r.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 i } from "../../honor-auth/vault/impl.mjs";
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 a(a, o, s) {
10
- let c = new Set(a.enabledAccountIds), l = a.configuredAccountIds.map((e) => ({
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: c.has(e)
13
- })), u = await e(), d = t(r()), f = !!(u?.gatewayAuthMd5 && u.pluginVersionCode !== void 0), p = !!(f && n(u?.gatewayAuthMd5, d) && u?.pluginVersionCode === s);
14
- if (!o) return { accounts: l };
15
- let m = await i.fromUser(o).getTokenStatus();
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: l,
14
+ accounts: o,
18
15
  selected: {
19
- accountId: o,
16
+ accountId: r,
20
17
  enabled: !0,
21
- loggedIn: m.status !== "absent",
22
- token: m,
18
+ loggedIn: u.status !== "absent",
19
+ token: u,
23
20
  registration: {
24
- registered: f,
25
- matchesCurrent: p,
26
- ...u?.pluginVersionCode === void 0 ? {} : { pluginVersionCode: u.pluginVersionCode }
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 { a as collectAccount };
29
+ export { n as collectAccount };
@@ -1,3 +1,2 @@
1
1
  import "./payload.mjs";
2
2
  import "./credential-builder.mjs";
3
- import "./gateway-auth.mjs";