@honor-claw/yoyo 1.4.0-beta.2 → 1.4.1-alpha.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.
- package/dist/apis/claw-cloud.mjs +36 -32
- package/dist/modules/configs/identity-persist.mjs +1 -1
- package/dist/modules/device/identity.mjs +3 -6
- package/dist/modules/device/index.mjs +1 -1
- package/dist/modules/device/registry.mjs +29 -18
- package/dist/services/connection/impl.mjs +1 -1
- package/dist/utils/version.mjs +14 -4
- package/package.json +2 -3
- package/skills/yoyo-control/SKILL.md +2 -59
- package/skills/yoyo-update/SKILL.md +166 -0
package/dist/apis/claw-cloud.mjs
CHANGED
|
@@ -1,44 +1,48 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { getYoyoPluginVersionCode as e } from "../utils/version.mjs";
|
|
2
|
+
import { uuid as t } from "../utils/id.mjs";
|
|
3
|
+
import { isOKResponse as n } from "./helpers.mjs";
|
|
4
|
+
import { takeApiHost as r } from "./hosts.mjs";
|
|
5
|
+
import { HttpClient as i } from "./http-client.mjs";
|
|
5
6
|
//#region src/apis/claw-cloud.ts
|
|
6
|
-
var
|
|
7
|
+
var a = class {
|
|
7
8
|
httpClient;
|
|
8
9
|
constructor(e, t) {
|
|
9
|
-
this.httpClient = new
|
|
10
|
+
this.httpClient = new i(e, t);
|
|
10
11
|
}
|
|
11
|
-
async registerDevice(
|
|
12
|
-
let
|
|
13
|
-
"x-trace-id":
|
|
14
|
-
"x-jwt-token":
|
|
15
|
-
"x-device-id":
|
|
16
|
-
},
|
|
12
|
+
async registerDevice(n, r, i) {
|
|
13
|
+
let a = {
|
|
14
|
+
"x-trace-id": t(),
|
|
15
|
+
"x-jwt-token": r.token,
|
|
16
|
+
"x-device-id": n.deviceId
|
|
17
|
+
}, o = {
|
|
17
18
|
businessTag: "YOYO_CLAW",
|
|
18
19
|
role: "yoyoclaw",
|
|
19
20
|
deviceInfo: {
|
|
20
|
-
...
|
|
21
|
-
manufacture:
|
|
22
|
-
brand:
|
|
23
|
-
bizExtInfo:
|
|
21
|
+
...n,
|
|
22
|
+
manufacture: n.manufacture,
|
|
23
|
+
brand: n.brand,
|
|
24
|
+
bizExtInfo: {
|
|
25
|
+
...i,
|
|
26
|
+
pluginVersionCode: e()
|
|
27
|
+
}
|
|
24
28
|
}
|
|
25
29
|
};
|
|
26
30
|
return this.httpClient.post("/v1/device/registry", {
|
|
27
|
-
headers:
|
|
28
|
-
body:
|
|
31
|
+
headers: a,
|
|
32
|
+
body: o
|
|
29
33
|
});
|
|
30
34
|
}
|
|
31
|
-
async logoutDevice(
|
|
35
|
+
async logoutDevice(e, n) {
|
|
32
36
|
let r = {
|
|
33
|
-
"x-trace-id":
|
|
37
|
+
"x-trace-id": t(),
|
|
34
38
|
"x-jwt-token": n.token,
|
|
35
|
-
"x-device-id":
|
|
39
|
+
"x-device-id": e.deviceId
|
|
36
40
|
}, i = {
|
|
37
41
|
businessTag: "YOYO_CLAW",
|
|
38
42
|
deviceInfo: {
|
|
39
|
-
...
|
|
40
|
-
manufacture:
|
|
41
|
-
brand:
|
|
43
|
+
...e,
|
|
44
|
+
manufacture: e.manufacture,
|
|
45
|
+
brand: e.brand
|
|
42
46
|
}
|
|
43
47
|
};
|
|
44
48
|
return this.httpClient.post("/v1/user/logout", {
|
|
@@ -46,10 +50,10 @@ var i = class {
|
|
|
46
50
|
body: i
|
|
47
51
|
});
|
|
48
52
|
}
|
|
49
|
-
async exchangeToken(
|
|
50
|
-
let i =
|
|
53
|
+
async exchangeToken(e, r) {
|
|
54
|
+
let i = t(), a = {
|
|
51
55
|
"Content-Type": "application/json",
|
|
52
|
-
"x-device-id":
|
|
56
|
+
"x-device-id": e.deviceId,
|
|
53
57
|
"x-trace-id": i
|
|
54
58
|
}, o = {};
|
|
55
59
|
"userId" in r ? a["x-agw-userId"] = r.userId : o = {
|
|
@@ -62,13 +66,13 @@ var i = class {
|
|
|
62
66
|
headers: a,
|
|
63
67
|
timeout: 15e3
|
|
64
68
|
});
|
|
65
|
-
if (
|
|
69
|
+
if (n(s) && s.data.data) return s.data.data;
|
|
66
70
|
throw Error(`failed to get token: ${JSON.stringify(s.data)}, traceId: ${i}`);
|
|
67
71
|
}
|
|
68
72
|
};
|
|
69
|
-
function
|
|
70
|
-
let e =
|
|
71
|
-
return new
|
|
73
|
+
function o() {
|
|
74
|
+
let e = r();
|
|
75
|
+
return new a(`https://${e.clawCloud}/aicloud/yoyo-claw-service`, e.grayTag ? { defaultHeaders: { "x-gray": e.grayTag } } : void 0);
|
|
72
76
|
}
|
|
73
77
|
//#endregion
|
|
74
|
-
export {
|
|
78
|
+
export { a as ClawCloudClient, o as createClawCloudClient };
|
|
@@ -36,7 +36,7 @@ async function f(t) {
|
|
|
36
36
|
...o,
|
|
37
37
|
version: o?.version || a.NEW
|
|
38
38
|
};
|
|
39
|
-
return t.legacyDeviceId && (s.legacyDeviceId = t.legacyDeviceId), t.deviceId && (s.deviceId = t.deviceId, s.publicKeyPem = t.publicKeyPem, s.privateKeyPem = t.privateKeyPem, s.createdAtMs = t.createdAtMs), t.version && (s.version = t.version), "gatewayAuthMd5" in t && (s.gatewayAuthMd5 = t.gatewayAuthMd5), await n({
|
|
39
|
+
return t.legacyDeviceId && (s.legacyDeviceId = t.legacyDeviceId), t.deviceId && (s.deviceId = t.deviceId, s.publicKeyPem = t.publicKeyPem, s.privateKeyPem = t.privateKeyPem, s.createdAtMs = t.createdAtMs), t.version && (s.version = t.version), "gatewayAuthMd5" in t && (s.gatewayAuthMd5 = t.gatewayAuthMd5), "pluginVersionCode" in t && (s.pluginVersionCode = t.pluginVersionCode), await n({
|
|
40
40
|
rootDir: i,
|
|
41
41
|
relativePath: l(),
|
|
42
42
|
data: JSON.stringify(s, null, 2),
|
|
@@ -49,15 +49,12 @@ async function c() {
|
|
|
49
49
|
let r = await s();
|
|
50
50
|
return await t(r), r;
|
|
51
51
|
}
|
|
52
|
-
|
|
53
|
-
return (await e())?.gatewayAuthMd5;
|
|
54
|
-
}
|
|
55
|
-
function u(e, t) {
|
|
52
|
+
function l(e, t) {
|
|
56
53
|
let r = n.createPrivateKey(e);
|
|
57
54
|
return i(n.sign(null, Buffer.from(t, "utf8"), r));
|
|
58
55
|
}
|
|
59
|
-
function
|
|
56
|
+
function u(e) {
|
|
60
57
|
return i(a(e));
|
|
61
58
|
}
|
|
62
59
|
//#endregion
|
|
63
|
-
export { c as loadOrCreateDeviceIdentity,
|
|
60
|
+
export { c as loadOrCreateDeviceIdentity, u as publicKeyRawBase64UrlFromPem, l as signDevicePayload };
|
|
@@ -1,26 +1,37 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { getYoyoPluginVersionCode as e } from "../../utils/version.mjs";
|
|
2
|
+
import { useClawLogger as t } from "../../utils/logger.mjs";
|
|
3
|
+
import { getConfigManager as n } from "../configs/config-manager.mjs";
|
|
4
|
+
import { isOKResponse as r } from "../../apis/helpers.mjs";
|
|
5
|
+
import { createClawCloudClient as i } from "../../apis/claw-cloud.mjs";
|
|
6
|
+
import { getPersistedIdentity as a, updatePersistedIdentity as o } from "../configs/identity-persist.mjs";
|
|
6
7
|
import "../configs/index.mjs";
|
|
7
8
|
import "../../apis/index.mjs";
|
|
8
|
-
import { formatHashForLog as
|
|
9
|
-
import { createGatewayAuthMd5 as
|
|
10
|
-
import { loadPersistedGatewayAuthMd5 as c } from "./identity.mjs";
|
|
9
|
+
import { formatHashForLog as s } from "../../utils/hash.mjs";
|
|
10
|
+
import { createGatewayAuthMd5 as c, isSameGatewayAuthMd5 as l } from "./gateway-auth.mjs";
|
|
11
11
|
//#region src/modules/device/registry.ts
|
|
12
|
-
async function
|
|
13
|
-
if (!
|
|
14
|
-
let
|
|
15
|
-
if (!
|
|
12
|
+
async function u(t, a) {
|
|
13
|
+
if (!t || !a) throw Error("设备信息或用户信息缺失");
|
|
14
|
+
let o = n().getGatewayAuthConfig(), s = c(o), l = e(), u = await i().registerDevice(t, a, o);
|
|
15
|
+
if (!r(u)) throw Error(`注册失败:${u.data?.cnMessage}`);
|
|
16
|
+
await f(s, l);
|
|
16
17
|
}
|
|
17
|
-
async function
|
|
18
|
-
let
|
|
19
|
-
if (
|
|
20
|
-
|
|
18
|
+
async function d(r, i) {
|
|
19
|
+
let o = c(n().getGatewayAuthConfig()), d = e(), f = await a(), p = f?.gatewayAuthMd5, m = f?.pluginVersionCode, h = t();
|
|
20
|
+
if (h.info(`[yoyoclaw-registry] checking registration state: gatewayAuth current=${s(o)}, persisted=${s(p)}; pluginVersionCode current=${d}, persisted=${m ?? "none"}`), l(p, o) && m === d) {
|
|
21
|
+
h.info("[yoyoclaw-registry] registration state unchanged, skipping device registration");
|
|
21
22
|
return;
|
|
22
23
|
}
|
|
23
|
-
|
|
24
|
+
h.info("[yoyoclaw-registry] registration state changed, registering device"), await u(r, i), h.info(`[yoyoclaw-registry] device registration succeeded, pluginVersionCode=${d}`);
|
|
25
|
+
}
|
|
26
|
+
async function f(e, n) {
|
|
27
|
+
try {
|
|
28
|
+
await o({
|
|
29
|
+
gatewayAuthMd5: e,
|
|
30
|
+
pluginVersionCode: n
|
|
31
|
+
}), t().info("[yoyoclaw-registry] registration state persisted after device registration");
|
|
32
|
+
} catch (e) {
|
|
33
|
+
t().warn(`[yoyoclaw-registry] failed to persist registration state: ${String(e)}`);
|
|
34
|
+
}
|
|
24
35
|
}
|
|
25
36
|
//#endregion
|
|
26
|
-
export {
|
|
37
|
+
export { u as registerDevice, d as registerDeviceIfRegistrationStateChanged };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useClawLogger as e } from "../../utils/logger.mjs";
|
|
2
2
|
import { getConfigManager as t } from "../../modules/configs/config-manager.mjs";
|
|
3
|
-
import { registerDevice as n,
|
|
3
|
+
import { registerDevice as n, registerDeviceIfRegistrationStateChanged as r } from "../../modules/device/registry.mjs";
|
|
4
4
|
import { getDeviceInfo as i } from "../../modules/device/device-info.mjs";
|
|
5
5
|
import "../../modules/device/index.mjs";
|
|
6
6
|
import { clearToken as a, loadToken as o } from "../../honor-auth/token-manager.mjs";
|
package/dist/utils/version.mjs
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
//#region src/utils/version.ts
|
|
2
|
-
var e = null;
|
|
3
|
-
function
|
|
4
|
-
return e === null && (e = "1.4.
|
|
2
|
+
var e = null, t = null;
|
|
3
|
+
function n() {
|
|
4
|
+
return e === null && (e = "1.4.1-alpha.1".includes("beta") || "1.4.1-alpha.1".includes("alpha")), !!e;
|
|
5
|
+
}
|
|
6
|
+
function r(e) {
|
|
7
|
+
if (!e) return 0;
|
|
8
|
+
let t = Number.parseInt(e, 10);
|
|
9
|
+
return Number.isFinite(t) && t >= 0 ? t : 0;
|
|
10
|
+
}
|
|
11
|
+
function i() {
|
|
12
|
+
if (t !== null) return t;
|
|
13
|
+
let [e, n, i] = "1.4.1-alpha.1".split("-", 1)[0].split("."), a = r(e), o = r(n), s = r(i);
|
|
14
|
+
return t = a * 1e6 + o * 1e3 + s, t;
|
|
5
15
|
}
|
|
6
16
|
//#endregion
|
|
7
|
-
export {
|
|
17
|
+
export { i as getYoyoPluginVersionCode, n as isBetaVersion };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@honor-claw/yoyo",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.1-alpha.1",
|
|
4
4
|
"description": "OpenClaw Honor Yoyo connection plugin",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -12,8 +12,7 @@
|
|
|
12
12
|
"files": [
|
|
13
13
|
"dist",
|
|
14
14
|
"skills",
|
|
15
|
-
"openclaw.plugin.json"
|
|
16
|
-
"src/agent/**/*.md"
|
|
15
|
+
"openclaw.plugin.json"
|
|
17
16
|
],
|
|
18
17
|
"type": "module",
|
|
19
18
|
"exports": {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: yoyo_phone_control
|
|
3
3
|
description: >
|
|
4
|
-
通过 YOYO
|
|
4
|
+
通过 YOYO 控制手机系统功能(应用管理、通话短信、闹钟日程、设备设置等)。
|
|
5
5
|
metadata: { "openclaw": { "emoji": "📱", "always": true } }
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -34,7 +34,6 @@ metadata: { "openclaw": { "emoji": "📱", "always": true } }
|
|
|
34
34
|
- 参数必须为合法 JSON,枚举值区分大小写,数值在定义范围内
|
|
35
35
|
- 当工具执行错误时,必须确认下发的指令是否存在格式问题,尤其是单双引号的使用问题
|
|
36
36
|
- 如果执行失败,必须重新读取 `SKILL.md` 和对应的工具定义文件,然后重新执行
|
|
37
|
-
- 禁止使用GUI工具作为兜底工具,除非用户明确要求在指定 App 内执行指定动作
|
|
38
37
|
- 绝对不能使用任何其他设备的工具
|
|
39
38
|
- 不要尝试任何其他方式完成任务,不要提供替代方案
|
|
40
39
|
|
|
@@ -128,9 +127,6 @@ metadata: { "openclaw": { "emoji": "📱", "always": true } }
|
|
|
128
127
|
| `battery` | `references/battery.md` | 电量与省电模式管理 |
|
|
129
128
|
| `audio-record` | `references/audio-record.md` | 录音管理 |
|
|
130
129
|
| `camera` | `references/camera.md` | 相机控制(拍照/录像),不支持手电筒相关的操作。 |
|
|
131
|
-
| `gui` | `references/gui-task-create.md` | 启动 GUI 操作任务(UI Agent),只有当用户明确要求在指定 App 内执行指定动作时才使用。如果用户没有提供应用名,严禁使用本工具。|
|
|
132
|
-
| `gui` | `references/gui-task-terminate.md` | 取消 GUI 任务 |
|
|
133
|
-
| `gui` | `references/gui-task-pause.md` | 暂停 GUI 任务 |
|
|
134
130
|
| `scan-code` | `references/scan-code.md` | 扫码(二维码/条形码) |
|
|
135
131
|
| `flashlight` | `references/flashlight.md` | 手电筒控制 |
|
|
136
132
|
| `airplane-mode` | `references/airplane-mode.md` | 飞行模式管理 |
|
|
@@ -145,60 +141,7 @@ metadata: { "openclaw": { "emoji": "📱", "always": true } }
|
|
|
145
141
|
|
|
146
142
|
| 工具名称 | 工具说明 | 支持的设备ID |
|
|
147
143
|
| ------- | ------- | --------------- |
|
|
148
|
-
|
|
149
|
-
| answer_phone | 支持接听当前来电功能。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
150
|
-
| answer_phone | 支持接听当前来电功能。 | 9cddc65b90031659e93a8ab935e15ca570463600761c33b2673caf8f9812e487 |
|
|
151
|
-
| answer_phone | 支持接听当前来电功能。 | fde5aea120ae4265bbf6f6471a7c8e2dd57c45f8ab65a0eef1f331ed85dc8fb0 |
|
|
152
|
-
| auto_rotate | 本工具提供自动旋转屏幕功能,支持打开/关闭自动旋转、查询当前旋转状态。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
153
|
-
| auto_rotate | 本工具提供自动旋转屏幕功能,支持打开/关闭自动旋转、查询当前旋转状态。 | 9cddc65b90031659e93a8ab935e15ca570463600761c33b2673caf8f9812e487 |
|
|
154
|
-
| auto_rotate | 本工具提供自动旋转屏幕功能,支持打开/关闭自动旋转、查询当前旋转状态。 | fde5aea120ae4265bbf6f6471a7c8e2dd57c45f8ab65a0eef1f331ed85dc8fb0 |
|
|
155
|
-
| cancel_countdown_timer | 用于取消倒计时的工具。当用户query中包含取消计时、取消倒计时、关闭计时器等意图时调用。支持根据事件标题、计时器序号或范围定位需要取消的计时器。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
156
|
-
| check_countdown_timer | 用于查询倒计时状态的工具。当用户query中包含查询计时、查看倒计时、查看计时器等意图时调用。支持查询当前是否存在运行中的计时器,也支持根据事件标题查询指定计时器,并返回计时器状态信息。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
157
|
-
| check_in | 参加店铺的打卡活动、给店铺进行收藏打卡、给店铺写点评。①当用户说要参加打卡活动或者进行收藏打卡时,需要根据画面中的步骤完成任务活动 ②当用户只要求写评价时,收藏和打卡操作都不需要执行 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
158
|
-
| close_countdown_timer | 用于关闭倒计时的工具。当用户query中包含关闭计时、关闭倒计时、关闭计时器等意图时调用。支持根据事件标题、计时器序号或范围定位需要取消的计时器。如果没有计时器,则关闭时钟APP | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
159
|
-
| create_countdown_timer | 用于创建倒计时。当用户在query中表达开始倒计时或指定具体时长进行计时(如“倒计时10分钟”“开始5分钟计时”)时调用该工具。支持设置倒计时时长以及可选的事件标题。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
160
|
-
| desk_companion | 该工具用于启动或退出桌面陪伴功能。桌面陪伴是一种动态桌面交互体验,在桌面上展示虚拟角色或宠物,与用户进行实时互动。当用户想要开启桌面陪伴体验或结束桌面陪伴时使用。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
161
|
-
| desktop | 本工具提供桌面管理功能,支持查询桌面布局、打开桌面设置页面,以及对桌面风格、角标、图标、快捷方式、搜索入口、桌面应用名称、通透模式、布局等进行配置。工具会根据actionType执行对应的桌面操作,并返回操作结果。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
162
|
-
| desktop | 本工具提供桌面管理功能,支持查询桌面布局、打开桌面设置页面,以及对桌面风格、角标、图标、快捷方式、搜索入口、桌面应用名称、通透模式、布局等进行配置。工具会根据actionType执行对应的桌面操作,并返回操作结果。 | 9cddc65b90031659e93a8ab935e15ca570463600761c33b2673caf8f9812e487 |
|
|
163
|
-
| desktop | 本工具提供桌面管理功能,支持查询桌面布局、打开桌面设置页面,以及对桌面风格、角标、图标、快捷方式、搜索入口、桌面应用名称、通透模式、布局等进行配置。工具会根据actionType执行对应的桌面操作,并返回操作结果。 | fde5aea120ae4265bbf6f6471a7c8e2dd57c45f8ab65a0eef1f331ed85dc8fb0 |
|
|
164
|
-
| express_logistics_query | 快递物流状态查询、运单跟踪、签收核实服务承接,触发后统一跳转系统负一屏快递信息,无需前置校验运单号、承运商等信息。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
165
|
-
| express_logistics_query | 快递物流状态查询、运单跟踪、签收核实服务承接,触发后统一跳转系统负一屏快递信息,无需前置校验运单号、承运商等信息。 | 9cddc65b90031659e93a8ab935e15ca570463600761c33b2673caf8f9812e487 |
|
|
166
|
-
| express_logistics_query | 快递物流状态查询、运单跟踪、签收核实服务承接,触发后统一跳转系统负一屏快递信息,无需前置校验运单号、承运商等信息。 | fde5aea120ae4265bbf6f6471a7c8e2dd57c45f8ab65a0eef1f331ed85dc8fb0 |
|
|
167
|
-
| hang_up_phone | 支持挂断当前通话功能。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
168
|
-
| hang_up_phone | 支持挂断当前通话功能。 | 9cddc65b90031659e93a8ab935e15ca570463600761c33b2673caf8f9812e487 |
|
|
169
|
-
| hang_up_phone | 支持挂断当前通话功能。 | fde5aea120ae4265bbf6f6471a7c8e2dd57c45f8ab65a0eef1f331ed85dc8fb0 |
|
|
170
|
-
| hover_button | 该工具用于管理设备悬浮按钮功能(桌面小白点),支持打开悬浮按钮、关闭悬浮按钮以及进入悬浮按钮设置页面查看或调整相关设置。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
171
|
-
| hover_button | 该工具用于管理设备悬浮按钮功能(桌面小白点),支持打开悬浮按钮、关闭悬浮按钮以及进入悬浮按钮设置页面查看或调整相关设置。 | 9cddc65b90031659e93a8ab935e15ca570463600761c33b2673caf8f9812e487 |
|
|
172
|
-
| hover_button | 该工具用于管理设备悬浮按钮功能(桌面小白点),支持打开悬浮按钮、关闭悬浮按钮以及进入悬浮按钮设置页面查看或调整相关设置。 | fde5aea120ae4265bbf6f6471a7c8e2dd57c45f8ab65a0eef1f331ed85dc8fb0 |
|
|
173
|
-
| navigation_service | 本工具用于发起导航请求,支持根据用户设定目的地、出发地、出行方式及途径地点规划路线,地址仅支持中国境内,并可指定特定的导航应用。支持指定高德地图、百度地图。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
174
|
-
| navigation_service | 本工具用于发起导航请求,支持根据用户设定目的地、出发地、出行方式及途径地点规划路线,地址仅支持中国境内,并可指定特定的导航应用。支持指定高德地图、百度地图。 | 9cddc65b90031659e93a8ab935e15ca570463600761c33b2673caf8f9812e487 |
|
|
175
|
-
| navigation_service | 本工具用于发起导航请求,支持根据用户设定目的地、出发地、出行方式及途径地点规划路线,地址仅支持中国境内,并可指定特定的导航应用。支持指定高德地图、百度地图。 | fde5aea120ae4265bbf6f6471a7c8e2dd57c45f8ab65a0eef1f331ed85dc8fb0 |
|
|
176
|
-
| onehanded_mode | 该工具提供对设备单手模式的管理与控制能力。单手模式通过缩小屏幕显示区域并调整界面布局,使主要操作区域集中在屏幕一侧,方便用户单手操作大屏设备。该工具支持单手模式的开启与关闭、相关参数的设置、当前使用状态的查询。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
177
|
-
| onehanded_mode | 该工具用于管理设备的单手模式开关。单手模式通过缩小屏幕显示区域,使主要操作区域集中在屏幕一侧,方便用户在大屏设备上进行单手操作。当前能力支持开启、关闭、查询单手模式状态以及进入单手模式设置页面。该工具仅控制系统级单手模式开关,不涉及应用级显示适配或单独配置项设置。 | 9cddc65b90031659e93a8ab935e15ca570463600761c33b2673caf8f9812e487 |
|
|
178
|
-
| onehanded_mode | 该工具用于管理设备的单手模式开关。单手模式通过缩小屏幕显示区域,使主要操作区域集中在屏幕一侧,方便用户在大屏设备上进行单手操作。当前能力支持开启、关闭、查询单手模式状态以及进入单手模式设置页面。该工具仅控制系统级单手模式开关,不涉及应用级显示适配或单独配置项设置。 | fde5aea120ae4265bbf6f6471a7c8e2dd57c45f8ab65a0eef1f331ed85dc8fb0 |
|
|
179
|
-
| open_countdown_timer | 用于打开倒计时的工具。用户query中含有打开倒计时、打开计时的意图时,业务上跳转到计时器界面。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
180
|
-
| open_payment_code | 收付款码打开工具,付款码/收款码仅支持支付宝/微信打开二维码。没有指明app的情况下,默认使用支付宝 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
181
|
-
| open_payment_code | 收付款码打开工具,付款码/收款码仅支持支付宝/微信打开二维码。没有指明app的情况下,默认使用支付宝 | 9cddc65b90031659e93a8ab935e15ca570463600761c33b2673caf8f9812e487 |
|
|
182
|
-
| open_payment_code | 收付款码打开工具,付款码/收款码仅支持支付宝/微信打开二维码。没有指明app的情况下,默认使用支付宝 | fde5aea120ae4265bbf6f6471a7c8e2dd57c45f8ab65a0eef1f331ed85dc8fb0 |
|
|
183
|
-
| open_transport_code | 本工具用于快速打开支付宝、微信和云闪付的公交/地铁乘车码页面,方便用户快捷出行,并可指定使用的应用。仅支持指定支付宝、微信和云闪付。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
184
|
-
| open_transport_code | 本工具用于快速打开支付宝、微信和云闪付的公交/地铁乘车码页面,方便用户快捷出行,并可指定使用的应用。仅支持指定支付宝、微信和云闪付。 | 9cddc65b90031659e93a8ab935e15ca570463600761c33b2673caf8f9812e487 |
|
|
185
|
-
| open_transport_code | 本工具用于快速打开支付宝、微信和云闪付的公交/地铁乘车码页面,方便用户快捷出行,并可指定使用的应用。仅支持指定支付宝、微信和云闪付。 | fde5aea120ae4265bbf6f6471a7c8e2dd57c45f8ab65a0eef1f331ed85dc8fb0 |
|
|
186
|
-
| outfit_change | 该工具用于为用户提供虚拟换装和试穿体验。当用户明确发起服装替换、试穿、换装等请求时调用,触发虚拟形象换装流程。工具将展示换装效果并返回结果。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
187
|
-
| pause_countdown_timer | 用于暂停倒计时的工具。当用户query中包含暂停计时、暂停倒计时、暂停计时器等意图时调用。支持根据事件标题、计时器序号或范围定位需要暂停的计时器。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
188
|
-
| play_game | 该工具用于与用户进行互动游戏。当用户表达想要玩游戏、一起玩游戏的意愿时调用,工具将随机选择一个互动游戏并开始游戏流程。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
189
|
-
| play_joke | 该工具用于为用户讲一个笑话。当用户表达想要听笑话、讲个笑话等意愿时调用,工具将生成并返回一个适合当前对话语境的笑话内容。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
190
|
-
| ptz_control | 该工具提供对进入退出robotphone模式的能力,支持手机云台摄像头的统一控制与状态管理,适用于拍摄取景、视频录制及稳定性调节等场景。用户可进行开关、参数设置及状态查询,实现对拍摄设备的精细化控制。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
191
|
-
| ptz_control | 该工具提供对进入退出robotphone模式的能力,支持手机云台摄像头的统一控制与状态管理,适用于拍摄取景、视频录制及稳定性调节等场景。用户可进行开关、参数设置及状态查询,实现对拍摄设备的精细化控制。 | 9cddc65b90031659e93a8ab935e15ca570463600761c33b2673caf8f9812e487 |
|
|
192
|
-
| ptz_control | 该工具提供对进入退出robotphone模式的能力,支持手机云台摄像头的统一控制与状态管理,适用于拍摄取景、视频录制及稳定性调节等场景。用户可进行开关、参数设置及状态查询,实现对拍摄设备的精细化控制。 | fde5aea120ae4265bbf6f6471a7c8e2dd57c45f8ab65a0eef1f331ed85dc8fb0 |
|
|
193
|
-
| renewal_query | 支付宝本人自动续费查询、取消诉求承接,触发后统一跳转支付宝APP自动续费页面,不直接执行业务操作。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
194
|
-
| renewal_query | 支付宝本人自动续费查询、取消诉求承接,触发后统一跳转支付宝APP自动续费页面,不直接执行业务操作。 | 9cddc65b90031659e93a8ab935e15ca570463600761c33b2673caf8f9812e487 |
|
|
195
|
-
| renewal_query | 支付宝本人自动续费查询、取消诉求承接,触发后统一跳转支付宝APP自动续费页面,不直接执行业务操作。 | fde5aea120ae4265bbf6f6471a7c8e2dd57c45f8ab65a0eef1f331ed85dc8fb0 |
|
|
196
|
-
| restart_countdown_timer | 用于重新启动或重启倒计时的工具。当用户query中包含重启计时、重新开始计时、重启倒计时、重新启动计时器等意图时调用。支持根据事件标题、序号或范围定位需要重启的计时器。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
197
|
-
| resume_countdown_timer | 用于继续或恢复倒计时的工具。当用户query中包含继续计时、继续倒计时、恢复计时器等意图时调用。支持根据事件标题、计时器序号或范围定位需要继续的计时器。 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
198
|
-
| takeaway_order | 点外卖工具,支持美团、饿了么和淘宝闪购app的点餐。没有指明app的情况下,默认使用淘宝闪购 | 8e26e54c0065df89632178de48742731e54c5022cdb2536e859c44856530e8ee |
|
|
199
|
-
| takeaway_order | 点外卖工具,支持美团、饿了么和淘宝闪购app的点餐。没有指明app的情况下,默认使用淘宝闪购 | 9cddc65b90031659e93a8ab935e15ca570463600761c33b2673caf8f9812e487 |
|
|
200
|
-
| takeaway_order | 点外卖工具,支持美团、饿了么和淘宝闪购app的点餐。没有指明app的情况下,默认使用淘宝闪购 | fde5aea120ae4265bbf6f6471a7c8e2dd57c45f8ab65a0eef1f331ed85dc8fb0 |
|
|
201
|
-
<!-- yoyo-mcp-tools:end -->
|
|
144
|
+
{{full-mcp-tool-list}}
|
|
202
145
|
|
|
203
146
|
**每行只对应一个设备ID。只有当该行的支持设备ID等于当前设备ID时,该工具才可被调用。**
|
|
204
147
|
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: yoyo-update
|
|
3
|
+
description: >
|
|
4
|
+
更新 YOYO 插件到最新版本。当用户要求更新、升级 yoyo 插件,或检查 yoyo 插件版本更新时触发。
|
|
5
|
+
metadata: { "openclaw": { "emoji": "🔄", "always": true } }
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# YOYO 插件更新
|
|
9
|
+
|
|
10
|
+
按照以下 5 步工作流完成 YOYO 插件的版本更新。
|
|
11
|
+
|
|
12
|
+
## 全局规则
|
|
13
|
+
|
|
14
|
+
- [MANDATORY] **严禁在技能流程内重启网关** — 不得执行 `openclaw gateway stop/start/restart` 或任何网关重启操作
|
|
15
|
+
- [MANDATORY] **严禁卸载插件** — 不得执行 `openclaw plugins uninstall`,否则用户配置将丢失
|
|
16
|
+
- [MANDATORY] 出错时仅汇总错误并给出建议,不得尝试自动修复(尤其是不得通过卸载重装来解决问题)
|
|
17
|
+
- [MANDATORY] 所有面向用户的输出必须使用中文
|
|
18
|
+
- 所有命令在 Windows (bash) 和 Unix (bash) 环境下格式一致,无需区分平台
|
|
19
|
+
|
|
20
|
+
## 步骤 1:预检查
|
|
21
|
+
|
|
22
|
+
执行以下命令获取当前插件信息:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
openclaw plugins info yoyo
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**输出字段说明**:
|
|
29
|
+
|
|
30
|
+
| 字段 | 说明 | 示例 |
|
|
31
|
+
| -------------- | ---------------------------- | -------------------------------- |
|
|
32
|
+
| `Status` | 插件加载状态 | `loaded` / `error` / `not found` |
|
|
33
|
+
| `Version` | 当前已安装版本 | `1.3.0-beta.8` |
|
|
34
|
+
| `Spec` | 安装来源标识,含包名和渠道 | `@honor-claw/yoyo@beta` |
|
|
35
|
+
| `Install path` | 插件安装路径 | `~/.openclaw/extensions/yoyo` |
|
|
36
|
+
|
|
37
|
+
**处理规则**:
|
|
38
|
+
|
|
39
|
+
- 若插件未找到(输出为空或提示未安装)→ 告知用户"未检测到 YOYO 插件,请先安装"并停止
|
|
40
|
+
- 若状态非 `loaded`(如 `error`)→ 告知用户插件状态异常并展示具体信息,停止流程
|
|
41
|
+
- 若命令本身执行失败 → 告知用户"无法获取插件信息,请确认 OpenClaw 网关正在运行"并停止
|
|
42
|
+
- 成功获取信息 → 提取 `Version` 和 `Spec` 字段值,进入步骤 2
|
|
43
|
+
|
|
44
|
+
## 步骤 2:检查最新版本
|
|
45
|
+
|
|
46
|
+
### 2.1 确定当前发布渠道
|
|
47
|
+
|
|
48
|
+
根据步骤 1 中 `Spec` 字段判断当前发布渠道:
|
|
49
|
+
|
|
50
|
+
- `Spec` 包含 `@alpha` 后缀 → 渠道为 `alpha`
|
|
51
|
+
- `Spec` 包含 `@beta` 后缀 → 渠道为 `beta`
|
|
52
|
+
- `Spec` 无预发布后缀 → 渠道为 `latest`
|
|
53
|
+
|
|
54
|
+
### 2.2 查询最新版本
|
|
55
|
+
|
|
56
|
+
执行以下命令获取所有发布渠道的最新版本:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npm view @honor-claw/yoyo dist-tags --json
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
从 JSON 输出中提取对应渠道的版本号。示例输出:
|
|
63
|
+
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"latest": "1.2.0",
|
|
67
|
+
"beta": "1.3.0-beta.8",
|
|
68
|
+
"alpha": "1.4.0-alpha.3"
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
若 `npm view` 命令失败,回退使用以下命令获取 `latest` 版本:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
npm view @honor-claw/yoyo version
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 2.3 版本对比
|
|
79
|
+
|
|
80
|
+
将目标版本(对应渠道最新版)与步骤 1 获取的当前版本进行对比:
|
|
81
|
+
|
|
82
|
+
- **版本相同** → 告知用户"当前已是最新版本(v{version}),无需更新"并停止流程
|
|
83
|
+
- **版本不同** → 记录当前版本和目标版本,进入步骤 3
|
|
84
|
+
|
|
85
|
+
## 步骤 3:展示版本差异
|
|
86
|
+
|
|
87
|
+
向用户展示更新摘要后直接进入步骤 4:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
🔄 YOYO 插件更新可用
|
|
91
|
+
|
|
92
|
+
当前版本:v{当前版本}
|
|
93
|
+
目标版本:v{目标版本}
|
|
94
|
+
发布渠道:{渠道名}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## 步骤 4:执行更新
|
|
98
|
+
|
|
99
|
+
### 4.1 执行更新命令
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
openclaw plugins update yoyo
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
注意:该命令可能需要较长时间执行(下载和安装),请使用足够的超时时间。
|
|
106
|
+
|
|
107
|
+
### 4.2 监控更新进度
|
|
108
|
+
|
|
109
|
+
实时监控命令输出,根据不同阶段向用户报告进度:
|
|
110
|
+
|
|
111
|
+
| 输出关键词 | 向用户报告 | 内部处理 |
|
|
112
|
+
| -------------------------------------- | ----------------- | ------------------------------ |
|
|
113
|
+
| `Downloading @honor-claw/yoyo@` | "正在下载插件..." | — |
|
|
114
|
+
| `Extracting` | 不输出 | 静默跟踪 |
|
|
115
|
+
| `Installing to` | "正在更新插件..." | — |
|
|
116
|
+
| `Installing plugin dependencies` | 不输出 | 静默跟踪 |
|
|
117
|
+
| `Updated yoyo:` | 不输出 | 捕获成功版本信息 |
|
|
118
|
+
| `Config overwrite:` / `Config backup:` | 不输出 | 记录配置备份路径 |
|
|
119
|
+
| `Restart the gateway to load plugins` | 不输出 | 更新成功的确认信号,进入步骤 5 |
|
|
120
|
+
|
|
121
|
+
### 4.3 错误处理
|
|
122
|
+
|
|
123
|
+
若命令执行过程中出现错误(非零退出码或输出中包含错误信息):
|
|
124
|
+
|
|
125
|
+
- 记录完整错误输出
|
|
126
|
+
- 不尝试重试或替代方案
|
|
127
|
+
- 直接进入步骤 5 的失败处理流程
|
|
128
|
+
|
|
129
|
+
## 步骤 5:更新后处理
|
|
130
|
+
|
|
131
|
+
### 更新成功
|
|
132
|
+
|
|
133
|
+
向用户报告:
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
✅ 插件更新完成
|
|
137
|
+
|
|
138
|
+
更新版本:v{旧版本} → v{新版本}
|
|
139
|
+
|
|
140
|
+
插件更新完成,重启网关后生效。是否立即重启?
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**[MANDATORY] 不得在此步骤中执行网关重启操作。** 仅向用户提问,由用户在下一轮对话中自行决定是否重启。
|
|
144
|
+
|
|
145
|
+
### 更新失败
|
|
146
|
+
|
|
147
|
+
向用户报告失败摘要:
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
❌ 插件更新失败
|
|
151
|
+
|
|
152
|
+
失败原因:{简要描述错误}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
并给出以下建议(根据实际错误类型选择):
|
|
156
|
+
|
|
157
|
+
- 网络错误(如 `ECONNREFUSED`、`ETIMEDOUT`)→ "请检查网络连接后重试"
|
|
158
|
+
- 权限错误(如 `EACCES`、`EPERM`)→ "请检查 OpenClaw 安装目录的读写权限"
|
|
159
|
+
- 版本冲突 / 依赖冲突 → "请将以下错误信息反馈给开发团队"
|
|
160
|
+
- 其他未预期错误 → "请将错误信息反馈给开发团队,或稍后重试"
|
|
161
|
+
|
|
162
|
+
**[MANDATORY] 不得尝试以下操作**:
|
|
163
|
+
- 卸载后重装插件(配置会丢失)
|
|
164
|
+
- 手动删除插件目录
|
|
165
|
+
- 修改插件配置文件来绕过错误
|
|
166
|
+
- 重启网关
|