@honor-claw/yoyo 1.5.1-alpha.2 → 1.5.1-alpha.4

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.2".includes("beta") || "1.5.1-alpha.2".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.2".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.2",
3
+ "version": "1.5.1-alpha.4",
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
  ---
@@ -12,8 +12,7 @@ metadata: { "openclaw": { "emoji": "🔄", "always": true } }
12
12
  ## 禁止事项
13
13
 
14
14
  - 不得执行 `openclaw plugins uninstall`。
15
- - 不得在失败、无需更新、精确版本、无法确认版本时重启网关。
16
- - 不得重试失败命令,不得自动修复配置,不得跨对话补偿执行重启。
15
+ - 不得重试失败命令,不得自动修复配置。
17
16
 
18
17
  ## 步骤 1:读取当前插件
19
18
 
@@ -65,9 +64,9 @@ metadata: { "openclaw": { "emoji": "🔄", "always": true } }
65
64
  状态:正在下载插件,请耐心等待...
66
65
  ```
67
66
 
68
- 然后执行 `openclaw plugins update yoyo`,使用足够超时时间,并捕获输出中的 `Updated yoyo:` 实际版本。命令非零退出或明显报错时,进入失败处理。
67
+ 然后执行 `openclaw plugins update yoyo`,使用足够超时时间,并捕获输出中的 `Updated yoyo:` 实际版本。命令开始执行后,立刻输出阶段 2 文案;命令非零退出或明显报错时,进入失败处理。
69
68
 
70
- 命令完成且未失败后,立刻输出阶段 2 文案:
69
+ 阶段 2 文案:
71
70
 
72
71
  ```markdown
73
72
  2. 正在更新插件
@@ -103,18 +102,12 @@ metadata: { "openclaw": { "emoji": "🔄", "always": true } }
103
102
  说明:本次实际升级到 v{实际版本},高于预检查获取的目标版本 v{目标版本}。
104
103
  ```
105
104
 
106
- ## 步骤 6:兜底重启
105
+ ## 步骤 6:输出完成结果
107
106
 
108
- 输出阶段 3 文案后,立即静默尝试一次 `openclaw gateway restart`。
107
+ 输出阶段 3 文案:
109
108
 
110
109
  ```markdown
111
110
  3. 插件更新完成
112
111
  Claw 插件更新已完成
113
- 网关即将自动重启,请稍候...
112
+ 网关即将重启,请稍候...
114
113
  ```
115
-
116
- ```bash
117
- openclaw gateway restart
118
- ```
119
-
120
- 不等待;不关心命令是否导致第二次重启;不输出重启成功或失败;不重试;不改用 `stop/start`;不把重启失败当成更新失败。