@tanzerfe/page-use 0.0.5 → 0.0.6

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/README.md CHANGED
@@ -1,10 +1,6 @@
1
1
  # @tanzerfe/page-use
2
2
 
3
- 基于 [page-agent](https://github.com/alibaba/page-agent) 的页面操作智能体:接收自然语言指令,在当前页面中模拟点击与输入完成操作,并返回结论。
4
-
5
- - **框架无关**:核心不依赖 Vue / React,UI 为 Lit Web Component,在 Shadow DOM 中与宿主样式隔离。
6
- - **可供其它智能体调用**:支持模块 API、function calling 工具、结构化指令块与全局对象 `window.__TZ_PAGE_USE__`。
7
- - **Vue 适配层**:`@tanzerfe/page-use/vue` 提供 `PageUseHost` 组件。
3
+ 用自然语言操作当前页面:输入一句指令,智能体在页面中自动点击、输入并返回结论。基于 [page-agent](https://github.com/alibaba/page-agent),框架无关,附带操作面板与 Vue 组件。
8
4
 
9
5
  ## 安装
10
6
 
@@ -12,315 +8,85 @@
12
8
  pnpm add @tanzerfe/page-use zod
13
9
  ```
14
10
 
15
- `zod` 为必需的 peer 依赖;`vue` / `vue-router` 仅在使用 `@tanzerfe/page-use/vue` 时需要。
16
-
17
11
  ## 快速开始
18
12
 
19
- ### 非 Vue 项目
20
-
21
- ```ts
22
- import { createPageUse, mountPageUseUI, readLauncherSwitch } from '@tanzerfe/page-use'
23
-
24
- const handle = createPageUse({
25
- llm: { baseURL: '/api/llm-proxy/v1', model: 'deepseek-chat' },
26
- appName: '订单管理系统',
27
- getMenus: () => myMenus, // [{ label, path, hidden?, children? }]
28
- routerMode: 'hash', // 或 'history'
29
- })
30
-
31
- // 调试面板:URL 参数 ?pageUseDebug=1 / 0 可临时开关,否则使用 fallback
32
- // 生产环境需由业务系统按需调出时,改为常驻挂载:mountPageUseUI({ launcher: { defaultHidden: true } })
33
- const unmount = mountPageUseUI({ launcher: readLauncherSwitch(import.meta.env.DEV) })
34
-
35
- // 登出 / 卸载时
36
- unmount()
37
- handle.destroy()
38
- ```
39
-
40
- ### Vue 3 项目
13
+ ### Vue 3
41
14
 
42
15
  ```vue
43
16
  <template>
44
- <PageUseHost v-if="options.llm.baseURL" :options="options" :launcher="launcher" />
17
+ <PageUseHost :options="options" launcher />
45
18
  </template>
46
19
 
47
20
  <script setup lang="ts">
48
- import { PageUseHost, readLauncherSwitch, type PageUseOptions } from '@tanzerfe/page-use/vue'
21
+ import { PageUseHost, type PageUseOptions } from '@tanzerfe/page-use/vue'
49
22
 
50
23
  const options: PageUseOptions = {
51
- llm: { baseURL: import.meta.env.VITE_PAGE_USE_BASE_URL },
24
+ llm: { baseURL: '/api/llm-proxy/v1', model: 'deepseek-flash' },
52
25
  appName: '订单管理系统',
53
26
  getMenus: () => permissionStore.menus,
54
27
  }
55
- const launcher = readLauncherSwitch(import.meta.env.DEV) && { scenarios: [/* ... */] }
56
28
  </script>
57
29
  ```
58
30
 
59
- `PageUseHost` 自动完成初始化、UI 挂载与卸载销毁,并从 vue-router 推导 `routerMode`、`getCurrentPath`、`resolveRouteName`(显式传入优先)。UI 挂在 `document.body` 下,无需配置 `isCustomElement`。
60
-
61
- ## 配置 `PageUseOptions`
62
-
63
- | 选项 | 类型 | 默认 | 说明 |
64
- |---|---|---|---|
65
- | `llm.baseURL` | `string` | — | OpenAI 兼容端点(到版本前缀为止),可用相对路径。**为空时能力不可用** |
66
- | `llm.apiKey` | `string` | 空 | 前端直连时使用,生产环境建议留空 |
67
- | `llm.model` | `string` | `deepseek-chat` | 需支持 function calling。默认值仅为示例,使用其它端点时应显式指定 |
68
- | `llm.maxSteps` | `number` | `20` | 单任务最大步数 |
69
- | `llm.disableNamedToolChoice` | `boolean` | `false` | 模型不支持对象形式 `tool_choice` 时开启 |
70
- | `llm.extraBody` | `object` | `{}` | 合并进请求体 |
71
- | `llm.sessionHeader` | `string \| false` | `x-opencode-session` | 会话 ID 请求头,`false` 不发送 |
72
- | `appName` | `string` | — | 写入系统提示 |
73
- | `getMenus` | `() => PageUseMenuNode[]` | 空 | 可见菜单树,用于生成站点地图 |
74
- | `routerMode` | `'hash' \| 'history'` | `'hash'` | 路由模式 |
75
- | `getCurrentPath` | `() => string` | 从 location 读取 | 当前路由路径,不含 `#` |
76
- | `resolveRouteName` | `(path) => string` | — | 由路径解析路由名,用于匹配 `routeHints` |
77
- | `routeHints` | `Record<string, string>` | `{}` | 按页操作提示,key 为路由名或路径(不带前导 `/`) |
78
- | `layoutHint` | `string` | 通用描述 | 替换系统提示中的「页面结构」段落 |
79
- | `beforeTask` | `() => void \| Promise<void>` | — | 任务开始前的预处理,如展开侧栏 |
80
- | `beforeTaskLabel` | `string` | — | `beforeTask` 在设置面板中的显示名 |
81
- | `storageKeyPrefix` | `string` | `tz-page-use` | 本地存储键前缀 |
82
- | `pageAgentOptions` | `Partial<PageAgentConfig>` | `{}` | 透传给 page-agent |
83
- | `exposeGlobal` | `boolean` | `true` | 是否安装 `window.__TZ_PAGE_USE__` |
84
- | `tts` | `PageUseTtsEngine \| PageUseTtsEngine[]` | — | 演示播报的在线语音合成引擎,见「自定义语音合成引擎」 |
85
-
86
- ### 调试面板 `PageUseLauncherConfig`
87
-
88
- | 选项 | 说明 |
89
- |---|---|
90
- | `title` | 标题,默认 `Page Use` |
91
- | `presets` | 追加到「常用」分组的快捷指令 `{ label, task }[]` |
92
- | `scenarios` | 「复杂场景」分组的快捷指令 |
93
- | `menuPresetLimit` | 由菜单生成「打开 XX」的数量上限,默认 6 |
94
- | `sourceLabels` | 任务来源到展示名的映射,如 `{ assistant: 'AI 助手' }` |
95
- | `defaultHidden` | 默认隐藏调试入口,由业务系统调用方法或 URL 参数调出;仅在用户从未关闭 / 显示过入口时生效,默认 `false` |
96
-
97
- **标题栏**:从左到右为状态圆点、标题、执行状态,以及按钮「静音 · 设置(⚙)· 收起(−)· 关闭(×)」。
98
-
99
- - 执行状态:空闲时不显示(悬停状态圆点可查看,设置页顶部显示「当前状态」);其它状态显示「状态 · N 步 · token · 耗时」,token 数小于 1000 显示原值,否则以 `k` / `M` 为单位并保留 1 位小数(如 `12.3k tok`、`1.5M tok`)。
100
- - 静音:仅在任务执行中且开启语音播报时显示,见「演示播报」。
101
- - 收起:面板收起为浮动入口。
102
- - 关闭:隐藏面板与浮动入口,状态持久化,刷新后仍隐藏;重新打开见「调试入口的显示与隐藏」。
103
-
104
- **元信息面板**:在任意连续 5 秒内点击面板标题 10 次打开,用于开发排查,展示包版本、LLM 端点完整地址、模型、API Key 是否已配置(只显示「已配置 / 未配置」,不展示明文)、存储键前缀、当前播报引擎与音色、全部可选引擎(id、名称、是否可用)。点击 ⚙ 位置的按钮返回;打开状态不持久化。设置页不再展示端点与模型。
105
-
106
- #### 快捷指令
107
-
108
- 快捷指令在空执行记录页与输入框上方的「快捷指令」托盘中展示,分组顺序为:
109
-
110
- 1. 「我的」:用户在面板中自定义的指令;没有自定义指令时不显示;
111
- 2. 「常用」:由菜单生成的「打开 XX」(最多 `menuPresetLimit` 条)、库内置通用示例、宿主 `presets`;
112
- 3. 「复杂场景」:宿主 `scenarios`,为空时不显示。
113
-
114
- 设置页最底部的「快捷指令设置」进入编辑视图,标题栏返回按钮依次回到设置页、主视图:
115
-
116
- - 自定义指令:可新增、编辑、删除;名称与指令内容必填,指令内容不能与已有自定义指令重复;新增的指令排在最前。
117
- - 来源指令(上述菜单、内置、`presets`、`scenarios` 四类):可删除。删除只是在本地隐藏,不修改宿主配置。隐藏记录以指令内容(`task`)为标识,宿主修改某条指令的 `task` 后,该条会重新显示。
118
- - 菜单生成的指令被隐藏后,由后续菜单补位,数量仍为 `menuPresetLimit`(可见菜单不足时除外)。
119
- - 「恢复默认指令」:恢复全部已隐藏的来源指令,不影响自定义指令;当前没有被隐藏的来源指令时禁用。
120
- - 任务执行中也可编辑,只影响之后的展示,不影响正在执行的任务。
121
-
122
- 自定义指令与隐藏记录保存在 localStorage,键为 `${storageKeyPrefix}-presets`。宿主也可通过导出的 `pageUsePresets` 读取或维护这些数据(`add` / `update` / `remove` / `hide` / `restoreHidden`,订阅使用 `pageUsePresets.store`)。
123
-
124
- #### 调试入口的显示与隐藏
125
-
126
- 入口是否显示按以下优先级判定(面板挂载时):
127
-
128
- 1. URL 参数 `pageUseDebug`:`1` / `true` 显示,`0` / `false` 隐藏,并写入持久化状态;
129
- 2. 持久化状态(设置 `launcherVisible`,localStorage):用户点击关闭或调用下述方法后写入;
130
- 3. 宿主配置 `defaultHidden`:前两者都未设置时生效,默认显示。
131
-
132
- 业务系统可调用以下方法调出或隐藏入口(显示方法同时展开面板),状态均持久化:
133
-
134
- ```ts
135
- import { showPageUseLauncher, hidePageUseLauncher } from '@tanzerfe/page-use'
136
-
137
- showPageUseLauncher()
138
- hidePageUseLauncher()
139
-
140
- // 不走模块导入时
141
- window.__TZ_PAGE_USE__.showLauncher()
142
- window.__TZ_PAGE_USE__.hideLauncher()
143
- ```
144
-
145
- 方法只作用于已挂载的面板:宿主未挂载面板时调用显示方法只保存状态并在控制台警告。若希望生产环境默认不显示、由业务系统按需调出,应常驻挂载面板并设置 `defaultHidden`:
146
-
147
- ```ts
148
- mountPageUseUI({ launcher: { defaultHidden: true } })
149
- // Vue:<PageUseHost :options="options" :launcher="{ defaultHidden: true }" />
150
- ```
151
-
152
- 用户关闭入口后,也可在 URL 上加 `?pageUseDebug=1` 重新显示。隐藏入口不会中断正在执行的任务,也不影响运行期光晕;此时可通过模块 API 或全局对象的 `stop()` 终止任务。
153
-
154
- 调试面板设置中不提供「显示 page-agent 自带面板」与「定制光晕与光标配色」:自带面板始终隐藏,蒙层始终使用定制光晕与光标配色,本地存储中的旧值会被忽略。`PageUseSettings` 仍保留 `showBuiltinPanel` / `customMaskEffect` 字段,但修改不生效。
155
-
156
- ## 演示播报
157
-
158
- 演示时可用语音同步播报智能体的执行过程。默认使用浏览器语音合成(`speechSynthesis`),无需宿主额外配置;宿主也可注入在线语音合成引擎(见下文「自定义语音合成引擎」)。
159
-
160
- - **开关**:调试面板「设置 → 语音播报」,**默认关闭**,状态保存在本地存储(`voiceEnabled`)。关闭时设置中只显示该开关;开启后显示:
161
- - **播报引擎**(`voiceEngineId`):仅在宿主注入了在线引擎时显示,可在注入引擎与「本地语音(浏览器)」之间切换,切换时立即停止当前播报;
162
- - **语速**(`voiceRate`,倍率 0.5–2,默认 1.1),所有引擎共用;
163
- - **音色**(`voiceNames`,按引擎 id 分别保存):当前引擎提供音色列表时显示,「自动」表示由引擎选择(浏览器引擎为第一个中文语音)。
164
- - **试听**:位于音色下拉框右侧(引擎不提供音色列表时单独一行),用当前引擎、音色与语速播报「您好,我是页面智能体。」;试听中按钮显示「停止」,再次点击、切换引擎或音色、离开设置页、收起或关闭面板时中止。试听与任务播报互斥:任务执行中按钮禁用,任务开始时中止正在进行的试听;当前引擎不可用时同样禁用。试听不受「本次任务静音」影响。**在线引擎每次试听都会发起一次合成请求,消耗一次调用额度。**
165
-
166
- 开关对所有来源的任务生效,包括其它智能体经模块 API、function calling 或全局对象下达的任务。
167
- - **设置字段变更(BREAKING)**:`PageUseSettings.voiceName` 已移除,改为 `voiceNames`(`Record<引擎 id, 音色>`)。本地存储中的旧值在读取时自动迁移为 `voiceNames.browser`,用户已选的浏览器语音不会丢失;直接读取 `voiceName` 的宿主代码需改为读取 `voiceNames.browser`。
168
- - **本次任务静音**:任务执行中且开启语音播报时,面板标题栏显示静音按钮。静音后立即停止当前播报,本次任务剩余的步骤、提问与结论都不播报;再次点击取消静音,只播报之后的内容(不补播)。下一次任务开始时自动恢复。静音状态不持久化,也不修改「语音播报」开关。
169
- - **播报内容**:
170
- - 执行步骤:模型对每一步的目标描述;滚动、等待、结束、提问、出错、重试步骤不播报;
171
- - 提问:模型向用户提出的问题;
172
- - 结论:任务结束时的 `summary`(成功、未达成、出错均播报;被终止的任务不播报)。
173
- - **不阻塞执行**:智能体不等待语音结束。正在播报时到达的新步骤只保留最新一条待播,中间步骤被丢弃;提问与结论会打断当前播报;新任务开始、终止、销毁或关闭开关时停止播报。
174
- - **播报时机**:page-agent 在模型调用内部执行点击等动作,目标描述在动作完成后才可获得,因此播报会略晚于页面变化;模型思考期间没有播报。
175
- - **文本清洗**:播报前去除 Markdown 标记、表格分隔线、链接地址、代码块、emoji 与元素编号(如「索引为 23 的」「[23]」);清洗后超过 240 字(语速 1 时约 1 分钟)时在句子边界截断,并追加提示语「详细内容请查看「面板标题」」(面板标题即 `PageUseLauncherConfig.title`,如「详细内容请查看「页面智能体」」;未挂载调试面板时为「详细内容请查看面板」)。清洗只影响播报,`result.summary`、面板展示与返回给调用方的数据保持原样。
176
- - **提示词**:开启播报后的下一次任务起,系统提示追加一条约束,要求 `next_goal` 写成面向观众的一句中文、不含元素编号;关闭时系统提示不变。执行中切换开关只影响下一次任务的提示词。
177
-
178
- 浏览器语音合成的限制:
179
-
180
- - 可用语音取决于操作系统与浏览器。Windows 上的 Edge / Chrome 有中文语音;Linux 上的 Chromium 通常没有,此时设置面板会提示并使用默认语音。
181
- - 浏览器要求用户与页面交互过才允许发声。从调试面板下达任务、在对话框中输入指令均满足条件;页面加载后未经交互直接调用可能无声。
182
- - `speechSynthesis` 是整个页面共用的队列。提问 / 结论打断时会调用 `speechSynthesis.cancel()`,宿主页面同时在播报的其它语音也会被停止;反之,宿主调用 `cancel()` 也会停止 Page Use 的播报。当前引擎不是浏览器引擎时,包内不调用 `speechSynthesis`。
183
-
184
- ### 自定义语音合成引擎
185
-
186
- 通过 `createPageUse({ tts })` 注入一个或多个实现 `PageUseTtsEngine` 的对象,即可接入在线 TTS 服务商(如讯飞、阿里云、Azure 等,不限厂商)。注入的引擎与内置浏览器引擎一起出现在调试面板「设置 → 语音播报 → 播报引擎」中供切换。播报内容、待播与抢占规则、文本清洗均由包统一处理,引擎只负责播出一段文本。
31
+ ### 其它框架
187
32
 
188
33
  ```ts
189
- import type { PageUseTtsEngine } from '@tanzerfe/page-use'
190
-
191
- const vendorA: PageUseTtsEngine = {
192
- id: 'vendor-a', // 必填,稳定标识:用于保存所选引擎与该引擎的音色
193
- label: '在线语音 A', // 显示在设置面板「播报引擎」下拉框
194
- splitSentences: false, // false:一组句子合并为一次 speak;true:逐句调用
195
- isAvailable: () => typeof WebSocket !== 'undefined',
196
- // 可选;不提供或返回空时不显示音色下拉框
197
- listVoices: () => [{ value: 'voice-1', label: '音色 1' }],
198
- async speak(text, { rate, voice, signal }) {
199
- // rate:语速倍率(1 为正常);voice:该引擎在设置中的音色(空串表示自动);
200
- // signal 触发时立即停止自身的合成与播放并返回
201
- },
202
- }
203
-
204
- createPageUse({ /* ... */, tts: [vendorA, vendorB] }) // 也可传单个对象
205
- ```
206
-
207
- - **`id`**:必填且应保持不变,修改后已保存的引擎选择与音色会失效。`'browser'` 保留给内置浏览器引擎(`BROWSER_ENGINE_ID`);注入的引擎 id 重复或为 `'browser'` 时,保留先出现者并在控制台警告。
208
- - **默认引擎**:浏览器引擎(本地语音)排在「播报引擎」下拉框最前,用户未选择过引擎时使用它,注入的引擎按注入顺序排在其后,需要用户手动切换。已保存的引擎被宿主移除后,播报回退到浏览器引擎,保存的选择不被改写,宿主恢复该引擎后继续生效。
209
- - `speak()` 在播完、失败或被中止时 resolve,**不应 reject**;失败由引擎自行记录(包仍会兜底捕获并继续播报后续内容)。
210
- - 抢占、终止、销毁、关闭开关、本次任务静音或切换引擎时,包通过 `signal` 中止当前 `speak()`。停止播报只作用于引擎自身的音频,不会停止宿主页面上其它来源的语音。
211
- - 引擎的 `isAvailable()` 为 false 时播报静默跳过;设置面板中该引擎不可选并标注「(不可用)」。
212
-
213
- ## 对接方式
34
+ import { createPageUse, mountPageUseUI } from '@tanzerfe/page-use'
214
35
 
215
- ### 1. 模块 API
216
-
217
- ```ts
218
- import { pageUseCapability } from '@tanzerfe/page-use'
36
+ const handle = createPageUse({
37
+ llm: { baseURL: '/api/llm-proxy/v1', model: 'deepseek-flash' },
38
+ appName: '订单管理系统',
39
+ getMenus: () => myMenus, // [{ label, path, children? }]
40
+ })
41
+ const unmount = mountPageUseUI({ launcher: true }) // launcher:显示操作面板
219
42
 
220
- if (pageUseCapability.isReady()) {
221
- const result = await pageUseCapability.run('打开订单列表,筛选待发货并查询,告诉我第一条订单的收货地址', {
222
- source: 'my-agent',
223
- signal: controller.signal,
224
- onProgress: (event) => { if (event.type === 'activity') console.log(event.text) },
225
- onAskUser: async (question) => askInMyChat(question), // 可选
226
- })
227
- // result.status: completed | failed | stopped | error;result.summary 为结论
228
- }
43
+ // 退出登录或卸载时
44
+ unmount()
45
+ handle.destroy()
229
46
  ```
230
47
 
231
- `run()` 不会 reject。任务未能开始时 `status='error'` 并带 `errorCode`:
48
+ ## 常用配置
232
49
 
233
- | errorCode | 含义 |
50
+ | 选项 | 说明 |
234
51
  |---|---|
235
- | `NOT_CONFIGURED` | 未初始化或未配置 `llm.baseURL` |
236
- | `NOT_READY` | 已 `destroy` |
237
- | `BUSY` | 已有任务在执行(同一时刻仅一个任务) |
238
- | `EMPTY_TASK` | 指令为空 |
239
- | `AGENT_ERROR` | agent 构造或钩子抛出错误 |
52
+ | `llm.baseURL` | OpenAI 兼容接口地址,必填 |
53
+ | `llm.model` | 模型名称,需支持 function calling |
54
+ | `appName` | 系统名称 |
55
+ | `getMenus` | 返回当前用户可见的菜单树,帮助智能体找到页面 |
56
+ | `routerMode` | `'hash'`(默认)或 `'history'`,Vue 项目自动识别 |
240
57
 
241
- - 模型提问时依次交由 `onAskUser`、调试面板处理;两者都不可用时自动回复「无法补充信息」。
242
- - 进度可订阅 `pageUseStore` 获取,Vue 中使用 `usePageUseState()`。
58
+ > 请勿在前端配置 API Key,生产环境应由网关或代理注入。
243
59
 
244
- ### 2. LLM function calling
60
+ ## 在其它智能体中调用
245
61
 
246
62
  ```ts
247
- import { PAGE_USE_TOOL, PAGE_USE_TOOL_NAME, runPageUseTool } from '@tanzerfe/page-use'
248
-
249
- // tools: [PAGE_USE_TOOL, ...]
250
- // 模型返回的 tool_call.name === PAGE_USE_TOOL_NAME 时:
251
- const { content } = await runPageUseTool(toolCall.function.arguments, { source: 'my-agent' })
252
- // content 作为 role=tool 的消息回给模型
253
- ```
254
-
255
- ### 3. 结构化指令块
256
-
257
- 模型在回复中输出 `{ "type": "pageAction", "instruction": "..." }`,前端用 `isPageUseCommand(value)` 校验后调用 `pageUseCapability.run(value.instruction)`。
258
-
259
- ### 4. 全局对象
260
-
261
- `window.__TZ_PAGE_USE__` 包含 `pageUseCapability` 的全部方法及 `tool`、`runTool`,以及调试入口的显示控制 `showLauncher()` / `hideLauncher()`(见「调试入口的显示与隐藏」),可用于控制台调试、E2E 脚本和同源外部脚本:
63
+ import { pageUseCapability } from '@tanzerfe/page-use'
262
64
 
263
- ```js
264
- await window.__TZ_PAGE_USE__.run('打开首页')
265
- window.__TZ_PAGE_USE__.showLauncher()
65
+ const result = await pageUseCapability.run('打开订单列表,告诉我第一条订单的收货地址')
66
+ console.log(result.status, result.summary)
266
67
  ```
267
68
 
268
- `showLauncher` / `hideLauncher` 只在全局对象上提供,不属于 `pageUseCapability`(交给其它智能体的执行能力不含 UI 控制)。
69
+ 也可将 `PAGE_USE_TOOL` 作为 function calling 工具提供给模型,并用 `runPageUseTool` 执行。
269
70
 
270
- ## API Key 安全
71
+ ## 操作面板
271
72
 
272
- `llm.apiKey` 会出现在浏览器请求和前端产物中。**生产环境应由网关或代理注入 Key**,前端只传代理地址。
273
-
274
- 本地开发可用 Vite 代理规避 CORS:
275
-
276
- ```ts
277
- // vite.config.ts
278
- server: {
279
- proxy: {
280
- '/__page-use-llm': {
281
- target: 'https://api.deepseek.com/v1',
282
- changeOrigin: true,
283
- rewrite: (p) => p.replace(/^\/__page-use-llm/, ''),
284
- },
285
- },
286
- }
287
- ```
73
+ - 传入 `launcher` 后,面板入口显示在页面右下角,可拖动。
74
+ - 用户关闭后,可在 URL 上加 `?pageUseDebug=1` 重新显示,或由业务系统调用 `showPageUseLauncher()` 调出。
75
+ - 希望默认隐藏、按需调出时,传入 `launcher: { defaultHidden: true }`。
76
+ - 面板支持快捷指令、历史记录与语音播报。
288
77
 
289
78
  ## 主题
290
79
 
291
- 在宿主页面设置 CSS 变量调整配色,例如 `:root { --tz-page-use-primary: #1677ff }`:
292
-
293
- | 变量 | 默认 | 用途 |
294
- |---|---|---|
295
- | `--tz-page-use-primary` | `#0879ff` | 主色:面板按钮、光晕 |
296
- | `--tz-page-use-flow-gradient` | 橙-黄-绿-青-紫径向渐变 | 流光渐变:收起时入口按钮的背景与展开面板的 2px 边框(放大到 300% 循环移动,执行中加速);可替换为任意渐变,如 `radial-gradient(#0879ff, #36cfc9, #597ef7)` |
297
- | `--tz-page-use-cyan` / `--tz-page-use-indigo` | `#36cfc9` / `#597ef7` | 光晕渐变 |
298
- | `--tz-page-use-warning` | `#fa8c16` | 光晕误触警示 |
299
- | `--tz-page-use-success` / `--tz-page-use-error` / `--tz-page-use-warning-text` | — | 面板状态色 |
80
+ 通过 CSS 变量调整主色:
300
81
 
301
- 模拟光标配色见导出常量 `PAGE_USE_MASK_COLORS`。
302
-
303
- ### 机器人图标
304
-
305
- 调试面板入口按钮上的机器人图标以 SVG 字符串常量 `PAGE_USE_ROBOT_ICON_SVG` 导出,供宿主在自身界面中复用(如智能体列表卡片)。颜色跟随 `currentColor`,不含 `width` / `height`,尺寸由宿主 CSS 控制;`viewBox` 为 24×24、线宽 2,小尺寸显示时线条偏粗可用 CSS 覆盖 `stroke-width`。
306
-
307
- ```vue
308
- <template>
309
- <span class="agent-icon" v-html="PAGE_USE_ROBOT_ICON_SVG" />
310
- </template>
311
-
312
- <script setup lang="ts">
313
- import { PAGE_USE_ROBOT_ICON_SVG } from '@tanzerfe/page-use/vue'
314
- </script>
315
-
316
- <style scoped>
317
- .agent-icon :deep(svg) {
318
- width: 18px;
319
- height: 18px;
82
+ ```css
83
+ :root {
84
+ --tz-page-use-primary: #1677ff;
320
85
  }
321
- </style>
322
86
  ```
323
87
 
88
+ 机器人图标以 `PAGE_USE_ROBOT_ICON_SVG` 导出,可在业务界面中复用。
89
+
324
90
  ## License
325
91
 
326
92
  MIT
package/dist/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { A as pageUseSettings, B as browserTtsEngine, C as getPageUseConfig, D as pageUsePresets, E as pageUseStore, F as normalizeOptions, I as readLauncherSwitch, L as PAGE_USE_MASK_COLORS, M as DEFAULT_MODEL, N as DEFAULT_SESSION_HEADER, O as pageUseHistory, P as DEFAULT_STORAGE_KEY_PREFIX, R as SIMULATOR_MASK_ID, S as getElapsedSeconds, T as isRunning, _ as runPageUseTool, a as PAGE_USE_STATIC_PRESETS, b as pageUseCapability, c as PAGE_USE_GLOW_TAG, d as PAGE_USE_GLOBAL_KEY, f as PAGE_USE_COMMAND_TYPE, g as isPageUseCommand, h as formatPageUseResultForModel, i as PageUseLauncherElement, j as DEFAULT_MAX_STEPS, k as DEFAULT_PAGE_USE_SETTINGS, l as PageUseGlowElement, m as PAGE_USE_TOOL_NAME, n as mountPageUseUI, o as buildMenuPresets, p as PAGE_USE_TOOL, r as PAGE_USE_LAUNCHER_TAG, s as PAGE_USE_ROBOT_ICON_SVG, t as definePageUseElements, u as createPageUse, v as hidePageUseLauncher, w as isPageUseConfigured, x as clearPageUseLog, y as showPageUseLauncher, z as BROWSER_ENGINE_ID } from "./src-tOb9oqjb.mjs";
1
+ import { A as pageUseSettings, B as browserTtsEngine, C as getPageUseConfig, D as pageUsePresets, E as pageUseStore, F as normalizeOptions, I as readLauncherSwitch, L as PAGE_USE_MASK_COLORS, M as DEFAULT_MODEL, N as DEFAULT_SESSION_HEADER, O as pageUseHistory, P as DEFAULT_STORAGE_KEY_PREFIX, R as SIMULATOR_MASK_ID, S as getElapsedSeconds, T as isRunning, _ as runPageUseTool, a as PAGE_USE_STATIC_PRESETS, b as pageUseCapability, c as PAGE_USE_GLOW_TAG, d as PAGE_USE_GLOBAL_KEY, f as PAGE_USE_COMMAND_TYPE, g as isPageUseCommand, h as formatPageUseResultForModel, i as PageUseLauncherElement, j as DEFAULT_MAX_STEPS, k as DEFAULT_PAGE_USE_SETTINGS, l as PageUseGlowElement, m as PAGE_USE_TOOL_NAME, n as mountPageUseUI, o as buildMenuPresets, p as PAGE_USE_TOOL, r as PAGE_USE_LAUNCHER_TAG, s as PAGE_USE_ROBOT_ICON_SVG, t as definePageUseElements, u as createPageUse, v as hidePageUseLauncher, w as isPageUseConfigured, x as clearPageUseLog, y as showPageUseLauncher, z as BROWSER_ENGINE_ID } from "./src-CHB0xWWP.mjs";
2
2
 
3
3
  export { BROWSER_ENGINE_ID, DEFAULT_MAX_STEPS, DEFAULT_MODEL, DEFAULT_PAGE_USE_SETTINGS, DEFAULT_SESSION_HEADER, DEFAULT_STORAGE_KEY_PREFIX, PAGE_USE_COMMAND_TYPE, PAGE_USE_GLOBAL_KEY, PAGE_USE_GLOW_TAG, PAGE_USE_LAUNCHER_TAG, PAGE_USE_MASK_COLORS, PAGE_USE_ROBOT_ICON_SVG, PAGE_USE_STATIC_PRESETS, PAGE_USE_TOOL, PAGE_USE_TOOL_NAME, PageUseGlowElement, PageUseLauncherElement, SIMULATOR_MASK_ID, browserTtsEngine, buildMenuPresets, clearPageUseLog, createPageUse, definePageUseElements, formatPageUseResultForModel, getElapsedSeconds, getPageUseConfig, hidePageUseLauncher, isPageUseCommand, isPageUseConfigured, isRunning, mountPageUseUI, normalizeOptions, pageUseCapability, pageUseHistory, pageUsePresets, pageUseSettings, pageUseStore, readLauncherSwitch, runPageUseTool, showPageUseLauncher };
@@ -2058,7 +2058,7 @@ var PageUseGlowElement = class extends LitElement {
2058
2058
 
2059
2059
  //#endregion
2060
2060
  //#region package.json
2061
- var version = "0.0.5";
2061
+ var version = "0.0.6";
2062
2062
 
2063
2063
  //#endregion
2064
2064
  //#region src/ui/drag.ts
@@ -3921,7 +3921,7 @@ var PageUseLauncherElement = class extends LitElement {
3921
3921
  type="button"
3922
3922
  class="btn preview-btn"
3923
3923
  ?disabled=${!available || running}
3924
- title=${running ? "任务执行中不可试听" : "用当前引擎、音色与语速试听"}
3924
+ title=${running ? "任务执行中不可试听" : "按当前设置试听"}
3925
3925
  @click=${() => playing ? stopPreview() : startPreview(engine, {
3926
3926
  rate: settings.voiceRate,
3927
3927
  voice: voiceName
@@ -4231,7 +4231,7 @@ var PageUseLauncherElement = class extends LitElement {
4231
4231
  <button
4232
4232
  type="button"
4233
4233
  class="icon-btn close"
4234
- title="关闭(可调用 showPageUseLauncher 或加 URL 参数 pageUseDebug=1 重新打开)"
4234
+ title="关闭"
4235
4235
  @click=${() => this.close()}
4236
4236
  >
4237
4237
  ${closeIcon}
package/dist/vue.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { A as pageUseSettings, B as browserTtsEngine, C as getPageUseConfig, D as pageUsePresets, E as pageUseStore, F as normalizeOptions, I as readLauncherSwitch, L as PAGE_USE_MASK_COLORS, M as DEFAULT_MODEL, N as DEFAULT_SESSION_HEADER, O as pageUseHistory, P as DEFAULT_STORAGE_KEY_PREFIX, R as SIMULATOR_MASK_ID, S as getElapsedSeconds, T as isRunning, _ as runPageUseTool, a as PAGE_USE_STATIC_PRESETS, b as pageUseCapability, c as PAGE_USE_GLOW_TAG, d as PAGE_USE_GLOBAL_KEY, f as PAGE_USE_COMMAND_TYPE, g as isPageUseCommand, h as formatPageUseResultForModel, i as PageUseLauncherElement, j as DEFAULT_MAX_STEPS, k as DEFAULT_PAGE_USE_SETTINGS, l as PageUseGlowElement, m as PAGE_USE_TOOL_NAME, n as mountPageUseUI, o as buildMenuPresets, p as PAGE_USE_TOOL, r as PAGE_USE_LAUNCHER_TAG, s as PAGE_USE_ROBOT_ICON_SVG, t as definePageUseElements, u as createPageUse, v as hidePageUseLauncher, w as isPageUseConfigured, x as clearPageUseLog, y as showPageUseLauncher, z as BROWSER_ENGINE_ID } from "./src-tOb9oqjb.mjs";
1
+ import { A as pageUseSettings, B as browserTtsEngine, C as getPageUseConfig, D as pageUsePresets, E as pageUseStore, F as normalizeOptions, I as readLauncherSwitch, L as PAGE_USE_MASK_COLORS, M as DEFAULT_MODEL, N as DEFAULT_SESSION_HEADER, O as pageUseHistory, P as DEFAULT_STORAGE_KEY_PREFIX, R as SIMULATOR_MASK_ID, S as getElapsedSeconds, T as isRunning, _ as runPageUseTool, a as PAGE_USE_STATIC_PRESETS, b as pageUseCapability, c as PAGE_USE_GLOW_TAG, d as PAGE_USE_GLOBAL_KEY, f as PAGE_USE_COMMAND_TYPE, g as isPageUseCommand, h as formatPageUseResultForModel, i as PageUseLauncherElement, j as DEFAULT_MAX_STEPS, k as DEFAULT_PAGE_USE_SETTINGS, l as PageUseGlowElement, m as PAGE_USE_TOOL_NAME, n as mountPageUseUI, o as buildMenuPresets, p as PAGE_USE_TOOL, r as PAGE_USE_LAUNCHER_TAG, s as PAGE_USE_ROBOT_ICON_SVG, t as definePageUseElements, u as createPageUse, v as hidePageUseLauncher, w as isPageUseConfigured, x as clearPageUseLog, y as showPageUseLauncher, z as BROWSER_ENGINE_ID } from "./src-CHB0xWWP.mjs";
2
2
  import { defineComponent, inject, onBeforeUnmount, onScopeDispose, shallowRef } from "vue";
3
3
  import { routerKey } from "vue-router";
4
4
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tanzerfe/page-use",
3
3
  "private": false,
4
- "version": "0.0.5",
4
+ "version": "0.0.6",
5
5
  "description": "基于 page-agent 的页面操作智能体:自然语言指令驱动页面点击与输入,框架无关,附 Web Component 调试面板与 Vue 适配层",
6
6
  "type": "module",
7
7
  "main": "./dist/index.mjs",