@honor-claw/yoyo 1.5.1-alpha.1 → 1.5.1-alpha.3

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.
@@ -1,21 +1,16 @@
1
- import { existsSync as e } from "node:fs";
1
+ import { findPackageRoot as e } from "./package-json.mjs";
2
2
  import t from "node:path";
3
- import n from "node:os";
4
- import { fileURLToPath as r } from "node:url";
3
+ import { fileURLToPath as n } from "node:url";
4
+ import r from "node:os";
5
5
  //#region src/utils/home-dir.ts
6
6
  function i(e) {
7
7
  return e?.trim() || void 0;
8
8
  }
9
- function a(n = import.meta.url) {
10
- let i = t.dirname(r(n));
11
- for (; i !== t.dirname(i);) {
12
- if (e(t.join(i, "package.json"))) return i;
13
- i = t.dirname(i);
14
- }
15
- return i;
9
+ function a(r = import.meta.url) {
10
+ return e(r) ?? t.parse(n(r)).root;
16
11
  }
17
- function o(e = process.env, r = n.homedir) {
18
- let i = s(e, r);
12
+ function o(e = process.env, n = r.homedir) {
13
+ let i = s(e, n);
19
14
  return i ? t.resolve(i) : void 0;
20
15
  }
21
16
  function s(e, t) {
@@ -0,0 +1,25 @@
1
+ import { existsSync as e, readFileSync as t } from "node:fs";
2
+ import n from "node:path";
3
+ import { fileURLToPath as r } from "node:url";
4
+ //#region src/utils/package-json.ts
5
+ function i(t = import.meta.url, i) {
6
+ let a = n.dirname(r(t));
7
+ for (; a !== n.dirname(a);) {
8
+ let t = n.join(a, "package.json");
9
+ if (e(t) && (!i || o(t)?.name === i)) return a;
10
+ a = n.dirname(a);
11
+ }
12
+ }
13
+ function a(e) {
14
+ return o(n.join(e, "package.json"));
15
+ }
16
+ function o(e) {
17
+ try {
18
+ let n = JSON.parse(t(e, "utf-8"));
19
+ return n && typeof n == "object" ? n : void 0;
20
+ } catch {
21
+ return;
22
+ }
23
+ }
24
+ //#endregion
25
+ export { i as findPackageRoot, a as readPackageJson };
@@ -1,17 +1,27 @@
1
+ import { findPackageRoot as e, readPackageJson as t } from "./package-json.mjs";
1
2
  //#region src/utils/version.ts
2
- var e = null, t = null;
3
- function n() {
4
- return e === null && (e = "1.5.1-alpha.1".includes("beta") || "1.5.1-alpha.1".includes("alpha")), !!e;
3
+ var n = "@honor-claw/yoyo";
4
+ function r() {
5
+ let e = o();
6
+ return e.includes("beta") || e.includes("alpha");
5
7
  }
6
- function r(e) {
8
+ function i(e) {
7
9
  if (!e) return 0;
8
10
  let t = Number.parseInt(e, 10);
9
11
  return Number.isFinite(t) && t >= 0 ? t : 0;
10
12
  }
11
- function i() {
12
- if (t !== null) return t;
13
- let [e, n, i] = "1.5.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;
13
+ function a() {
14
+ let [e, t, n] = o().split("-", 1)[0].split("."), r = i(e), a = i(t), s = i(n);
15
+ return r * 1e6 + a * 1e3 + s;
16
+ }
17
+ function o() {
18
+ try {
19
+ let r = e(import.meta.url, n);
20
+ if (!r) return "0.0.0";
21
+ let i = t(r)?.version;
22
+ if (typeof i == "string") return i;
23
+ } catch {}
24
+ return "0.0.0";
15
25
  }
16
26
  //#endregion
17
- export { i as getYoyoPluginVersionCode, n as isBetaVersion };
27
+ export { a as getYoyoPluginVersionCode, r as isBetaVersion };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@honor-claw/yoyo",
3
- "version": "1.5.1-alpha.1",
3
+ "version": "1.5.1-alpha.3",
4
4
  "description": "OpenClaw Honor Yoyo connection plugin",
5
5
  "keywords": [
6
6
  "ai",
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: gui.create
3
3
  description: >
4
- 启动基于 GUI 的应用操作任务(UI Agent)。用于在手机上对指定 App 发起一次独立的操控流程;多 App 或含条件的流程需拆分为多次调用,续办需携带上次任务的 task_id。
4
+ 启动基于 GUI 的应用操作任务(UI Agent)。用于在手机上对指定 App 发起一次独立的操控流程;单一 App 禁止拆分任务,多 App 或含条件的流程需拆分为多次调用,续办需携带上次任务的 task_id。
5
5
  ---
6
6
 
7
7
  # Gui Task Create GUI 任务创建
@@ -14,7 +14,7 @@ gui.create
14
14
  ## 3. 业务规则
15
15
 
16
16
  ### 适用场景及操作流程
17
- 1. 针对单一 App 的一次性 GUI 操作任务,直接发起调用
17
+ 1. 针对单一 App 的任何 GUI 操作任务,禁止拆分任务,必须直接发起调用
18
18
  2. 涉及多个 App 的连续操作需拆分为多个独立任务,逐个调用
19
19
  3. 涉及条件判断(如“若…则…”)时,将条件判断与执行任务拆分为两次调用
20
20
  4. 若为对未结束任务的补充/修改/继续,需在请求中补充对应的 task_id
@@ -112,107 +112,91 @@ openclaw nodes invoke --node <ID> --command gui.create --params '{"app_name":"
112
112
 
113
113
  ---
114
114
 
115
- ### 示例 2: 用汽水音乐识别当前音乐(新增任务)
115
+ ### 示例 2: 单一应用任务(禁止拆解任务)
116
116
 
117
- **用户输入**: "用汽水音乐帮我识别一下这个是什么音乐"
117
+ **用户输入**: "打开微信添加好友A和好友B,并给A发送你好"
118
118
 
119
119
  **工具**: "gui.create"
120
120
 
121
121
  **JSON 参数**:
122
122
  ```json
123
123
  {
124
- "app_name": "汽水音乐",
125
- "task_query": "使用汽水音乐听歌识曲,识别当前的音乐"
124
+ "app_name": "微信",
125
+ "task_query": "打开微信添加好友A和好友B,并给A发送你好"
126
126
  }
127
127
  ```
128
128
 
129
129
  **Windows (Cmd) 执行命令**:
130
130
  ```bash
131
- cmd /c 'openclaw nodes invoke --node <ID> --command gui.create --params "{\"app_name\":\"汽水音乐\",\"task_query\":\"使用汽水音乐听歌识曲,识别当前的音乐\"}"'
131
+ cmd /c 'openclaw nodes invoke --node <ID> --command gui.create --params "{\"app_name\":\"微信\",\"task_query\":\"打开微信添加好友A和好友B,并给A发送你好\"}"'
132
132
  ```
133
133
 
134
134
  **Linux (Bash) 执行命令**:
135
135
  ```bash
136
- openclaw nodes invoke --node <ID> --command gui.create --params '{"app_name":"汽水音乐","task_query":"使用汽水音乐听歌识曲,识别当前的音乐"}'
136
+ openclaw nodes invoke --node <ID> --command gui.create --params '{"app_name":"微信","task_query":"打开微信添加好友A和好友B,并给A发送你好"}'
137
137
  ```
138
138
 
139
139
  ---
140
140
 
141
- ### 示例 3: 继续上次在高德地图的导航并修改目的地(续办,带 task_id)
141
+ ### 示例 3: 多应用任务(必须按app拆解任务)
142
142
 
143
- **用户输入**: "接着刚才在高德地图的导航,把目的地改成北京南站"
143
+ **用户输入**: "在淘宝把羽绒服加入购物车,然后截图发给微信好友A"
144
144
 
145
145
  **工具**: "gui.create"
146
146
 
147
147
  **JSON 参数**:
148
+ sub-task 1: 在淘宝将“羽绒服”加入购物车并截图
148
149
  ```json
149
150
  {
150
- "app_name": "高德地图",
151
- "task_query": "继续在高德地图进行导航,将目的地改为北京南站",
152
- "task_id": "prev-task-id-001"
151
+ "app_name": "淘宝",
152
+ "task_query": "在淘宝将“羽绒服”加入购物车并截图"
153
153
  }
154
154
  ```
155
-
156
- **Windows (Cmd) 执行命令**:
157
- ```bash
158
- cmd /c 'openclaw nodes invoke --node <ID> --command gui.create --params "{\"app_name\":\"高德地图\",\"task_query\":\"继续在高德地图进行导航,将目的地改为北京南站\",\"task_id\":\"prev-task-id-001\"}"'
159
- ```
160
-
161
- **Linux (Bash) 执行命令**:
162
- ```bash
163
- openclaw nodes invoke --node <ID> --command gui.create --params '{"app_name":"高德地图","task_query":"继续在高德地图进行导航,将目的地改为北京南站","task_id":"prev-task-id-001"}'
164
- ```
165
-
166
- ---
167
-
168
- ### 示例 4: 在淘宝将指定商品加入购物车(新增任务)
169
-
170
- **用户输入**: "在淘宝把羽绒服加入购物车"
171
-
172
- **工具**: "gui.create"
173
-
174
- **JSON 参数**:
155
+ sub-task 2: 在微信将截图发送给好友A
175
156
  ```json
176
157
  {
177
- "app_name": "淘宝",
178
- "task_query": "在淘宝将“羽绒服”加入购物车"
158
+ "app_name": "微信",
159
+ "task_query": "在微信将截图发送给好友A"
179
160
  }
180
161
  ```
181
162
 
182
163
  **Windows (Cmd) 执行命令**:
183
164
  ```bash
184
- cmd /c 'openclaw nodes invoke --node <ID> --command gui.create --params "{\"app_name\":\"淘宝\",\"task_query\":\"在淘宝将“羽绒服”加入购物车\"}"'
165
+ cmd /c 'openclaw nodes invoke --node <ID> --command gui.create --params "{\"app_name\":\"淘宝\",\"task_query\":\"在淘宝将“羽绒服”加入购物车并截图\"}"'
166
+ cmd /c 'openclaw nodes invoke --node <ID> --command gui.create --params "{\"app_name\":\"微信\",\"task_query\":\"在微信将截图发送给好友A\"}"'
185
167
  ```
186
168
 
187
169
  **Linux (Bash) 执行命令**:
188
170
  ```bash
189
- openclaw nodes invoke --node <ID> --command gui.create --params '{"app_name":"淘宝","task_query":"在淘宝将“羽绒服”加入购物车"}'
171
+ openclaw nodes invoke --node <ID> --command gui.create --params '{"app_name":"淘宝","task_query":"在淘宝将“羽绒服”加入购物车并截图"}'
172
+ openclaw nodes invoke --node <ID> --command gui.create --params '{"app_name":"微信","task_query":"在微信将截图发送给好友A"}'
190
173
  ```
191
174
 
192
175
  ---
193
176
 
194
- ### 示例 5: 在系统设置中关闭蓝牙(新增任务)
177
+ ### 示例 4: 继续上次在高德地图的导航并修改目的地(续办,带 task_id)
195
178
 
196
- **用户输入**: "打开设置把蓝牙关闭"
179
+ **用户输入**: "接着刚才在高德地图的导航,把目的地改成北京南站"
197
180
 
198
181
  **工具**: "gui.create"
199
182
 
200
183
  **JSON 参数**:
201
184
  ```json
202
185
  {
203
- "app_name": "设置",
204
- "task_query": "在设置中关闭蓝牙"
186
+ "app_name": "高德地图",
187
+ "task_query": "继续在高德地图进行导航,将目的地改为北京南站",
188
+ "task_id": "prev-task-id-001"
205
189
  }
206
190
  ```
207
191
 
208
192
  **Windows (Cmd) 执行命令**:
209
193
  ```bash
210
- cmd /c 'openclaw nodes invoke --node <ID> --command gui.create --params "{\"app_name\":\"设置\",\"task_query\":\"在设置中关闭蓝牙\"}"'
194
+ cmd /c 'openclaw nodes invoke --node <ID> --command gui.create --params "{\"app_name\":\"高德地图\",\"task_query\":\"继续在高德地图进行导航,将目的地改为北京南站\",\"task_id\":\"prev-task-id-001\"}"'
211
195
  ```
212
196
 
213
197
  **Linux (Bash) 执行命令**:
214
198
  ```bash
215
- openclaw nodes invoke --node <ID> --command gui.create --params '{"app_name":"设置","task_query":"在设置中关闭蓝牙"}'
199
+ openclaw nodes invoke --node <ID> --command gui.create --params '{"app_name":"高德地图","task_query":"继续在高德地图进行导航,将目的地改为北京南站","task_id":"prev-task-id-001"}'
216
200
  ```
217
201
 
218
202
  ---
@@ -56,14 +56,7 @@ metadata: { "openclaw": { "emoji": "🔄", "always": true } }
56
56
 
57
57
  ## 步骤 4:执行更新
58
58
 
59
- 执行 `openclaw plugins update yoyo`,使用足够超时时间。实时监控输出,只处理下面四个关键节点:
60
-
61
- - 看到 `Downloading @honor-claw/yoyo@`:立刻输出一次阶段 1 文案。
62
- - 看到 `Installing to`:立刻输出一次阶段 2 文案。
63
- - 看到 `Updated yoyo:`:捕获实际更新版本。
64
- - 看到 `Restart the gateway to load plugins`:视为更新命令成功,进入步骤 5。
65
-
66
- 阶段 1 文案:
59
+ 执行 `openclaw plugins update yoyo` 前,先输出阶段 1 文案:
67
60
 
68
61
  ```markdown
69
62
  正在执行升级流程:
@@ -72,6 +65,8 @@ metadata: { "openclaw": { "emoji": "🔄", "always": true } }
72
65
  状态:正在下载插件,请耐心等待...
73
66
  ```
74
67
 
68
+ 然后执行 `openclaw plugins update yoyo`,使用足够超时时间,并捕获输出中的 `Updated yoyo:` 实际版本。命令开始执行后,立刻输出阶段 2 文案;命令非零退出或明显报错时,进入失败处理。
69
+
75
70
  阶段 2 文案:
76
71
 
77
72
  ```markdown
@@ -79,8 +74,6 @@ metadata: { "openclaw": { "emoji": "🔄", "always": true } }
79
74
  状态:正在安装并配置新版本插件,请勿中断操作
80
75
  ```
81
76
 
82
- 命令非零退出或明显报错时,进入失败处理。
83
-
84
77
  ## 步骤 5:校验并输出结果
85
78
 
86
79
  若步骤 4 失败,输出:
@@ -100,30 +93,28 @@ metadata: { "openclaw": { "emoji": "🔄", "always": true } }
100
93
  - 实际版本等于当前版本:输出 `插件版本未发生变化,需要稍后再次尝试更新`,停止。
101
94
  - 实际版本低于目标版本但高于当前版本:输出 `插件已升级到 v{实际版本},但低于预检查目标版本 v{目标版本},需要稍后再次尝试更新`,停止。
102
95
  - 无法比较:输出 `插件更新命令已完成,但无法可靠确认最终版本,请稍后再次检查插件版本`,停止。
103
- - 实际版本等于或高于目标版本:先输出成功文案,再继续步骤 6。
96
+ - 实际版本等于或高于目标版本:继续步骤 6。
104
97
 
105
- 成功文案:
98
+ 成功文案见步骤 6。
106
99
 
107
- ```markdown
108
- 3. 插件更新完成
109
- Claw 插件更新已完成
110
- 网关即将自动重启,请稍候...
111
- ```
112
-
113
- 若实际版本高于步骤 2 获取的目标版本,在成功文案后追加:
100
+ 若实际版本高于步骤 2 获取的目标版本,在步骤 6 成功文案后追加:
114
101
 
115
102
  ```markdown
116
103
  说明:本次实际升级到 v{实际版本},高于预检查获取的目标版本 v{目标版本}。
117
104
  ```
118
105
 
119
- ## 步骤 6:延迟兜底重启
106
+ ## 步骤 6:兜底重启
120
107
 
121
- 这是内部步骤,不输出任何重启相关文案。
108
+ 输出阶段 3 文案后,立即静默尝试一次 `openclaw gateway restart`。
122
109
 
123
- 步骤 5 的成功文案输出后,等待 3 秒;如果这期间 OpenClaw 已自动重启或正在重启,停止。否则静默尝试一次:
110
+ ```markdown
111
+ 3. 插件更新完成
112
+ Claw 插件更新已完成
113
+ 网关即将重启,请稍候...
114
+ ```
124
115
 
125
116
  ```bash
126
117
  openclaw gateway restart
127
118
  ```
128
119
 
129
- 不关心命令是否导致第二次重启;不输出成功或失败;不重试;不改用 `stop/start`;不把重启失败当成更新失败。
120
+ 不等待;不关心命令是否导致第二次重启;不输出重启成功或失败;不重试;不改用 `stop/start`;不把重启失败当成更新失败。