autoglm-gui 1.1.0__py3-none-any.whl → 1.2.1__py3-none-any.whl
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.
- AutoGLM_GUI/adb_plus/__init__.py +5 -1
- AutoGLM_GUI/adb_plus/serial.py +61 -2
- AutoGLM_GUI/adb_plus/version.py +81 -0
- AutoGLM_GUI/api/__init__.py +8 -1
- AutoGLM_GUI/api/agents.py +329 -94
- AutoGLM_GUI/api/devices.py +145 -164
- AutoGLM_GUI/api/workflows.py +70 -0
- AutoGLM_GUI/device_manager.py +760 -0
- AutoGLM_GUI/exceptions.py +18 -0
- AutoGLM_GUI/phone_agent_manager.py +549 -0
- AutoGLM_GUI/phone_agent_patches.py +146 -0
- AutoGLM_GUI/schemas.py +310 -2
- AutoGLM_GUI/state.py +21 -0
- AutoGLM_GUI/static/assets/{about-Crpy4Xue.js → about-BtBH1xKN.js} +1 -1
- AutoGLM_GUI/static/assets/chat-DPzFNNGu.js +124 -0
- AutoGLM_GUI/static/assets/dialog-Dwuk2Hgl.js +45 -0
- AutoGLM_GUI/static/assets/index-B_AaKuOT.js +1 -0
- AutoGLM_GUI/static/assets/index-BjYIY--m.css +1 -0
- AutoGLM_GUI/static/assets/index-CvQkCi2d.js +11 -0
- AutoGLM_GUI/static/assets/logo-Cyfm06Ym.png +0 -0
- AutoGLM_GUI/static/assets/workflows-xX_QH-wI.js +1 -0
- AutoGLM_GUI/static/favicon.ico +0 -0
- AutoGLM_GUI/static/index.html +9 -2
- AutoGLM_GUI/static/logo-192.png +0 -0
- AutoGLM_GUI/static/logo-512.png +0 -0
- AutoGLM_GUI/workflow_manager.py +181 -0
- {autoglm_gui-1.1.0.dist-info → autoglm_gui-1.2.1.dist-info}/METADATA +51 -6
- {autoglm_gui-1.1.0.dist-info → autoglm_gui-1.2.1.dist-info}/RECORD +31 -19
- AutoGLM_GUI/static/assets/chat-DGFuSj6_.js +0 -149
- AutoGLM_GUI/static/assets/index-C1k5Ch1V.js +0 -10
- AutoGLM_GUI/static/assets/index-COYnSjzf.js +0 -1
- AutoGLM_GUI/static/assets/index-QX6oy21q.css +0 -1
- {autoglm_gui-1.1.0.dist-info → autoglm_gui-1.2.1.dist-info}/WHEEL +0 -0
- {autoglm_gui-1.1.0.dist-info → autoglm_gui-1.2.1.dist-info}/entry_points.txt +0 -0
- {autoglm_gui-1.1.0.dist-info → autoglm_gui-1.2.1.dist-info}/licenses/LICENSE +0 -0
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as D,u as S,r as t,l as b,j as e,B as r,d as W,a as F,b as T}from"./index-CvQkCi2d.js";import{P as E,L as f,C as L,a as P,b as z,c as H,T as I,D as q,d as B,e as M,f as _,g as j,I as O,h as R,i as A}from"./dialog-Dwuk2Hgl.js";const G=[["path",{d:"M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7",key:"1m0v6g"}],["path",{d:"M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z",key:"ohrbg2"}]],J=D("square-pen",G);function U(){const s=S(),[m,g]=t.useState([]),[p,x]=t.useState(!0),[k,o]=t.useState(!1),[c,h]=t.useState(null),[l,i]=t.useState({name:"",text:""}),[w,u]=t.useState(!1);t.useEffect(()=>{d()},[]);const d=async()=>{try{x(!0);const a=await b();g(a.workflows)}catch(a){console.error("Failed to load workflows:",a)}finally{x(!1)}},v=()=>{h(null),i({name:"",text:""}),o(!0)},N=a=>{h(a),i({name:a.name,text:a.text}),o(!0)},C=async()=>{try{u(!0),c?await F(c.uuid,l):await T(l),o(!1),d()}catch(a){console.error("Failed to save workflow:",a)}finally{u(!1)}},y=async a=>{if(window.confirm(s.workflows.deleteConfirm))try{await W(a),d()}catch(n){console.error("Failed to delete workflow:",n)}};return e.jsxs("div",{className:"container mx-auto p-6 max-w-7xl",children:[e.jsxs("div",{className:"flex justify-between items-center mb-6",children:[e.jsx("h1",{className:"text-3xl font-bold",children:s.workflows.title}),e.jsxs(r,{onClick:v,children:[e.jsx(E,{className:"w-4 h-4 mr-2"}),s.workflows.createNew]})]}),p?e.jsx("div",{className:"flex justify-center items-center h-64",children:e.jsx(f,{className:"w-8 h-8 animate-spin text-slate-400"})}):m.length===0?e.jsx("div",{className:"text-center py-12",children:e.jsx("p",{className:"text-slate-500 dark:text-slate-400",children:s.workflows.empty})}):e.jsx("div",{className:"grid gap-4 md:grid-cols-2 lg:grid-cols-3",children:m.map(a=>e.jsxs(L,{className:"hover:shadow-md transition-shadow",children:[e.jsx(P,{children:e.jsx(z,{className:"text-lg",children:a.name})}),e.jsxs(H,{children:[e.jsx("p",{className:"text-sm text-slate-600 dark:text-slate-400 mb-4 line-clamp-3",children:a.text}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(r,{variant:"outline",size:"sm",onClick:()=>N(a),children:[e.jsx(J,{className:"w-3 h-3 mr-1"}),s.common.edit]}),e.jsxs(r,{variant:"destructive",size:"sm",onClick:()=>y(a.uuid),children:[e.jsx(I,{className:"w-3 h-3 mr-1"}),s.common.delete]})]})]})]},a.uuid))}),e.jsx(q,{open:k,onOpenChange:o,children:e.jsxs(B,{className:"sm:max-w-[600px]",children:[e.jsx(M,{children:e.jsx(_,{children:c?s.workflows.edit:s.workflows.create})}),e.jsxs("div",{className:"space-y-4 py-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(j,{htmlFor:"name",children:s.workflows.name}),e.jsx(O,{id:"name",value:l.name,onChange:a=>i(n=>({...n,name:a.target.value})),placeholder:s.workflows.namePlaceholder})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(j,{htmlFor:"text",children:s.workflows.text}),e.jsx(R,{id:"text",value:l.text,onChange:a=>i(n=>({...n,text:a.target.value})),placeholder:s.workflows.textPlaceholder,rows:6,className:"resize-none !rounded-lg"})]})]}),e.jsxs(A,{children:[e.jsx(r,{variant:"outline",onClick:()=>o(!1),children:s.common.cancel}),e.jsx(r,{onClick:C,disabled:!l.name.trim()||!l.text.trim()||w,children:w?e.jsxs(e.Fragment,{children:[e.jsx(f,{className:"w-4 h-4 mr-2 animate-spin"}),s.common.loading]}):s.common.save})]})]})})]})}export{U as component};
|
|
Binary file
|
AutoGLM_GUI/static/index.html
CHANGED
|
@@ -4,8 +4,15 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>AutoGLM GUI</title>
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
|
|
8
|
+
<!-- Favicons -->
|
|
9
|
+
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
|
|
10
|
+
<link rel="apple-touch-icon" sizes="180x180" href="/logo-192.png" />
|
|
11
|
+
<link rel="icon" type="image/png" sizes="192x192" href="/logo-192.png" />
|
|
12
|
+
<link rel="icon" type="image/png" sizes="512x512" href="/logo-512.png" />
|
|
13
|
+
<meta name="theme-color" content="#f5f1e8" />
|
|
14
|
+
<script type="module" crossorigin src="/assets/index-CvQkCi2d.js"></script>
|
|
15
|
+
<link rel="stylesheet" crossorigin href="/assets/index-BjYIY--m.css">
|
|
9
16
|
</head>
|
|
10
17
|
<body>
|
|
11
18
|
<div id="app"></div>
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"""Workflow 管理模块.
|
|
2
|
+
|
|
3
|
+
Features:
|
|
4
|
+
- 单例模式
|
|
5
|
+
- JSON 文件持久化
|
|
6
|
+
- 基于 mtime 的缓存机制
|
|
7
|
+
- 原子文件写入
|
|
8
|
+
- UUID 生成
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import json
|
|
12
|
+
import uuid as uuid_lib
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Optional
|
|
15
|
+
|
|
16
|
+
from AutoGLM_GUI.logger import logger
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class WorkflowManager:
|
|
20
|
+
"""Workflow 管理器(单例模式)."""
|
|
21
|
+
|
|
22
|
+
_instance: Optional["WorkflowManager"] = None
|
|
23
|
+
|
|
24
|
+
def __new__(cls):
|
|
25
|
+
"""单例模式:确保只有一个实例."""
|
|
26
|
+
if cls._instance is None:
|
|
27
|
+
cls._instance = super().__new__(cls)
|
|
28
|
+
return cls._instance
|
|
29
|
+
|
|
30
|
+
def __init__(self):
|
|
31
|
+
"""初始化管理器."""
|
|
32
|
+
if hasattr(self, "_initialized"):
|
|
33
|
+
return
|
|
34
|
+
self._initialized = True
|
|
35
|
+
self._workflows_path = Path.home() / ".config" / "autoglm" / "workflows.json"
|
|
36
|
+
self._file_cache: Optional[list[dict]] = None
|
|
37
|
+
self._file_mtime: Optional[float] = None
|
|
38
|
+
|
|
39
|
+
def list_workflows(self) -> list[dict]:
|
|
40
|
+
"""获取所有 workflows.
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
list[dict]: Workflow 列表
|
|
44
|
+
"""
|
|
45
|
+
return self._load_workflows()
|
|
46
|
+
|
|
47
|
+
def get_workflow(self, uuid: str) -> dict | None:
|
|
48
|
+
"""根据 UUID 获取单个 workflow.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
uuid: Workflow UUID
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
dict | None: Workflow 数据,如果不存在则返回 None
|
|
55
|
+
"""
|
|
56
|
+
workflows = self._load_workflows()
|
|
57
|
+
return next((wf for wf in workflows if wf["uuid"] == uuid), None)
|
|
58
|
+
|
|
59
|
+
def create_workflow(self, name: str, text: str) -> dict:
|
|
60
|
+
"""创建新 workflow.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
name: Workflow 名称
|
|
64
|
+
text: Workflow 任务内容
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
dict: 新创建的 workflow
|
|
68
|
+
"""
|
|
69
|
+
workflows = self._load_workflows()
|
|
70
|
+
new_workflow = {
|
|
71
|
+
"uuid": str(uuid_lib.uuid4()),
|
|
72
|
+
"name": name,
|
|
73
|
+
"text": text,
|
|
74
|
+
}
|
|
75
|
+
workflows.append(new_workflow)
|
|
76
|
+
self._save_workflows(workflows)
|
|
77
|
+
logger.info(f"Created workflow: {name} (uuid={new_workflow['uuid']})")
|
|
78
|
+
return new_workflow
|
|
79
|
+
|
|
80
|
+
def update_workflow(self, uuid: str, name: str, text: str) -> dict | None:
|
|
81
|
+
"""更新 workflow.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
uuid: Workflow UUID
|
|
85
|
+
name: 新名称
|
|
86
|
+
text: 新任务内容
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
dict | None: 更新后的 workflow,如果不存在则返回 None
|
|
90
|
+
"""
|
|
91
|
+
workflows = self._load_workflows()
|
|
92
|
+
for wf in workflows:
|
|
93
|
+
if wf["uuid"] == uuid:
|
|
94
|
+
wf["name"] = name
|
|
95
|
+
wf["text"] = text
|
|
96
|
+
self._save_workflows(workflows)
|
|
97
|
+
logger.info(f"Updated workflow: {name} (uuid={uuid})")
|
|
98
|
+
return wf
|
|
99
|
+
logger.warning(f"Workflow not found for update: uuid={uuid}")
|
|
100
|
+
return None
|
|
101
|
+
|
|
102
|
+
def delete_workflow(self, uuid: str) -> bool:
|
|
103
|
+
"""删除 workflow.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
uuid: Workflow UUID
|
|
107
|
+
|
|
108
|
+
Returns:
|
|
109
|
+
bool: 删除成功返回 True,不存在返回 False
|
|
110
|
+
"""
|
|
111
|
+
workflows = self._load_workflows()
|
|
112
|
+
original_len = len(workflows)
|
|
113
|
+
workflows = [wf for wf in workflows if wf["uuid"] != uuid]
|
|
114
|
+
if len(workflows) < original_len:
|
|
115
|
+
self._save_workflows(workflows)
|
|
116
|
+
logger.info(f"Deleted workflow: uuid={uuid}")
|
|
117
|
+
return True
|
|
118
|
+
logger.warning(f"Workflow not found for deletion: uuid={uuid}")
|
|
119
|
+
return False
|
|
120
|
+
|
|
121
|
+
def _load_workflows(self) -> list[dict]:
|
|
122
|
+
"""从文件加载(带 mtime 缓存).
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
list[dict]: Workflow 列表
|
|
126
|
+
"""
|
|
127
|
+
if not self._workflows_path.exists():
|
|
128
|
+
return []
|
|
129
|
+
|
|
130
|
+
# 检查缓存
|
|
131
|
+
current_mtime = self._workflows_path.stat().st_mtime
|
|
132
|
+
if self._file_mtime == current_mtime and self._file_cache is not None:
|
|
133
|
+
return self._file_cache.copy()
|
|
134
|
+
|
|
135
|
+
# 重新加载
|
|
136
|
+
try:
|
|
137
|
+
with open(self._workflows_path, "r", encoding="utf-8") as f:
|
|
138
|
+
data = json.load(f)
|
|
139
|
+
workflows = data.get("workflows", [])
|
|
140
|
+
self._file_cache = workflows
|
|
141
|
+
self._file_mtime = current_mtime
|
|
142
|
+
logger.debug(f"Loaded {len(workflows)} workflows from file")
|
|
143
|
+
return workflows.copy()
|
|
144
|
+
except (json.JSONDecodeError, FileNotFoundError) as e:
|
|
145
|
+
logger.warning(f"Failed to load workflows: {e}")
|
|
146
|
+
return []
|
|
147
|
+
|
|
148
|
+
def _save_workflows(self, workflows: list[dict]) -> bool:
|
|
149
|
+
"""原子写入文件.
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
workflows: Workflow 列表
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
bool: 保存成功返回 True
|
|
156
|
+
"""
|
|
157
|
+
self._workflows_path.parent.mkdir(parents=True, exist_ok=True)
|
|
158
|
+
|
|
159
|
+
data = {"workflows": workflows}
|
|
160
|
+
|
|
161
|
+
# 原子写入:临时文件 + rename
|
|
162
|
+
temp_path = self._workflows_path.with_suffix(".tmp")
|
|
163
|
+
try:
|
|
164
|
+
with open(temp_path, "w", encoding="utf-8") as f:
|
|
165
|
+
json.dump(data, f, indent=2, ensure_ascii=False)
|
|
166
|
+
temp_path.replace(self._workflows_path)
|
|
167
|
+
|
|
168
|
+
# 更新缓存
|
|
169
|
+
self._file_cache = workflows.copy()
|
|
170
|
+
self._file_mtime = self._workflows_path.stat().st_mtime
|
|
171
|
+
logger.debug(f"Saved {len(workflows)} workflows to file")
|
|
172
|
+
return True
|
|
173
|
+
except Exception as e:
|
|
174
|
+
logger.error(f"Failed to save workflows: {e}")
|
|
175
|
+
if temp_path.exists():
|
|
176
|
+
temp_path.unlink()
|
|
177
|
+
return False
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
# 单例实例
|
|
181
|
+
workflow_manager = WorkflowManager()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: autoglm-gui
|
|
3
|
-
Version: 1.1
|
|
3
|
+
Version: 1.2.1
|
|
4
4
|
Summary: Web GUI for AutoGLM Phone Agent - AI-powered Android automation
|
|
5
5
|
Project-URL: Homepage, https://github.com/suyiiyii/AutoGLM-GUI
|
|
6
6
|
Project-URL: Repository, https://github.com/suyiiyii/AutoGLM-GUI
|
|
@@ -30,11 +30,15 @@ Requires-Dist: uvicorn[standard]>=0.38.0
|
|
|
30
30
|
Requires-Dist: zeroconf>=0.148.0
|
|
31
31
|
Description-Content-Type: text/markdown
|
|
32
32
|
|
|
33
|
+
<div align="center">
|
|
34
|
+
|
|
35
|
+
<img src="https://github.com/user-attachments/assets/bbdaeb1c-b7f2-4a4b-a11a-34db4de0ba12" alt="autoglm-gui" width="150">
|
|
36
|
+
|
|
33
37
|
# AutoGLM-GUI
|
|
34
38
|
|
|
35
39
|
AutoGLM 手机助手的现代化 Web 图形界面 - 让 AI 自动化操作 Android 设备变得简单
|
|
36
40
|
|
|
37
|
-
**🎉 Android 11+
|
|
41
|
+
**🎉 Android 11+ 设备现已支持完全无线连接,扫码即配对,无需数据线!🎉**
|
|
38
42
|
|
|
39
43
|

|
|
40
44
|

|
|
@@ -43,11 +47,17 @@ AutoGLM 手机助手的现代化 Web 图形界面 - 让 AI 自动化操作 Andro
|
|
|
43
47
|
<a href="https://qm.qq.com/q/J5eAs9tn0W" target="__blank">
|
|
44
48
|
<strong>欢迎加入讨论交流群</strong>
|
|
45
49
|
</a>
|
|
50
|
+
|
|
51
|
+
[English Documentation](README_EN.md)
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
|
|
46
55
|
## ✨ 特性
|
|
47
56
|
|
|
48
57
|
- **完全无线配对** - 🆕 支持 Android 11+ 二维码扫码配对,无需数据线即可连接设备
|
|
49
58
|
- **多设备并发控制** - 同时管理和控制多个 Android 设备,设备间状态完全隔离
|
|
50
59
|
- **对话式任务管理** - 通过聊天界面控制 Android 设备
|
|
60
|
+
- **Workflow 工作流** - 🆕 预定义常用任务,一键快速执行,支持创建、编辑、删除和管理
|
|
51
61
|
- **实时屏幕预览** - 基于 scrcpy 的低延迟视频流,随时查看设备正在执行的操作
|
|
52
62
|
- **直接操控手机** - 在实时画面上直接点击、滑动操作,支持精准坐标转换和视觉反馈
|
|
53
63
|
- **零配置部署** - 支持任何 OpenAI 兼容的 LLM API
|
|
@@ -62,9 +72,9 @@ AutoGLM 手机助手的现代化 Web 图形界面 - 让 AI 自动化操作 Andro
|
|
|
62
72
|
|
|
63
73
|
| 操作系统 | 下载链接 | 说明 |
|
|
64
74
|
|---------|---------|------|
|
|
65
|
-
| 🪟 **Windows** (x64) | [📦 下载便携版 EXE](https://github.com/suyiiyii/AutoGLM-GUI/releases/download/v1.1
|
|
66
|
-
| 🍎 **macOS** (Apple Silicon) | [📦 下载 DMG](https://github.com/suyiiyii/AutoGLM-GUI/releases/download/v1.1
|
|
67
|
-
| 🐧 **Linux** (x64) | [📦 下载 AppImage](https://github.com/suyiiyii/AutoGLM-GUI/releases/download/v1.1
|
|
75
|
+
| 🪟 **Windows** (x64) | [📦 下载便携版 EXE](https://github.com/suyiiyii/AutoGLM-GUI/releases/download/v1.2.1/AutoGLM.GUI.1.2.1.exe) | 适用于 Windows 10/11,免安装 |
|
|
76
|
+
| 🍎 **macOS** (Apple Silicon) | [📦 下载 DMG](https://github.com/suyiiyii/AutoGLM-GUI/releases/download/v1.2.1/AutoGLM.GUI-1.2.1-arm64.dmg) | 适用于 M 芯片 Mac |
|
|
77
|
+
| 🐧 **Linux** (x64) | [📦 下载 AppImage](https://github.com/suyiiyii/AutoGLM-GUI/releases/download/v1.2.1/AutoGLM.GUI-1.2.1.AppImage) \| [deb](https://github.com/suyiiyii/AutoGLM-GUI/releases/download/v1.2.1/autoglm-gui_1.2.1_amd64.deb) \| [tar.gz](https://github.com/suyiiyii/AutoGLM-GUI/releases/download/v1.2.1/autoglm-gui-1.2.1.tar.gz) | 通用格式,支持主流发行版 |
|
|
68
78
|
|
|
69
79
|
</div>
|
|
70
80
|
|
|
@@ -258,6 +268,41 @@ AutoGLM-GUI 支持同时控制多个 Android 设备:
|
|
|
258
268
|
5. **精准转换** - 自动处理屏幕缩放和坐标转换,确保操作位置准确
|
|
259
269
|
6. **显示模式** - 支持自动、视频流、截图三种显示模式切换
|
|
260
270
|
|
|
271
|
+
### Workflow 工作流管理
|
|
272
|
+
|
|
273
|
+
将常用任务保存为 Workflow,实现一键快速执行:
|
|
274
|
+
|
|
275
|
+
#### 创建和管理 Workflow
|
|
276
|
+
|
|
277
|
+
1. **进入管理页面** - 点击左侧导航栏的 Workflows 图标(📋)
|
|
278
|
+
2. **新建 Workflow** - 点击右上角"新建 Workflow"按钮
|
|
279
|
+
3. **填写信息**:
|
|
280
|
+
- **名称**:给 Workflow 起一个简短易记的名称(如:"订购霸王茶姬")
|
|
281
|
+
- **任务内容**:详细描述要执行的任务(如:"去美团点一杯霸王茶姬的伯牙绝弦,要去冰,加珍珠")
|
|
282
|
+
4. **保存** - 点击保存按钮即可
|
|
283
|
+
|
|
284
|
+
**管理操作**:
|
|
285
|
+
- **编辑** - 点击 Workflow 卡片上的"编辑"按钮修改内容
|
|
286
|
+
- **删除** - 点击"删除"按钮移除不需要的 Workflow
|
|
287
|
+
- **预览** - Workflow 卡片显示任务内容的前几行预览
|
|
288
|
+
|
|
289
|
+
#### 快速执行 Workflow
|
|
290
|
+
|
|
291
|
+
在 Chat 界面执行已保存的 Workflow:
|
|
292
|
+
|
|
293
|
+
1. **选择设备** - 确保已选择并初始化目标设备
|
|
294
|
+
2. **打开 Workflow 选择器** - 点击输入框旁边的 Workflow 按钮(📋 图标)
|
|
295
|
+
3. **选择要执行的任务** - 从列表中点击你想执行的 Workflow
|
|
296
|
+
4. **自动填充** - 任务内容会自动填入输入框
|
|
297
|
+
5. **发送执行** - 点击发送按钮开始执行
|
|
298
|
+
|
|
299
|
+
**使用场景示例**:
|
|
300
|
+
- 📱 **日常任务**:订外卖、打车、查快递
|
|
301
|
+
- 🎮 **游戏操作**:每日签到、领取奖励
|
|
302
|
+
- 📧 **消息发送**:固定内容的消息群发
|
|
303
|
+
- 🔄 **重复操作**:定期执行的维护任务
|
|
304
|
+
|
|
305
|
+
|
|
261
306
|
|
|
262
307
|
## 🛠️ 开发指南
|
|
263
308
|
|
|
@@ -287,7 +332,7 @@ Apache License 2.0
|
|
|
287
332
|
|
|
288
333
|
### 许可证说明
|
|
289
334
|
|
|
290
|
-
AutoGLM-GUI
|
|
335
|
+
AutoGLM-GUI 打包了 ADB Keyboard APK (`com.android.adbkeyboard`),该组件使用 GPL-2.0 许可证。ADB Keyboard 组件作为独立工具使用,不影响 AutoGLM-GUI 本身的 MIT 许可。
|
|
291
336
|
|
|
292
337
|
详见:`AutoGLM_GUI/resources/apks/ADBKeyBoard.LICENSE.txt`
|
|
293
338
|
|
|
@@ -2,17 +2,21 @@ AutoGLM_GUI/__init__.py,sha256=ic002QIj6sw9cyhh7e_60DFIb7omtPcF01-L6M4lllM,2176
|
|
|
2
2
|
AutoGLM_GUI/__main__.py,sha256=ogFi2KO9kCn47ZvT5jqBzoBTnqG191TFKfEM9lcal1w,6390
|
|
3
3
|
AutoGLM_GUI/config.py,sha256=SRBPcIKqR5HxrxiiwpOUAPxHvp-36igtFhDEptG_Zz4,619
|
|
4
4
|
AutoGLM_GUI/config_manager.py,sha256=xbiwKbg6XuXps21pstVRPlGzRbVEzSx5p0-ElnEP8hg,17625
|
|
5
|
-
AutoGLM_GUI/
|
|
5
|
+
AutoGLM_GUI/device_manager.py,sha256=dAHP29a63H6GY43f715dOlJdwOz1eWa2XnPf2_SbIiY,26923
|
|
6
|
+
AutoGLM_GUI/exceptions.py,sha256=YnN1qJdWgC8LholEGd3nman2G-ylXgcUdZJdilsHf8A,499
|
|
6
7
|
AutoGLM_GUI/logger.py,sha256=wLzjbRqsHAsOtI9yB0bcUZFVzgGK6qM8330std6FjVw,2553
|
|
8
|
+
AutoGLM_GUI/phone_agent_manager.py,sha256=bun1DUqCRGwIKsTVeBKI6U09nHtWZRuSTYhCWlLfTnI,18104
|
|
9
|
+
AutoGLM_GUI/phone_agent_patches.py,sha256=-RfpL9RHxOI2GyC2v8L49S0gXiK8l1cldEX3Ysrpl5c,4887
|
|
7
10
|
AutoGLM_GUI/platform_utils.py,sha256=bYlQGAYYpU1ZqOUD-F-fIzpEA5z53dMFfaErsFhAvYk,2357
|
|
8
|
-
AutoGLM_GUI/schemas.py,sha256=
|
|
11
|
+
AutoGLM_GUI/schemas.py,sha256=BPXf4XhzTfKqFKA8jZklQ2XFGQA7n4uJPx70omfxn8c,15432
|
|
9
12
|
AutoGLM_GUI/scrcpy_protocol.py,sha256=h6AtAGq3zMM30FWM7EYiYKJz7BDikpNCOjcKtFcRx3s,997
|
|
10
13
|
AutoGLM_GUI/scrcpy_stream.py,sha256=-tGyDNaML1TnZLzTNiVUgxMTv_7TQS0CKZ35G2RuPfg,16595
|
|
11
14
|
AutoGLM_GUI/server.py,sha256=GGGz7llG5rflIpO61nil8Zde12PLkv6OIzghuxwSkoI,249
|
|
12
15
|
AutoGLM_GUI/socketio_server.py,sha256=__fWLlqBYFFl1YXanm8Vls-_Wr8pQ68kU7N_3q4WZfY,3535
|
|
13
|
-
AutoGLM_GUI/state.py,sha256=
|
|
16
|
+
AutoGLM_GUI/state.py,sha256=ziw-t69JrojUOfzuNmVrZPc6J3-adBFpN4J3Xhq1sdU,1825
|
|
14
17
|
AutoGLM_GUI/version.py,sha256=z0MPXu-k9UO7RXxVGcAwim2M3yklrRqLwgOq66zSdzo,178
|
|
15
|
-
AutoGLM_GUI/
|
|
18
|
+
AutoGLM_GUI/workflow_manager.py,sha256=AZ_zrhSeEvtlF1HTNMNS3f4qBwRuX-bzImdZEVZVXV8,5552
|
|
19
|
+
AutoGLM_GUI/adb_plus/__init__.py,sha256=4F4IIRejvrNArMi1xoyMmSLpsQcC3iy-frBEPXkNR5w,945
|
|
16
20
|
AutoGLM_GUI/adb_plus/device.py,sha256=nCMDUd18LPfl5CsJeDjKd9HSt6FFOy2jS1muOSeLO08,1683
|
|
17
21
|
AutoGLM_GUI/adb_plus/ip.py,sha256=dt6ffIjiW_jGoEqUKUDi9fRGbWN1W9LxfT8rWIqgS-0,2200
|
|
18
22
|
AutoGLM_GUI/adb_plus/keyboard_installer.py,sha256=dsQqLgWd2kkTeljdTTT77mFwJpcM-IJecMcJJEutbHo,13541
|
|
@@ -20,21 +24,29 @@ AutoGLM_GUI/adb_plus/mdns.py,sha256=AwQ4MQsPKVW1tPjIUpOWvBQGlJxvVrO9eTvxoqsgPUo,
|
|
|
20
24
|
AutoGLM_GUI/adb_plus/pair.py,sha256=3UElG0yjylhmZBtPpDER2BNMZs9CwDeavjuQOwOC4sw,1945
|
|
21
25
|
AutoGLM_GUI/adb_plus/qr_pair.py,sha256=K0Jnn5FcuQVU7cM74BTi7WdKh3UF9H85qyua9YPwIEE,13574
|
|
22
26
|
AutoGLM_GUI/adb_plus/screenshot.py,sha256=pr7BpmUcGZO9rthpDeMRn4D1oAGX9aEEVL3ZnTQzrIo,3211
|
|
23
|
-
AutoGLM_GUI/adb_plus/serial.py,sha256=
|
|
27
|
+
AutoGLM_GUI/adb_plus/serial.py,sha256=lDbBXTIoOJ5lbFj50K5X7PZnfpKt1vRpFiWVjolfEhQ,3142
|
|
24
28
|
AutoGLM_GUI/adb_plus/touch.py,sha256=7cyMon9nOd6zQvZdHK7BHWoRLLWkdK-qWfTuSFfFzJA,2301
|
|
25
|
-
AutoGLM_GUI/
|
|
26
|
-
AutoGLM_GUI/api/
|
|
29
|
+
AutoGLM_GUI/adb_plus/version.py,sha256=u5u1N40izJceeORN9kFhyz0wq_hZtlwBXaiytfA3px8,2428
|
|
30
|
+
AutoGLM_GUI/api/__init__.py,sha256=q9cF2jHvAvJu-Sme1Edf8K3EP9CpYNCOSkaSCvevS5k,2844
|
|
31
|
+
AutoGLM_GUI/api/agents.py,sha256=co7Viu6iqg9-TXxMUCkxy-O0CrXnf0HmZiT-l3_Q6eo,21541
|
|
27
32
|
AutoGLM_GUI/api/control.py,sha256=G-7hfdqTl5fq-UXOwE2CI_HMbfmRH1Vd589t2FTNZyY,3155
|
|
28
|
-
AutoGLM_GUI/api/devices.py,sha256=
|
|
33
|
+
AutoGLM_GUI/api/devices.py,sha256=AzHUwFGjaj5xaHMmDylyNy0CUGZQHwlCdE3t41azqQk,11186
|
|
29
34
|
AutoGLM_GUI/api/media.py,sha256=Ioncwd68CNkYvqmeTJJ3P5I1rjWfw6PM4WPz5Ixx8vI,1631
|
|
30
35
|
AutoGLM_GUI/api/version.py,sha256=ZN99iH2PA_qx5A1fnSEO-Yihh4K7Bc4r1jOnP6IcXZo,5861
|
|
31
|
-
AutoGLM_GUI/
|
|
32
|
-
AutoGLM_GUI/static/
|
|
33
|
-
AutoGLM_GUI/static/
|
|
34
|
-
AutoGLM_GUI/static/
|
|
35
|
-
AutoGLM_GUI/static/
|
|
36
|
-
AutoGLM_GUI/static/assets/
|
|
36
|
+
AutoGLM_GUI/api/workflows.py,sha256=dis4k8b-xTYL99qlSYev-Qo5a7z9XdwA1xyC8fRJGLE,2360
|
|
37
|
+
AutoGLM_GUI/static/favicon.ico,sha256=uB4wrcENiFaF-K4V-FzNp51XLW8GC4-ujpBDHgISfGM,781
|
|
38
|
+
AutoGLM_GUI/static/index.html,sha256=G-YutPCEfDwibg_nqlpsOo0wAhciP1NcWk867XPPjFc,761
|
|
39
|
+
AutoGLM_GUI/static/logo-192.png,sha256=FOXgZxFrN0ZleO0VjlCnvD5cDkd1okJPkwPDZqsflNs,35243
|
|
40
|
+
AutoGLM_GUI/static/logo-512.png,sha256=HlwSg09dQ3_Jtb09Ght4l2VK3YNLZlP_941LCdpDkWk,251598
|
|
41
|
+
AutoGLM_GUI/static/assets/about-BtBH1xKN.js,sha256=MBfgBt5H-NGe8W3_M2lkv_lL5rCKIW1EdqsfgL-vdV0,155
|
|
42
|
+
AutoGLM_GUI/static/assets/chat-DPzFNNGu.js,sha256=hnXlEg1UU_a367Kfgj9tRjIRranXTaVetAJBBUsOlDY,270658
|
|
43
|
+
AutoGLM_GUI/static/assets/dialog-Dwuk2Hgl.js,sha256=s02rPAWUvpZsR7qeWwsfSho-Vv9uNstjf7FRl6_aVoA,27348
|
|
44
|
+
AutoGLM_GUI/static/assets/index-B_AaKuOT.js,sha256=Y2BcN31l7f24AY1p2MAJAwDpITWCjiDAsRVbG9vzywQ,229
|
|
45
|
+
AutoGLM_GUI/static/assets/index-BjYIY--m.css,sha256=VOiK2srNO8IUiVRALg1ew8UvkNQH7GvaR-pTltZlSDw,74549
|
|
46
|
+
AutoGLM_GUI/static/assets/index-CvQkCi2d.js,sha256=3P-Bg1VTjguxms5oVccNR8yalBjJJKjEciZLrA5ZAyQ,381471
|
|
47
|
+
AutoGLM_GUI/static/assets/logo-Cyfm06Ym.png,sha256=6GRUFH2KNmB4ZmnrmJ1wxpoIYEmOW-__XlmKImyAMKM,4955675
|
|
37
48
|
AutoGLM_GUI/static/assets/worker-D6BRitjy.js,sha256=RL1NIRIks9dXdDhXOHK1cCg-OELT0uv9a6u_UEHfQ0Q,173494
|
|
49
|
+
AutoGLM_GUI/static/assets/workflows-xX_QH-wI.js,sha256=jJ1JPZZZXB_q69tDrMDdY9YNzmLIYV8JFmSX5KrAQq4,3459
|
|
38
50
|
phone_agent/__init__.py,sha256=7sCmGiY-ePdb6L08MGG6DkOiu8goop6wq-v2SiM62tE,360
|
|
39
51
|
phone_agent/agent.py,sha256=1SgHpv70_XbujG1ElYRZbvRO5-d4l7gBgiFRBz_FIH8,8157
|
|
40
52
|
phone_agent/agent_ios.py,sha256=R7EBsoHVghEUBtI5TB7M0_btpFcb4NHquMNxktrqrJE,9338
|
|
@@ -69,8 +81,8 @@ phone_agent/xctest/device.py,sha256=sOAPMoliMIabcrtsmzuGDKnZXtitqlc0lo8RSjQta7A,
|
|
|
69
81
|
phone_agent/xctest/input.py,sha256=aMp1YCRGBtGsRMKhA9rrjxuLkri0_k3n6hisi0EBJ2o,8164
|
|
70
82
|
phone_agent/xctest/screenshot.py,sha256=H6dsQGgf38h8dvuSeigiR2Qr8NucPanIgTK8kjlV9hA,6027
|
|
71
83
|
scrcpy-server-v3.3.3,sha256=fnAyO6fyWWSd1KzOl6xP77roECssbZHi575hP9U1S-A,90164
|
|
72
|
-
autoglm_gui-1.1.
|
|
73
|
-
autoglm_gui-1.1.
|
|
74
|
-
autoglm_gui-1.1.
|
|
75
|
-
autoglm_gui-1.1.
|
|
76
|
-
autoglm_gui-1.1.
|
|
84
|
+
autoglm_gui-1.2.1.dist-info/METADATA,sha256=UZJ6yT-m-qlDuO_dWX8DufuCATkVi-hZ7AosubRzrFY,12453
|
|
85
|
+
autoglm_gui-1.2.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
86
|
+
autoglm_gui-1.2.1.dist-info/entry_points.txt,sha256=sz4rBO_kgrYmOiT0QnhCCv0b9QqBdWyCjugJgY8AEOI,58
|
|
87
|
+
autoglm_gui-1.2.1.dist-info/licenses/LICENSE,sha256=0IkSHDewdtmXnmYzTNq4U47EJYjTuhjQNpT0bZKuqWc,11342
|
|
88
|
+
autoglm_gui-1.2.1.dist-info/RECORD,,
|