@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.
Files changed (148) 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 +186 -33
  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 +40 -17
  23. package/dist/messaging/dispatchers/stream/session.mjs +72 -51
  24. package/dist/messaging/send/text.mjs +8 -0
  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/dist/utils/stringify.mjs +14 -1
  45. package/openclaw.plugin.json +10 -3
  46. package/package.json +1 -1
  47. package/skills/yoyo-file-transfer/SKILL.md +143 -0
  48. package/skills/yoyo-file-transfer/references/pc-to-phone.md +148 -0
  49. package/skills/yoyo-file-transfer/references/phone-to-pc.md +157 -0
  50. package/skills/yoyo-phone-control/SKILL.md +12 -220
  51. package/skills/yoyo-phone-control/mcptools/adjust_brightness.json +84 -0
  52. package/skills/yoyo-phone-control/mcptools/airplane_mode.json +1 -1
  53. package/skills/yoyo-phone-control/mcptools/battery.json +1 -1
  54. package/skills/yoyo-phone-control/mcptools/bluetooth.json +1 -1
  55. package/skills/yoyo-phone-control/mcptools/call.json +1 -1
  56. package/skills/yoyo-phone-control/mcptools/camera.json +1 -4
  57. package/skills/yoyo-phone-control/mcptools/cancel_countdown_timer.json +1 -1
  58. package/skills/yoyo-phone-control/mcptools/cancel_countup_timer.json +9 -15
  59. package/skills/yoyo-phone-control/mcptools/capture_screenshot.json +7 -50
  60. package/skills/yoyo-phone-control/mcptools/check_alarm.json +2 -26
  61. package/skills/yoyo-phone-control/mcptools/check_countdown_timer.json +1 -1
  62. package/skills/yoyo-phone-control/mcptools/check_countup_timer.json +9 -15
  63. package/skills/yoyo-phone-control/mcptools/check_schedule.json +17 -14
  64. package/skills/yoyo-phone-control/mcptools/check_todo.json +11 -12
  65. package/skills/yoyo-phone-control/mcptools/clean_dirty.json +1 -1
  66. package/skills/yoyo-phone-control/mcptools/close_alarm.json +1 -1
  67. package/skills/yoyo-phone-control/mcptools/close_app.json +1 -1
  68. package/skills/yoyo-phone-control/mcptools/close_countdown_timer.json +1 -1
  69. package/skills/yoyo-phone-control/mcptools/close_countup_timer.json +8 -10
  70. package/skills/yoyo-phone-control/mcptools/close_ring.json +3 -5
  71. package/skills/yoyo-phone-control/mcptools/close_schedule.json +3 -5
  72. package/skills/yoyo-phone-control/mcptools/configure_auto_record.json +66 -0
  73. package/skills/yoyo-phone-control/mcptools/create_alarm.json +1 -1
  74. package/skills/yoyo-phone-control/mcptools/create_countdown_timer.json +1 -1
  75. package/skills/yoyo-phone-control/mcptools/create_countup_timer.json +8 -10
  76. package/skills/yoyo-phone-control/mcptools/create_schedule.json +29 -5
  77. package/skills/yoyo-phone-control/mcptools/create_todo.json +21 -5
  78. package/skills/yoyo-phone-control/mcptools/dark_mode.json +1 -1
  79. package/skills/yoyo-phone-control/mcptools/delay_ring.json +3 -4
  80. package/skills/yoyo-phone-control/mcptools/delete_alarm.json +1 -1
  81. package/skills/yoyo-phone-control/mcptools/delete_schedule.json +14 -2
  82. package/skills/yoyo-phone-control/mcptools/delete_todo.json +91 -7
  83. package/skills/yoyo-phone-control/mcptools/express_logistics_query.json +1 -1
  84. package/skills/yoyo-phone-control/mcptools/eyecomfort.json +2 -2
  85. package/skills/yoyo-phone-control/mcptools/flashlight.json +1 -1
  86. package/skills/yoyo-phone-control/mcptools/get_user_location.json +1 -1
  87. package/skills/yoyo-phone-control/mcptools/gui_task_create.json +116 -0
  88. package/skills/yoyo-phone-control/mcptools/gui_task_pause.json +1 -1
  89. package/skills/yoyo-phone-control/mcptools/gui_task_terminate.json +70 -0
  90. package/skills/yoyo-phone-control/mcptools/hotspot.json +1 -1
  91. package/skills/yoyo-phone-control/mcptools/hover_button.json +1 -1
  92. package/skills/yoyo-phone-control/mcptools/jump_video_progress.json +55 -0
  93. package/skills/yoyo-phone-control/mcptools/location_service.json +2 -2
  94. package/skills/yoyo-phone-control/mcptools/mobile_data.json +6 -15
  95. package/skills/yoyo-phone-control/mcptools/modify_alarm.json +31 -9
  96. package/skills/yoyo-phone-control/mcptools/modify_schedule.json +33 -8
  97. package/skills/yoyo-phone-control/mcptools/modify_todo.json +94 -6
  98. package/skills/yoyo-phone-control/mcptools/multi_screen.json +169 -0
  99. package/skills/yoyo-phone-control/mcptools/musicFeedbackAction.json +1 -1
  100. package/skills/yoyo-phone-control/mcptools/navigation_service.json +50 -14
  101. package/skills/yoyo-phone-control/mcptools/nfc.json +2 -2
  102. package/skills/yoyo-phone-control/mcptools/no_disturb.json +1 -1
  103. package/skills/yoyo-phone-control/mcptools/onehanded_mode.json +1 -1
  104. package/skills/yoyo-phone-control/mcptools/open_alarm.json +1 -1
  105. package/skills/yoyo-phone-control/mcptools/open_app.json +1 -1
  106. package/skills/yoyo-phone-control/mcptools/open_transport_code.json +1 -1
  107. package/skills/yoyo-phone-control/mcptools/operateMusic.json +1 -1
  108. package/skills/yoyo-phone-control/mcptools/operateVideo.json +2 -2
  109. package/skills/yoyo-phone-control/mcptools/operate_audio.json +64 -0
  110. package/skills/yoyo-phone-control/mcptools/pause_countdown_timer.json +1 -1
  111. package/skills/yoyo-phone-control/mcptools/pause_countup_timer.json +9 -15
  112. package/skills/yoyo-phone-control/mcptools/phone_service.json +83 -0
  113. package/skills/yoyo-phone-control/mcptools/playMusic.json +1 -1
  114. package/skills/yoyo-phone-control/mcptools/playVideo.json +1 -1
  115. package/skills/yoyo-phone-control/mcptools/play_audio.json +66 -0
  116. package/skills/yoyo-phone-control/mcptools/quiet_mode.json +2 -2
  117. package/skills/yoyo-phone-control/mcptools/record.json +1 -1
  118. package/skills/yoyo-phone-control/mcptools/redial_recall.json +7 -14
  119. package/skills/yoyo-phone-control/mcptools/restart_countdown_timer.json +1 -1
  120. package/skills/yoyo-phone-control/mcptools/restart_countup_timer.json +9 -7
  121. package/skills/yoyo-phone-control/mcptools/resume_countdown_timer.json +1 -1
  122. package/skills/yoyo-phone-control/mcptools/resume_countup_timer.json +9 -19
  123. package/skills/yoyo-phone-control/mcptools/ringing_mode.json +2 -2
  124. package/skills/yoyo-phone-control/mcptools/scan_code.json +1 -1
  125. package/skills/yoyo-phone-control/mcptools/search_call_record.json +80 -0
  126. package/skills/yoyo-phone-control/mcptools/search_contact.json +1 -1
  127. package/skills/yoyo-phone-control/mcptools/search_message.json +1 -1
  128. package/skills/yoyo-phone-control/mcptools/send_message.json +1 -1
  129. package/skills/yoyo-phone-control/mcptools/setMusicPlayMode.json +1 -1
  130. package/skills/yoyo-phone-control/mcptools/set_auto_record.json +53 -0
  131. package/skills/yoyo-phone-control/mcptools/set_specified_number_auto_record.json +77 -0
  132. package/skills/yoyo-phone-control/mcptools/set_video_clarity.json +63 -0
  133. package/skills/yoyo-phone-control/mcptools/set_video_play_mode.json +46 -0
  134. package/skills/yoyo-phone-control/mcptools/set_video_playback_speed.json +42 -0
  135. package/skills/yoyo-phone-control/mcptools/simple_mode.json +3 -4
  136. package/skills/yoyo-phone-control/mcptools/sound_and_vibration.json +71 -0
  137. package/skills/yoyo-phone-control/mcptools/status_bar_show.json +1 -1
  138. package/skills/yoyo-phone-control/mcptools/switchMusic.json +1 -1
  139. package/skills/yoyo-phone-control/mcptools/switch_audio.json +50 -0
  140. package/skills/yoyo-phone-control/mcptools/switch_video.json +60 -0
  141. package/skills/yoyo-phone-control/mcptools/toggle_auto_brightness.json +58 -0
  142. package/skills/yoyo-phone-control/mcptools/uninstall_app.json +1 -1
  143. package/skills/yoyo-phone-control/mcptools/usb_shared_network.json +4 -3
  144. package/skills/yoyo-phone-control/mcptools/wlan.json +1 -1
  145. package/skills/yoyo-phone-control/references/local-user-file-search.md +7 -0
  146. package/dist/gateway/client/auth/gateway-auth.mjs +0 -16
  147. package/dist/messaging/dispatchers/stream/hooks.mjs +0 -48
  148. 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";