@tanzerfe/page-use 0.0.7 → 0.0.9

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.
@@ -363,9 +363,19 @@ declare function createPageUse(options: PageUseOptions): PageUseHandle;
363
363
  //#endregion
364
364
  //#region src/ui/launcher.d.ts
365
365
  declare const PAGE_USE_LAUNCHER_TAG = "tz-page-use-launcher";
366
+ /**
367
+ * 面板布局:
368
+ * - `desktop`(默认):可拖动的浮动窗口,展开位置由入口按钮所在角推导;
369
+ * - `mobile`:贴底的移动端面板,宽度占满视口、高度约七成视口,位置不可拖动。
370
+ *
371
+ * 由宿主显式声明,不按视口尺寸或 UA 自动判断:同一页面可能既有窄屏也有宽屏使用场景。
372
+ */
373
+ type PageUseLauncherLayout = 'desktop' | 'mobile';
366
374
  interface PageUseLauncherConfig {
367
375
  /** 入口与面板标题,默认 'Page Use' */
368
376
  title?: string;
377
+ /** 面板布局,默认 'desktop'(与未声明该配置的旧版本行为一致) */
378
+ layout?: PageUseLauncherLayout;
369
379
  /** 追加到「常用」分组的快捷指令(排在菜单生成的「打开 XX」与通用示例之后) */
370
380
  presets?: PageUsePreset[];
371
381
  /** 「复杂场景」分组的快捷指令;为空时不显示该分组 */
@@ -432,7 +442,19 @@ declare class PageUseLauncherElement extends LitElement {
432
442
  private fabFromWidth;
433
443
  /** 进行中宽度过渡的结束回调注销函数;过渡中再次切换时先注销,避免旧回调提前清除宽度 */
434
444
  private fabWidthCleanup;
445
+ /**
446
+ * 本次入口手势是否已判定为拖动。
447
+ * 指针捕获会把手势结束后浏览器补发的 click 重定向到入口,该 click 不是点击意图,不得展开面板。
448
+ */
449
+ private fabDragged;
435
450
  private cleanups;
451
+ /** 生效的面板布局:未声明或取值非法时按桌面端处理,既有接入方的行为不变 */
452
+ private get isMobileLayout();
453
+ /**
454
+ * 下达指令后是否自动收起面板:仅移动端布局生效,默认开启,可在设置页关闭。
455
+ * 桌面端不提供该行为,也不显示设置项,存储中被改过的值在桌面端不生效。
456
+ */
457
+ private get collapseOnRun();
436
458
  private get fabEl();
437
459
  private get panelEl();
438
460
  private get logEl();
@@ -468,10 +490,26 @@ declare class PageUseLauncherElement extends LitElement {
468
490
  private resolvePanelAnchor;
469
491
  /** 未拖动过时用默认角落定位,拖动后切换为 left/top */
470
492
  private fabStyle;
471
- /** 面板位置完全由入口位置推导,展开时与入口重合于同一角 */
493
+ /**
494
+ * 面板位置完全由入口位置推导,展开时与入口重合于同一角。
495
+ * 移动端不使用内联几何:位置与尺寸由 styles.ts 的 .panel.mobile 决定(贴底、占满宽度)。
496
+ */
472
497
  private panelStyle;
473
498
  /** 调试入口是否显示:持久化状态优先,未操作过时跟随宿主 defaultHidden */
474
499
  private isVisible;
500
+ /**
501
+ * 入口按下:先清掉上一次手势遗留的拖动标记,本次是否为拖动由 fabDrag 判定。
502
+ * 必须挂在 pointerdown 最前面,否则拖动未补发 click 时标记会残留到下一次真实点击。
503
+ */
504
+ private onFabPointerDown;
505
+ /**
506
+ * 入口点击展开。
507
+ * 展开动作挂在 click 而非 pointerup:fabDrag 对手势调用 preventDefault 后浏览器没有 mousedown / mouseup 目标,
508
+ * 会在 pointerup 之后按当时坐标重新命中测试补发一次 click;若 pointerup 时面板已展开,
509
+ * 这次 click 就落在与入口重叠的面板底部控件上(「执行」「重跑」或快捷指令胶囊),造成误触提交。
510
+ * 由入口自身消费这次 click,即不再有穿透。
511
+ */
512
+ private onFabClick;
475
513
  /** 展开面板(showPageUseLauncher 调用):等入口按新的显示状态渲染后再测量定位 */
476
514
  private expand;
477
515
  /** 关闭调试入口:收起面板并持久化隐藏状态,之后需调用显示方法或 URL 参数调出 */
@@ -510,6 +548,10 @@ declare class PageUseLauncherElement extends LitElement {
510
548
  private renderChips;
511
549
  /** 分组顺序:我的 → 常用 → 复杂场景;空分组不显示,全部为空时提示去设置中维护 */
512
550
  private renderPresetGroups;
551
+ /**
552
+ * checked 为复选框的显示状态,默认取存储值。
553
+ * 「未设置时按布局取默认」的设置项(如 autoCollapseOnRun)需要传生效值,否则未操作过时显示与生效状态不一致。
554
+ */
513
555
  private renderCheckbox;
514
556
  private renderSettings;
515
557
  /** 打开表单:id 为 null 时新增,否则编辑该条;替换当前未保存的草稿 */
@@ -719,6 +761,11 @@ interface PageUseSettings {
719
761
  * null 表示从未操作过,跟随宿主 PageUseLauncherConfig.defaultHidden。
720
762
  */
721
763
  launcherVisible: boolean | null;
764
+ /**
765
+ * 面板内下达指令后是否自动收起面板(收起为浮动入口,从入口查看执行进度)。
766
+ * 仅移动端布局生效;null 表示从未操作过,按默认开启处理。桌面端不显示该设置项,值也不生效。
767
+ */
768
+ autoCollapseOnRun: boolean | null;
722
769
  /** 浮动入口位置(null = 默认右下角);面板展开时以入口为锚点定位,不单独存位置 */
723
770
  fabPos: PageUsePoint | null;
724
771
  }
@@ -858,4 +905,4 @@ declare const PAGE_USE_MASK_COLORS: {
858
905
  readonly warning: "#fa8c16";
859
906
  };
860
907
  //#endregion
861
- export { NormalizedPageUseOptions as $, PageUseGlobal as A, MountPageUseUIOptions as B, getElapsedSeconds as C, PageUseTaskSource as Ct, pageUseStore as D, isRunning as E, PAGE_USE_TOOL_NAME as F, PageUseLauncherElement as G, mountPageUseUI as H, PageUseCommand as I, DEFAULT_MAX_STEPS as J, PageUseHandle as K, formatPageUseResultForModel as L, showPageUseLauncher as M, PAGE_USE_COMMAND_TYPE as N, ReadonlyStore as O, PAGE_USE_TOOL as P, DEFAULT_TOUR_MAX_TAB_SWITCHES as Q, isPageUseCommand as R, clearPageUseLog as S, PageUseTaskResult as St, isPageUseConfigured as T, PAGE_USE_LAUNCHER_TAG as U, definePageUseElements as V, PageUseLauncherConfig as W, DEFAULT_SESSION_HEADER as X, DEFAULT_MODEL as Y, DEFAULT_STORAGE_KEY_PREFIX as Z, pageUseSettings as _, PageUsePreset as _t, PAGE_USE_ROBOT_ICON_SVG as a, readLauncherSwitch as at, PageUseQuestion as b, PageUseSnapshot as bt, PageUseCustomPreset as c, PageUseTtsVoice as ct, pageUsePresets as d, TOUR_STYLE_TRAINER as dt, PageUseLLMOptions as et, PageUseHistoryEntry as f, TOUR_STYLE_USER as ft, PageUseSettings as g, PageUseMenuNode as gt, PageUsePoint as h, PageUseErrorCode as ht, PageUseGlowElement as i, normalizeOptions as it, hidePageUseLauncher as j, PAGE_USE_GLOBAL_KEY as k, PageUsePresetSaveResult as l, DEFAULT_TOUR_STYLES as lt, DEFAULT_PAGE_USE_SETTINGS as m, pageUseCapability as mt, SIMULATOR_MASK_ID as n, PageUseRouterMode as nt, PAGE_USE_STATIC_PRESETS as o, PageUseTtsEngine as ot, pageUseHistory as p, PageUseCapability as pt, createPageUse as q, PAGE_USE_GLOW_TAG as r, PageUseTourOptions as rt, buildMenuPresets as s, PageUseTtsSpeakOptions as st, PAGE_USE_MASK_COLORS as t, PageUseOptions as tt, PageUsePresetState as u, PageUseTourStyle as ut, BROWSER_ENGINE_ID as v, PageUseProgressEvent as vt, getPageUseConfig as w, PageUseTaskStatus as wt, PageUseState as x, PageUseStepLog as xt, browserTtsEngine as y, PageUseRunOptions as yt, runPageUseTool as z };
908
+ export { DEFAULT_TOUR_MAX_TAB_SWITCHES as $, PageUseGlobal as A, MountPageUseUIOptions as B, getElapsedSeconds as C, PageUseTaskResult as Ct, pageUseStore as D, isRunning as E, PAGE_USE_TOOL_NAME as F, PageUseLauncherElement as G, mountPageUseUI as H, PageUseCommand as I, createPageUse as J, PageUseLauncherLayout as K, formatPageUseResultForModel as L, showPageUseLauncher as M, PAGE_USE_COMMAND_TYPE as N, ReadonlyStore as O, PAGE_USE_TOOL as P, DEFAULT_STORAGE_KEY_PREFIX as Q, isPageUseCommand as R, clearPageUseLog as S, PageUseStepLog as St, isPageUseConfigured as T, PageUseTaskStatus as Tt, PAGE_USE_LAUNCHER_TAG as U, definePageUseElements as V, PageUseLauncherConfig as W, DEFAULT_MODEL as X, DEFAULT_MAX_STEPS as Y, DEFAULT_SESSION_HEADER as Z, pageUseSettings as _, PageUseMenuNode as _t, PAGE_USE_ROBOT_ICON_SVG as a, normalizeOptions as at, PageUseQuestion as b, PageUseRunOptions as bt, PageUseCustomPreset as c, PageUseTtsSpeakOptions as ct, pageUsePresets as d, PageUseTourStyle as dt, NormalizedPageUseOptions as et, PageUseHistoryEntry as f, TOUR_STYLE_TRAINER as ft, PageUseSettings as g, PageUseErrorCode as gt, PageUsePoint as h, pageUseCapability as ht, PageUseGlowElement as i, PageUseTourOptions as it, hidePageUseLauncher as j, PAGE_USE_GLOBAL_KEY as k, PageUsePresetSaveResult as l, PageUseTtsVoice as lt, DEFAULT_PAGE_USE_SETTINGS as m, PageUseCapability as mt, SIMULATOR_MASK_ID as n, PageUseOptions as nt, PAGE_USE_STATIC_PRESETS as o, readLauncherSwitch as ot, pageUseHistory as p, TOUR_STYLE_USER as pt, PageUseHandle as q, PAGE_USE_GLOW_TAG as r, PageUseRouterMode as rt, buildMenuPresets as s, PageUseTtsEngine as st, PAGE_USE_MASK_COLORS as t, PageUseLLMOptions as tt, PageUsePresetState as u, DEFAULT_TOUR_STYLES as ut, BROWSER_ENGINE_ID as v, PageUsePreset as vt, getPageUseConfig as w, PageUseTaskSource as wt, PageUseState as x, PageUseSnapshot as xt, browserTtsEngine as y, PageUseProgressEvent as yt, runPageUseTool as z };
package/dist/index.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { $ as NormalizedPageUseOptions, A as PageUseGlobal, B as MountPageUseUIOptions, C as getElapsedSeconds, Ct as PageUseTaskSource, D as pageUseStore, E as isRunning, F as PAGE_USE_TOOL_NAME, G as PageUseLauncherElement, H as mountPageUseUI, I as PageUseCommand, J as DEFAULT_MAX_STEPS, K as PageUseHandle, L as formatPageUseResultForModel, M as showPageUseLauncher, N as PAGE_USE_COMMAND_TYPE, O as ReadonlyStore, P as PAGE_USE_TOOL, Q as DEFAULT_TOUR_MAX_TAB_SWITCHES, R as isPageUseCommand, S as clearPageUseLog, St as PageUseTaskResult, T as isPageUseConfigured, U as PAGE_USE_LAUNCHER_TAG, V as definePageUseElements, W as PageUseLauncherConfig, X as DEFAULT_SESSION_HEADER, Y as DEFAULT_MODEL, Z as DEFAULT_STORAGE_KEY_PREFIX, _ as pageUseSettings, _t as PageUsePreset, a as PAGE_USE_ROBOT_ICON_SVG, at as readLauncherSwitch, b as PageUseQuestion, bt as PageUseSnapshot, c as PageUseCustomPreset, ct as PageUseTtsVoice, d as pageUsePresets, dt as TOUR_STYLE_TRAINER, et as PageUseLLMOptions, f as PageUseHistoryEntry, ft as TOUR_STYLE_USER, g as PageUseSettings, gt as PageUseMenuNode, h as PageUsePoint, ht as PageUseErrorCode, i as PageUseGlowElement, it as normalizeOptions, j as hidePageUseLauncher, k as PAGE_USE_GLOBAL_KEY, l as PageUsePresetSaveResult, lt as DEFAULT_TOUR_STYLES, m as DEFAULT_PAGE_USE_SETTINGS, mt as pageUseCapability, n as SIMULATOR_MASK_ID, nt as PageUseRouterMode, o as PAGE_USE_STATIC_PRESETS, ot as PageUseTtsEngine, p as pageUseHistory, pt as PageUseCapability, q as createPageUse, r as PAGE_USE_GLOW_TAG, rt as PageUseTourOptions, s as buildMenuPresets, st as PageUseTtsSpeakOptions, t as PAGE_USE_MASK_COLORS, tt as PageUseOptions, u as PageUsePresetState, ut as PageUseTourStyle, v as BROWSER_ENGINE_ID, vt as PageUseProgressEvent, w as getPageUseConfig, wt as PageUseTaskStatus, x as PageUseState, xt as PageUseStepLog, y as browserTtsEngine, yt as PageUseRunOptions, z as runPageUseTool } from "./index-BOXzkiXG.mjs";
2
- export { BROWSER_ENGINE_ID, DEFAULT_MAX_STEPS, DEFAULT_MODEL, DEFAULT_PAGE_USE_SETTINGS, DEFAULT_SESSION_HEADER, DEFAULT_STORAGE_KEY_PREFIX, DEFAULT_TOUR_MAX_TAB_SWITCHES, DEFAULT_TOUR_STYLES, type MountPageUseUIOptions, type NormalizedPageUseOptions, 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, type PageUseCapability, type PageUseCommand, type PageUseCustomPreset, type PageUseErrorCode, type PageUseGlobal, PageUseGlowElement, type PageUseHandle, type PageUseHistoryEntry, type PageUseLLMOptions, type PageUseLauncherConfig, PageUseLauncherElement, type PageUseMenuNode, type PageUseOptions, type PageUsePoint, type PageUsePreset, type PageUsePresetSaveResult, type PageUsePresetState, type PageUseProgressEvent, type PageUseQuestion, type PageUseRouterMode, type PageUseRunOptions, type PageUseSettings, type PageUseSnapshot, type PageUseState, type PageUseStepLog, type PageUseTaskResult, type PageUseTaskSource, type PageUseTaskStatus, type PageUseTourOptions, type PageUseTourStyle, type PageUseTtsEngine, type PageUseTtsSpeakOptions, type PageUseTtsVoice, type ReadonlyStore, SIMULATOR_MASK_ID, TOUR_STYLE_TRAINER, TOUR_STYLE_USER, browserTtsEngine, buildMenuPresets, clearPageUseLog, createPageUse, definePageUseElements, formatPageUseResultForModel, getElapsedSeconds, getPageUseConfig, hidePageUseLauncher, isPageUseCommand, isPageUseConfigured, isRunning, mountPageUseUI, normalizeOptions, pageUseCapability, pageUseHistory, pageUsePresets, pageUseSettings, pageUseStore, readLauncherSwitch, runPageUseTool, showPageUseLauncher };
1
+ import { $ as DEFAULT_TOUR_MAX_TAB_SWITCHES, A as PageUseGlobal, B as MountPageUseUIOptions, C as getElapsedSeconds, Ct as PageUseTaskResult, D as pageUseStore, E as isRunning, F as PAGE_USE_TOOL_NAME, G as PageUseLauncherElement, H as mountPageUseUI, I as PageUseCommand, J as createPageUse, K as PageUseLauncherLayout, L as formatPageUseResultForModel, M as showPageUseLauncher, N as PAGE_USE_COMMAND_TYPE, O as ReadonlyStore, P as PAGE_USE_TOOL, Q as DEFAULT_STORAGE_KEY_PREFIX, R as isPageUseCommand, S as clearPageUseLog, St as PageUseStepLog, T as isPageUseConfigured, Tt as PageUseTaskStatus, U as PAGE_USE_LAUNCHER_TAG, V as definePageUseElements, W as PageUseLauncherConfig, X as DEFAULT_MODEL, Y as DEFAULT_MAX_STEPS, Z as DEFAULT_SESSION_HEADER, _ as pageUseSettings, _t as PageUseMenuNode, a as PAGE_USE_ROBOT_ICON_SVG, at as normalizeOptions, b as PageUseQuestion, bt as PageUseRunOptions, c as PageUseCustomPreset, ct as PageUseTtsSpeakOptions, d as pageUsePresets, dt as PageUseTourStyle, et as NormalizedPageUseOptions, f as PageUseHistoryEntry, ft as TOUR_STYLE_TRAINER, g as PageUseSettings, gt as PageUseErrorCode, h as PageUsePoint, ht as pageUseCapability, i as PageUseGlowElement, it as PageUseTourOptions, j as hidePageUseLauncher, k as PAGE_USE_GLOBAL_KEY, l as PageUsePresetSaveResult, lt as PageUseTtsVoice, m as DEFAULT_PAGE_USE_SETTINGS, mt as PageUseCapability, n as SIMULATOR_MASK_ID, nt as PageUseOptions, o as PAGE_USE_STATIC_PRESETS, ot as readLauncherSwitch, p as pageUseHistory, pt as TOUR_STYLE_USER, q as PageUseHandle, r as PAGE_USE_GLOW_TAG, rt as PageUseRouterMode, s as buildMenuPresets, st as PageUseTtsEngine, t as PAGE_USE_MASK_COLORS, tt as PageUseLLMOptions, u as PageUsePresetState, ut as DEFAULT_TOUR_STYLES, v as BROWSER_ENGINE_ID, vt as PageUsePreset, w as getPageUseConfig, wt as PageUseTaskSource, x as PageUseState, xt as PageUseSnapshot, y as browserTtsEngine, yt as PageUseProgressEvent, z as runPageUseTool } from "./index-BACVE8Ig.mjs";
2
+ export { BROWSER_ENGINE_ID, DEFAULT_MAX_STEPS, DEFAULT_MODEL, DEFAULT_PAGE_USE_SETTINGS, DEFAULT_SESSION_HEADER, DEFAULT_STORAGE_KEY_PREFIX, DEFAULT_TOUR_MAX_TAB_SWITCHES, DEFAULT_TOUR_STYLES, type MountPageUseUIOptions, type NormalizedPageUseOptions, 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, type PageUseCapability, type PageUseCommand, type PageUseCustomPreset, type PageUseErrorCode, type PageUseGlobal, PageUseGlowElement, type PageUseHandle, type PageUseHistoryEntry, type PageUseLLMOptions, type PageUseLauncherConfig, PageUseLauncherElement, type PageUseLauncherLayout, type PageUseMenuNode, type PageUseOptions, type PageUsePoint, type PageUsePreset, type PageUsePresetSaveResult, type PageUsePresetState, type PageUseProgressEvent, type PageUseQuestion, type PageUseRouterMode, type PageUseRunOptions, type PageUseSettings, type PageUseSnapshot, type PageUseState, type PageUseStepLog, type PageUseTaskResult, type PageUseTaskSource, type PageUseTaskStatus, type PageUseTourOptions, type PageUseTourStyle, type PageUseTtsEngine, type PageUseTtsSpeakOptions, type PageUseTtsVoice, type ReadonlyStore, SIMULATOR_MASK_ID, TOUR_STYLE_TRAINER, TOUR_STYLE_USER, browserTtsEngine, buildMenuPresets, clearPageUseLog, createPageUse, definePageUseElements, formatPageUseResultForModel, getElapsedSeconds, getPageUseConfig, hidePageUseLauncher, isPageUseCommand, isPageUseConfigured, isRunning, mountPageUseUI, normalizeOptions, pageUseCapability, pageUseHistory, pageUsePresets, pageUseSettings, pageUseStore, readLauncherSwitch, runPageUseTool, showPageUseLauncher };
package/dist/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { A as pageUseSettings, B as BROWSER_ENGINE_ID, C as getPageUseConfig, D as pageUsePresets, E as pageUseStore, F as DEFAULT_TOUR_MAX_TAB_SWITCHES, H as DEFAULT_TOUR_STYLES, I as normalizeOptions, L as readLauncherSwitch, M as DEFAULT_MODEL, N as DEFAULT_SESSION_HEADER, O as pageUseHistory, P as DEFAULT_STORAGE_KEY_PREFIX, R as PAGE_USE_MASK_COLORS, S as getElapsedSeconds, T as isRunning, U as TOUR_STYLE_TRAINER, V as browserTtsEngine, W as TOUR_STYLE_USER, _ 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 SIMULATOR_MASK_ID } from "./src-ChJ6q7jl.mjs";
1
+ import { A as pageUseSettings, B as BROWSER_ENGINE_ID, C as getPageUseConfig, D as pageUsePresets, E as pageUseStore, F as DEFAULT_TOUR_MAX_TAB_SWITCHES, H as DEFAULT_TOUR_STYLES, I as normalizeOptions, L as readLauncherSwitch, M as DEFAULT_MODEL, N as DEFAULT_SESSION_HEADER, O as pageUseHistory, P as DEFAULT_STORAGE_KEY_PREFIX, R as PAGE_USE_MASK_COLORS, S as getElapsedSeconds, T as isRunning, U as TOUR_STYLE_TRAINER, V as browserTtsEngine, W as TOUR_STYLE_USER, _ 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 SIMULATOR_MASK_ID } from "./src-MjVXh_cW.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, DEFAULT_TOUR_MAX_TAB_SWITCHES, DEFAULT_TOUR_STYLES, 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, TOUR_STYLE_TRAINER, TOUR_STYLE_USER, browserTtsEngine, buildMenuPresets, clearPageUseLog, createPageUse, definePageUseElements, formatPageUseResultForModel, getElapsedSeconds, getPageUseConfig, hidePageUseLauncher, isPageUseCommand, isPageUseConfigured, isRunning, mountPageUseUI, normalizeOptions, pageUseCapability, pageUseHistory, pageUsePresets, pageUseSettings, pageUseStore, readLauncherSwitch, runPageUseTool, showPageUseLauncher };
@@ -1,6 +1,6 @@
1
1
  import { PageAgent, tool } from "page-agent";
2
- import { clickElement } from "@page-agent/page-controller";
3
2
  import * as z from "zod/v4";
3
+ import { clickElement } from "@page-agent/page-controller";
4
4
  import { LitElement, css, html, nothing, svg } from "lit";
5
5
  import { keyed } from "lit/directives/keyed.js";
6
6
  import { unsafeHTML } from "lit/directives/unsafe-html.js";
@@ -436,6 +436,7 @@ const DEFAULT_PAGE_USE_SETTINGS = {
436
436
  voiceNames: {},
437
437
  tourStyle: "",
438
438
  launcherVisible: null,
439
+ autoCollapseOnRun: null,
439
440
  fabPos: null
440
441
  };
441
442
  /**
@@ -1596,6 +1597,115 @@ function createPageTour(deps) {
1596
1597
  };
1597
1598
  }
1598
1599
 
1600
+ //#endregion
1601
+ //#region src/core/newWindow.ts
1602
+ /**
1603
+ * 新窗口打开记录器:任务执行期间识别点击触发的新窗口打开,供点击工具与按页提示反馈给模型。
1604
+ * - 识别:window.open、点击 <a target>(含点到其子元素)、未插入文档的 <a> 调用 click()
1605
+ * - 只以调用发生为依据:不检查 window.open 返回值,被浏览器弹窗拦截也视为已打开
1606
+ * - 不改变页面行为:原调用照常执行,参数与返回值不变,不拦截重复打开
1607
+ * 与 page-agent 解耦,由 createPageUseAgent 在任务开始时 install、结束时 uninstall。
1608
+ */
1609
+ /** 在当前窗口内打开的窗口名(比较时转小写),不视为新窗口 */
1610
+ const SAME_WINDOW_TARGETS = /* @__PURE__ */ new Set([
1611
+ "_self",
1612
+ "_parent",
1613
+ "_top"
1614
+ ]);
1615
+ /** 窗口名是否指向新窗口:空串(window.open 默认 _blank)与自定义窗口名均视为新窗口 */
1616
+ function opensNewWindow(name) {
1617
+ return !SAME_WINDOW_TARGETS.has(name.trim().toLowerCase());
1618
+ }
1619
+ /** 链接满足新窗口条件时返回绝对地址,否则返回 null */
1620
+ function newWindowAnchorUrl(anchor) {
1621
+ const target = anchor.getAttribute("target") ?? "";
1622
+ if (!target.trim() || !opensNewWindow(target)) return null;
1623
+ if (anchor.hasAttribute("download")) return null;
1624
+ const href = anchor.getAttribute("href")?.trim() ?? "";
1625
+ if (!href || /^javascript:/i.test(href)) return null;
1626
+ return anchor.href || href;
1627
+ }
1628
+ /** window.open 的地址参数解析为绝对 URL;未传地址时浏览器打开空白页 */
1629
+ function resolveOpenUrl(win, url) {
1630
+ const raw = url === void 0 ? "" : String(url).trim();
1631
+ if (!raw) return "about:blank";
1632
+ try {
1633
+ return new URL(raw, win.location.href).href;
1634
+ } catch {
1635
+ return raw;
1636
+ }
1637
+ }
1638
+ function unique(urls) {
1639
+ return [...new Set(urls)];
1640
+ }
1641
+ function createNewWindowWatcher(win = window) {
1642
+ let records = [];
1643
+ let installed = null;
1644
+ function recordAnchorClick(anchor, event) {
1645
+ const url = newWindowAnchorUrl(anchor);
1646
+ if (url) records.push({
1647
+ url,
1648
+ event
1649
+ });
1650
+ }
1651
+ /** 已插入文档的链接(含 Shadow DOM 内):点击事件经 composedPath 传到 window */
1652
+ function onWindowClick(event) {
1653
+ const anchor = event.composedPath().find((node) => node instanceof win.HTMLAnchorElement);
1654
+ if (anchor) recordAnchorClick(anchor, event);
1655
+ }
1656
+ function install() {
1657
+ uninstall();
1658
+ records = [];
1659
+ const originalOpen = win.open;
1660
+ const wrappedOpen = (url, target, features) => {
1661
+ const opened = originalOpen.call(win, url, target, features);
1662
+ if (opensNewWindow(target ?? "")) records.push({ url: resolveOpenUrl(win, url) });
1663
+ return opened;
1664
+ };
1665
+ win.open = wrappedOpen;
1666
+ const proto = win.HTMLAnchorElement.prototype;
1667
+ const originalClick = proto.click;
1668
+ const wrappedClick = function() {
1669
+ if (this.isConnected) return originalClick.call(this);
1670
+ const listener = (event) => recordAnchorClick(this, event);
1671
+ this.addEventListener("click", listener, {
1672
+ capture: true,
1673
+ once: true
1674
+ });
1675
+ try {
1676
+ originalClick.call(this);
1677
+ } finally {
1678
+ this.removeEventListener("click", listener, { capture: true });
1679
+ }
1680
+ };
1681
+ proto.click = wrappedClick;
1682
+ win.addEventListener("click", onWindowClick, { capture: true });
1683
+ installed = { restore: () => {
1684
+ if (win.open === wrappedOpen) win.open = originalOpen;
1685
+ if (proto.click === wrappedClick) proto.click = originalClick;
1686
+ win.removeEventListener("click", onWindowClick, { capture: true });
1687
+ } };
1688
+ }
1689
+ function uninstall() {
1690
+ installed?.restore();
1691
+ installed = null;
1692
+ }
1693
+ function since(n) {
1694
+ return unique(records.slice(n).filter((r) => !r.event?.defaultPrevented).map((r) => r.url));
1695
+ }
1696
+ return {
1697
+ install,
1698
+ uninstall,
1699
+ count: () => records.length,
1700
+ since,
1701
+ all: () => since(0)
1702
+ };
1703
+ }
1704
+ /** 点击结果追加的说明:告知模型新窗口不可观察,当前页面不会变化 */
1705
+ function formatOpenedNotice(urls) {
1706
+ return `已通过新窗口打开:${urls.join("、")}。新窗口不在可操作范围内,当前页面不会因此变化。`;
1707
+ }
1708
+
1599
1709
  //#endregion
1600
1710
  //#region src/core/siteMap.ts
1601
1711
  /** 去掉 `#`、前导 `/` 与查询串,得到用于比较的路径 */
@@ -1677,6 +1787,8 @@ function buildSystemInstruction(options, flags = {}) {
1677
1787
  "- 页面内的 Tab 通过点击 Tab 标签切换;详情/编辑通常是表格行内的按钮,点击后在抽屉或弹窗中打开。",
1678
1788
  "- 下拉选择、日期选择若为自定义组件而非原生 select:先点击该输入框,再点击弹出层中的目标选项文字。",
1679
1789
  "- 数据加载需要时间;点击后若内容未变化,先使用 wait 等待 1 到 2 秒再重新观察。",
1790
+ "- 允许点击会在新窗口打开页面或外链的入口(用户任务需要打开它时)。",
1791
+ "- 点击结果或页面提示出现「已通过新窗口打开」时,新窗口内容不可观察,当前页面也不会变化;若打开该页面就是任务目标,立即调用 done(success=true),说明已在新窗口打开的页面或地址,不要重复点击,也不要等待当前页面变化。",
1680
1792
  "",
1681
1793
  "## 安全边界",
1682
1794
  "- 未经用户明确要求,不得执行删除、提交、审批、发布、批量修改等不可逆操作;不确定时用 ask_user 询问。",
@@ -1686,10 +1798,11 @@ function buildSystemInstruction(options, flags = {}) {
1686
1798
  }
1687
1799
  /**
1688
1800
  * 按页提示:page-agent 每步调用一次。
1689
- * 路由名命中 routeHints 优先,其次按路径命中;outlineText(页面讲解的模块清单)追加在末尾。
1801
+ * 路由名命中 routeHints 优先,其次按路径命中;outlineText(页面讲解的模块清单)追加在其后;
1802
+ * openedUrls(本任务已通过新窗口打开的地址)追加在末尾,覆盖点击结果返回后才发生的异步打开。
1690
1803
  * 返回 null 表示不追加。
1691
1804
  */
1692
- function buildPageInstruction(options, outlineText = "") {
1805
+ function buildPageInstruction(options, outlineText = "", openedUrls = []) {
1693
1806
  const path = options.getCurrentPath();
1694
1807
  const parts = [];
1695
1808
  const menu = findMenuByPath(path, options.getMenus());
@@ -1703,6 +1816,7 @@ function buildPageInstruction(options, outlineText = "") {
1703
1816
  const hint = routeName && options.routeHints[routeName] || options.routeHints[normalizePath(path)];
1704
1817
  if (hint) parts.push(hint);
1705
1818
  if (outlineText) parts.push(outlineText);
1819
+ if (openedUrls.length) parts.push(`本任务已通过新窗口打开:${openedUrls.join("、")}`);
1706
1820
  return parts.length ? parts.join("\n") : null;
1707
1821
  }
1708
1822
 
@@ -1714,11 +1828,30 @@ function buildPageInstruction(options, outlineText = "") {
1714
1828
  * - 站点知识:菜单树写入 system 提示,按页提示按当前路径动态注入
1715
1829
  * - 任务开始前按设置执行宿主的 beforeTask(如展开折叠的侧栏)
1716
1830
  * - 页面讲解:按页提示附带页面模块清单,并注册 present_page 工具(pageTour 关闭时均不启用)
1831
+ * - 新窗口打开:覆盖内置点击工具,点击触发新窗口打开时在结果中说明;按页提示列出本任务已打开的地址
1717
1832
  */
1718
1833
  /** DOM 文本超过该长度时截断,避免大表格页把上下文撑爆 */
1719
1834
  const PAGE_CONTENT_MAX_CHARS = 6e4;
1720
1835
  /** 每步间隔(秒):留给路由切换与接口加载的时间 */
1721
1836
  const STEP_DELAY_SECONDS = .6;
1837
+ /** page-agent 内置点击工具名:同名注册即覆盖内置实现 */
1838
+ const CLICK_TOOL_NAME = "click_element_by_index";
1839
+ /**
1840
+ * 点击工具:与内置实现相同(描述、输入结构不变),点击期间识别到新窗口打开时在结果后追加说明。
1841
+ * clickElement 返回前已等待 0.2 秒,同步与微任务内的打开均已记录;更晚的打开由按页提示兜底。
1842
+ */
1843
+ function createClickTool(watcher) {
1844
+ return tool({
1845
+ description: "Click element by index",
1846
+ inputSchema: z.object({ index: z.int().min(0) }),
1847
+ async execute(input) {
1848
+ const before = watcher.count();
1849
+ const { message } = await this.pageController.clickElement(input.index);
1850
+ const urls = watcher.since(before);
1851
+ return urls.length ? `${message}\n${formatOpenedNotice(urls)}` : message;
1852
+ }
1853
+ });
1854
+ }
1722
1855
  /** 生成会话 ID;一次 execute 视为一个会话,任务开始时刷新 */
1723
1856
  function newSessionId() {
1724
1857
  return typeof crypto !== "undefined" && crypto.randomUUID?.() || `page-use-${Date.now()}`;
@@ -1749,6 +1882,7 @@ function createPageUseAgent({ options, enableMask, narration = false, shouldRunB
1749
1882
  onMaskForced,
1750
1883
  getStyle: getTourStyle
1751
1884
  }) : null;
1885
+ const newWindows = createNewWindowWatcher();
1752
1886
  return new PageAgent({
1753
1887
  baseURL: llm.baseURL,
1754
1888
  apiKey: llm.apiKey || void 0,
@@ -1767,7 +1901,7 @@ function createPageUseAgent({ options, enableMask, narration = false, shouldRunB
1767
1901
  experimentalScriptExecutionTool: false,
1768
1902
  instructions: {
1769
1903
  system: buildSystemInstruction(options, { narration }),
1770
- getPageInstructions: () => buildPageInstruction(options, tour?.outlineText() ?? "")
1904
+ getPageInstructions: () => buildPageInstruction(options, tour?.outlineText() ?? "", newWindows.all())
1771
1905
  },
1772
1906
  transformPageContent: (content) => {
1773
1907
  if (content.length <= PAGE_CONTENT_MAX_CHARS) return content;
@@ -1775,10 +1909,12 @@ function createPageUseAgent({ options, enableMask, narration = false, shouldRunB
1775
1909
  },
1776
1910
  ...hostPageAgent,
1777
1911
  customTools: {
1912
+ [CLICK_TOOL_NAME]: createClickTool(newWindows),
1778
1913
  ...tour ? { [PRESENT_PAGE_TOOL_NAME]: tour.tool } : {},
1779
1914
  ...hostPageAgent.customTools
1780
1915
  },
1781
1916
  onBeforeTask: async (...args) => {
1917
+ newWindows.install();
1782
1918
  sessionId = newSessionId();
1783
1919
  tour?.onBeforeTask();
1784
1920
  if (hostBeforeTask && shouldRunBeforeTask()) try {
@@ -1789,9 +1925,14 @@ function createPageUseAgent({ options, enableMask, narration = false, shouldRunB
1789
1925
  await hostPageAgent.onBeforeTask?.(...args);
1790
1926
  },
1791
1927
  onAfterTask: async (...args) => {
1928
+ newWindows.uninstall();
1792
1929
  await tour?.onAfterTask(args[1]);
1793
1930
  onTaskFinished?.(args[1]);
1794
1931
  await hostPageAgent.onAfterTask?.(...args);
1932
+ },
1933
+ onDispose: (...args) => {
1934
+ newWindows.uninstall();
1935
+ hostPageAgent.onDispose?.(...args);
1795
1936
  }
1796
1937
  });
1797
1938
  }
@@ -2904,7 +3045,7 @@ var PageUseGlowElement = class extends LitElement {
2904
3045
 
2905
3046
  //#endregion
2906
3047
  //#region package.json
2907
- var version = "0.0.7";
3048
+ var version = "0.0.9";
2908
3049
 
2909
3050
  //#endregion
2910
3051
  //#region src/ui/drag.ts
@@ -2942,6 +3083,7 @@ function createDrag(options) {
2942
3083
  const dx = e.clientX - startX;
2943
3084
  const dy = e.clientY - startY;
2944
3085
  if (!moved && Math.hypot(dx, dy) < DRAG_THRESHOLD) return;
3086
+ if (!moved) options.onDragStart?.();
2945
3087
  moved = true;
2946
3088
  options.setPos(clampToViewport({
2947
3089
  x: rect.left + dx,
@@ -3368,6 +3510,38 @@ const launcherStyles = css`
3368
3510
  animation-duration: 10s;
3369
3511
  }
3370
3512
 
3513
+ /*
3514
+ * 移动端布局(launcher.layout = 'mobile'):贴底面板。
3515
+ * 宽度不写死数值,用左右内缩占满视口,避免 100vw 在桌面端把滚动条宽度算进去。
3516
+ */
3517
+ .panel.mobile {
3518
+ /* 回退值:不支持安全区 / dvh 的浏览器贴满两侧、按 vh 计算高度 */
3519
+ left: 0;
3520
+ right: 0;
3521
+ bottom: 0;
3522
+ height: 70vh;
3523
+ /* 左右内缩取安全区(横屏刘海屏),高度取七成动态视口(地址栏收缩时 vh 会跳变) */
3524
+ left: env(safe-area-inset-left, 0px);
3525
+ right: env(safe-area-inset-right, 0px);
3526
+ height: 70dvh;
3527
+ /* 底边与屏幕贴合,去掉下圆角 */
3528
+ border-radius: 12px 12px 0 0;
3529
+ }
3530
+ /* 位置由布局决定,头部不再是拖动区域;仍保留按下检测,用于标题连点解锁元信息 */
3531
+ .panel.mobile .head,
3532
+ .panel.mobile .head:active {
3533
+ cursor: default;
3534
+ touch-action: auto;
3535
+ }
3536
+ /* 底边与屏幕贴合,不需要下圆角;底部内边距让出 iPhone 手势条 */
3537
+ .panel.mobile .composer {
3538
+ border-radius: 0;
3539
+ padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));
3540
+ }
3541
+ .panel.mobile .toast {
3542
+ bottom: calc(24px + env(safe-area-inset-bottom, 0px));
3543
+ }
3544
+
3371
3545
  .head {
3372
3546
  display: flex;
3373
3547
  align-items: center;
@@ -4146,7 +4320,23 @@ var PageUseLauncherElement = class extends LitElement {
4146
4320
  fabFromWidth = null;
4147
4321
  /** 进行中宽度过渡的结束回调注销函数;过渡中再次切换时先注销,避免旧回调提前清除宽度 */
4148
4322
  fabWidthCleanup = null;
4323
+ /**
4324
+ * 本次入口手势是否已判定为拖动。
4325
+ * 指针捕获会把手势结束后浏览器补发的 click 重定向到入口,该 click 不是点击意图,不得展开面板。
4326
+ */
4327
+ fabDragged = false;
4149
4328
  cleanups = [];
4329
+ /** 生效的面板布局:未声明或取值非法时按桌面端处理,既有接入方的行为不变 */
4330
+ get isMobileLayout() {
4331
+ return this._config.layout === "mobile";
4332
+ }
4333
+ /**
4334
+ * 下达指令后是否自动收起面板:仅移动端布局生效,默认开启,可在设置页关闭。
4335
+ * 桌面端不提供该行为,也不显示设置项,存储中被改过的值在桌面端不生效。
4336
+ */
4337
+ get collapseOnRun() {
4338
+ return this.isMobileLayout && (pageUseSettings.get().autoCollapseOnRun ?? true);
4339
+ }
4150
4340
  get fabEl() {
4151
4341
  return this.renderRoot.querySelector(".fab");
4152
4342
  }
@@ -4163,11 +4353,8 @@ var PageUseLauncherElement = class extends LitElement {
4163
4353
  getEl: () => this.fabEl,
4164
4354
  getPos: () => pageUseSettings.get().fabPos,
4165
4355
  setPos: (pos) => pageUseSettings.update({ fabPos: pos }),
4166
- onTap: () => {
4167
- this.measureFab();
4168
- this.resolvePanelAnchor();
4169
- this.open = true;
4170
- this.requestUpdate();
4356
+ onDragStart: () => {
4357
+ this.fabDragged = true;
4171
4358
  },
4172
4359
  skipInteractive: false
4173
4360
  });
@@ -4179,6 +4366,7 @@ var PageUseLauncherElement = class extends LitElement {
4179
4366
  if (target?.closest?.(".title")) this.onTitleTap();
4180
4367
  },
4181
4368
  setPos: ({ x, y }) => {
4369
+ if (this.isMobileLayout) return;
4182
4370
  const el = this.panelEl;
4183
4371
  if (!el) return;
4184
4372
  const { width: fabWidth, height: fabHeight } = this.fabSize;
@@ -4359,8 +4547,12 @@ var PageUseLauncherElement = class extends LitElement {
4359
4547
  bottom: `${FAB_DEFAULT_BOTTOM}px`
4360
4548
  });
4361
4549
  }
4362
- /** 面板位置完全由入口位置推导,展开时与入口重合于同一角 */
4550
+ /**
4551
+ * 面板位置完全由入口位置推导,展开时与入口重合于同一角。
4552
+ * 移动端不使用内联几何:位置与尺寸由 styles.ts 的 .panel.mobile 决定(贴底、占满宽度)。
4553
+ */
4363
4554
  panelStyle(settings) {
4555
+ if (this.isMobileLayout) return "";
4364
4556
  const rect = this.fabRect(settings);
4365
4557
  const { width: vw, height: vh } = this.viewport;
4366
4558
  const { alignRight, alignBottom } = this.panelAnchor;
@@ -4379,6 +4571,31 @@ var PageUseLauncherElement = class extends LitElement {
4379
4571
  isVisible(settings) {
4380
4572
  return settings.launcherVisible ?? !this._config.defaultHidden;
4381
4573
  }
4574
+ /**
4575
+ * 入口按下:先清掉上一次手势遗留的拖动标记,本次是否为拖动由 fabDrag 判定。
4576
+ * 必须挂在 pointerdown 最前面,否则拖动未补发 click 时标记会残留到下一次真实点击。
4577
+ */
4578
+ onFabPointerDown = (event) => {
4579
+ this.fabDragged = false;
4580
+ this.fabDrag.onPointerDown(event);
4581
+ };
4582
+ /**
4583
+ * 入口点击展开。
4584
+ * 展开动作挂在 click 而非 pointerup:fabDrag 对手势调用 preventDefault 后浏览器没有 mousedown / mouseup 目标,
4585
+ * 会在 pointerup 之后按当时坐标重新命中测试补发一次 click;若 pointerup 时面板已展开,
4586
+ * 这次 click 就落在与入口重叠的面板底部控件上(「执行」「重跑」或快捷指令胶囊),造成误触提交。
4587
+ * 由入口自身消费这次 click,即不再有穿透。
4588
+ */
4589
+ onFabClick = () => {
4590
+ if (this.fabDragged) {
4591
+ this.fabDragged = false;
4592
+ return;
4593
+ }
4594
+ this.measureFab();
4595
+ this.resolvePanelAnchor();
4596
+ this.open = true;
4597
+ this.requestUpdate();
4598
+ };
4382
4599
  /** 展开面板(showPageUseLauncher 调用):等入口按新的显示状态渲染后再测量定位 */
4383
4600
  async expand() {
4384
4601
  await this.updateComplete;
@@ -4442,6 +4659,7 @@ var PageUseLauncherElement = class extends LitElement {
4442
4659
  if (isRunning() || !text) return;
4443
4660
  this.task = "";
4444
4661
  this.requestUpdate();
4662
+ if (this.collapseOnRun) this.collapse();
4445
4663
  await runTask(text, {
4446
4664
  source: LAUNCHER_SOURCE,
4447
4665
  ...tourStyle ? { tourStyle } : {}
@@ -4564,12 +4782,16 @@ var PageUseLauncherElement = class extends LitElement {
4564
4782
  ${this.renderChips(presets, accent)}
4565
4783
  </div>`);
4566
4784
  }
4567
- renderCheckbox(key, label, hint, disabled = false) {
4785
+ /**
4786
+ * checked 为复选框的显示状态,默认取存储值。
4787
+ * 「未设置时按布局取默认」的设置项(如 autoCollapseOnRun)需要传生效值,否则未操作过时显示与生效状态不一致。
4788
+ */
4789
+ renderCheckbox(key, label, hint, disabled = false, checked) {
4568
4790
  const settings = pageUseSettings.get();
4569
4791
  return html`<label class="checkbox ${disabled ? "disabled" : ""}">
4570
4792
  <input
4571
4793
  type="checkbox"
4572
- .checked=${Boolean(settings[key])}
4794
+ .checked=${checked ?? Boolean(settings[key])}
4573
4795
  ?disabled=${disabled}
4574
4796
  @change=${(e) => pageUseSettings.update({ [key]: e.target.checked })}
4575
4797
  />
@@ -4587,6 +4809,7 @@ var PageUseLauncherElement = class extends LitElement {
4587
4809
  ${this.renderCheckbox("enableMask", "运行时蒙层防误触", "下次任务开始生效")}
4588
4810
  ${config?.beforeTask ? this.renderCheckbox("enableBeforeTask", config.beforeTaskLabel) : nothing}
4589
4811
  ${this.renderCheckbox("showStepDetails", "步骤显示模型思考与返回")}
4812
+ ${this.isMobileLayout ? this.renderCheckbox("autoCollapseOnRun", "执行后自动收起面板", "收起后可看到页面执行过程", false, this.collapseOnRun) : nothing}
4590
4813
  ${this.renderVoiceSettings(settings)}
4591
4814
  ${config?.pageTour.enabled ? this.renderTourStyleSetting(settings, config) : nothing}
4592
4815
  <div class="row settings-actions">
@@ -5070,14 +5293,15 @@ var PageUseLauncherElement = class extends LitElement {
5070
5293
  ?hidden=${this.open}
5071
5294
  style=${this.fabStyle(settings)}
5072
5295
  title=${running ? `执行中:${state.activityText || state.currentTask}` : `打开 ${title}`}
5073
- @pointerdown=${this.fabDrag.onPointerDown}
5296
+ @pointerdown=${this.onFabPointerDown}
5297
+ @click=${this.onFabClick}
5074
5298
  >
5075
5299
  <span class="fab-icon">${robotIcon}</span>
5076
5300
  <span>${running ? "执行中" : title}</span>
5077
5301
  </button>
5078
5302
 
5079
5303
  <section
5080
- class="panel ${running ? "running" : ""}"
5304
+ class="panel ${running ? "running" : ""} ${this.isMobileLayout ? "mobile" : ""}"
5081
5305
  ?hidden=${!this.open}
5082
5306
  style=${this.open ? this.panelStyle(settings) : ""}
5083
5307
  >
package/dist/vue.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as NormalizedPageUseOptions, A as PageUseGlobal, B as MountPageUseUIOptions, C as getElapsedSeconds, Ct as PageUseTaskSource, D as pageUseStore, E as isRunning, F as PAGE_USE_TOOL_NAME, G as PageUseLauncherElement, H as mountPageUseUI, I as PageUseCommand, J as DEFAULT_MAX_STEPS, K as PageUseHandle, L as formatPageUseResultForModel, M as showPageUseLauncher, N as PAGE_USE_COMMAND_TYPE, O as ReadonlyStore, P as PAGE_USE_TOOL, Q as DEFAULT_TOUR_MAX_TAB_SWITCHES, R as isPageUseCommand, S as clearPageUseLog, St as PageUseTaskResult, T as isPageUseConfigured, U as PAGE_USE_LAUNCHER_TAG, V as definePageUseElements, W as PageUseLauncherConfig, X as DEFAULT_SESSION_HEADER, Y as DEFAULT_MODEL, Z as DEFAULT_STORAGE_KEY_PREFIX, _ as pageUseSettings, _t as PageUsePreset, a as PAGE_USE_ROBOT_ICON_SVG, at as readLauncherSwitch, b as PageUseQuestion, bt as PageUseSnapshot, c as PageUseCustomPreset, ct as PageUseTtsVoice, d as pageUsePresets, dt as TOUR_STYLE_TRAINER, et as PageUseLLMOptions, f as PageUseHistoryEntry, ft as TOUR_STYLE_USER, g as PageUseSettings, gt as PageUseMenuNode, h as PageUsePoint, ht as PageUseErrorCode, i as PageUseGlowElement, it as normalizeOptions, j as hidePageUseLauncher, k as PAGE_USE_GLOBAL_KEY, l as PageUsePresetSaveResult, lt as DEFAULT_TOUR_STYLES, m as DEFAULT_PAGE_USE_SETTINGS, mt as pageUseCapability, n as SIMULATOR_MASK_ID, nt as PageUseRouterMode, o as PAGE_USE_STATIC_PRESETS, ot as PageUseTtsEngine, p as pageUseHistory, pt as PageUseCapability, q as createPageUse, r as PAGE_USE_GLOW_TAG, rt as PageUseTourOptions, s as buildMenuPresets, st as PageUseTtsSpeakOptions, t as PAGE_USE_MASK_COLORS, tt as PageUseOptions, u as PageUsePresetState, ut as PageUseTourStyle, v as BROWSER_ENGINE_ID, vt as PageUseProgressEvent, w as getPageUseConfig, wt as PageUseTaskStatus, x as PageUseState, xt as PageUseStepLog, y as browserTtsEngine, yt as PageUseRunOptions, z as runPageUseTool } from "./index-BOXzkiXG.mjs";
1
+ import { $ as DEFAULT_TOUR_MAX_TAB_SWITCHES, A as PageUseGlobal, B as MountPageUseUIOptions, C as getElapsedSeconds, Ct as PageUseTaskResult, D as pageUseStore, E as isRunning, F as PAGE_USE_TOOL_NAME, G as PageUseLauncherElement, H as mountPageUseUI, I as PageUseCommand, J as createPageUse, K as PageUseLauncherLayout, L as formatPageUseResultForModel, M as showPageUseLauncher, N as PAGE_USE_COMMAND_TYPE, O as ReadonlyStore, P as PAGE_USE_TOOL, Q as DEFAULT_STORAGE_KEY_PREFIX, R as isPageUseCommand, S as clearPageUseLog, St as PageUseStepLog, T as isPageUseConfigured, Tt as PageUseTaskStatus, U as PAGE_USE_LAUNCHER_TAG, V as definePageUseElements, W as PageUseLauncherConfig, X as DEFAULT_MODEL, Y as DEFAULT_MAX_STEPS, Z as DEFAULT_SESSION_HEADER, _ as pageUseSettings, _t as PageUseMenuNode, a as PAGE_USE_ROBOT_ICON_SVG, at as normalizeOptions, b as PageUseQuestion, bt as PageUseRunOptions, c as PageUseCustomPreset, ct as PageUseTtsSpeakOptions, d as pageUsePresets, dt as PageUseTourStyle, et as NormalizedPageUseOptions, f as PageUseHistoryEntry, ft as TOUR_STYLE_TRAINER, g as PageUseSettings, gt as PageUseErrorCode, h as PageUsePoint, ht as pageUseCapability, i as PageUseGlowElement, it as PageUseTourOptions, j as hidePageUseLauncher, k as PAGE_USE_GLOBAL_KEY, l as PageUsePresetSaveResult, lt as PageUseTtsVoice, m as DEFAULT_PAGE_USE_SETTINGS, mt as PageUseCapability, n as SIMULATOR_MASK_ID, nt as PageUseOptions, o as PAGE_USE_STATIC_PRESETS, ot as readLauncherSwitch, p as pageUseHistory, pt as TOUR_STYLE_USER, q as PageUseHandle, r as PAGE_USE_GLOW_TAG, rt as PageUseRouterMode, s as buildMenuPresets, st as PageUseTtsEngine, t as PAGE_USE_MASK_COLORS, tt as PageUseLLMOptions, u as PageUsePresetState, ut as DEFAULT_TOUR_STYLES, v as BROWSER_ENGINE_ID, vt as PageUsePreset, w as getPageUseConfig, wt as PageUseTaskSource, x as PageUseState, xt as PageUseSnapshot, y as browserTtsEngine, yt as PageUseProgressEvent, z as runPageUseTool } from "./index-BACVE8Ig.mjs";
2
2
  import { PropType, ShallowRef } from "vue";
3
3
  import { Router } from "vue-router";
4
4
  //#region src/vue.d.ts
@@ -50,4 +50,4 @@ export declare function usePageUseState(): Readonly<ShallowRef<PageUseState>>;
50
50
  /** 本地设置的 Vue 响应式引用;修改请调用 pageUseSettings.update */
51
51
  export declare function usePageUseSettings(): Readonly<ShallowRef<PageUseSettings>>;
52
52
  //#endregion
53
- export { BROWSER_ENGINE_ID, DEFAULT_MAX_STEPS, DEFAULT_MODEL, DEFAULT_PAGE_USE_SETTINGS, DEFAULT_SESSION_HEADER, DEFAULT_STORAGE_KEY_PREFIX, DEFAULT_TOUR_MAX_TAB_SWITCHES, DEFAULT_TOUR_STYLES, type MountPageUseUIOptions, type NormalizedPageUseOptions, 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, type PageUseCapability, type PageUseCommand, type PageUseCustomPreset, type PageUseErrorCode, type PageUseGlobal, PageUseGlowElement, type PageUseHandle, type PageUseHistoryEntry, type PageUseLLMOptions, type PageUseLauncherConfig, PageUseLauncherElement, type PageUseMenuNode, type PageUseOptions, type PageUsePoint, type PageUsePreset, type PageUsePresetSaveResult, type PageUsePresetState, type PageUseProgressEvent, type PageUseQuestion, type PageUseRouterMode, type PageUseRunOptions, type PageUseSettings, type PageUseSnapshot, type PageUseState, type PageUseStepLog, type PageUseTaskResult, type PageUseTaskSource, type PageUseTaskStatus, type PageUseTourOptions, type PageUseTourStyle, type PageUseTtsEngine, type PageUseTtsSpeakOptions, type PageUseTtsVoice, type ReadonlyStore, SIMULATOR_MASK_ID, TOUR_STYLE_TRAINER, TOUR_STYLE_USER, browserTtsEngine, buildMenuPresets, clearPageUseLog, createPageUse, definePageUseElements, formatPageUseResultForModel, getElapsedSeconds, getPageUseConfig, hidePageUseLauncher, isPageUseCommand, isPageUseConfigured, isRunning, mountPageUseUI, normalizeOptions, pageUseCapability, pageUseHistory, pageUsePresets, pageUseSettings, pageUseStore, readLauncherSwitch, runPageUseTool, showPageUseLauncher };
53
+ export { BROWSER_ENGINE_ID, DEFAULT_MAX_STEPS, DEFAULT_MODEL, DEFAULT_PAGE_USE_SETTINGS, DEFAULT_SESSION_HEADER, DEFAULT_STORAGE_KEY_PREFIX, DEFAULT_TOUR_MAX_TAB_SWITCHES, DEFAULT_TOUR_STYLES, type MountPageUseUIOptions, type NormalizedPageUseOptions, 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, type PageUseCapability, type PageUseCommand, type PageUseCustomPreset, type PageUseErrorCode, type PageUseGlobal, PageUseGlowElement, type PageUseHandle, type PageUseHistoryEntry, type PageUseLLMOptions, type PageUseLauncherConfig, PageUseLauncherElement, type PageUseLauncherLayout, type PageUseMenuNode, type PageUseOptions, type PageUsePoint, type PageUsePreset, type PageUsePresetSaveResult, type PageUsePresetState, type PageUseProgressEvent, type PageUseQuestion, type PageUseRouterMode, type PageUseRunOptions, type PageUseSettings, type PageUseSnapshot, type PageUseState, type PageUseStepLog, type PageUseTaskResult, type PageUseTaskSource, type PageUseTaskStatus, type PageUseTourOptions, type PageUseTourStyle, type PageUseTtsEngine, type PageUseTtsSpeakOptions, type PageUseTtsVoice, type ReadonlyStore, SIMULATOR_MASK_ID, TOUR_STYLE_TRAINER, TOUR_STYLE_USER, browserTtsEngine, buildMenuPresets, clearPageUseLog, createPageUse, definePageUseElements, formatPageUseResultForModel, getElapsedSeconds, getPageUseConfig, hidePageUseLauncher, isPageUseCommand, isPageUseConfigured, isRunning, mountPageUseUI, normalizeOptions, pageUseCapability, pageUseHistory, pageUsePresets, pageUseSettings, pageUseStore, readLauncherSwitch, runPageUseTool, showPageUseLauncher };
package/dist/vue.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { A as pageUseSettings, B as BROWSER_ENGINE_ID, C as getPageUseConfig, D as pageUsePresets, E as pageUseStore, F as DEFAULT_TOUR_MAX_TAB_SWITCHES, H as DEFAULT_TOUR_STYLES, I as normalizeOptions, L as readLauncherSwitch, M as DEFAULT_MODEL, N as DEFAULT_SESSION_HEADER, O as pageUseHistory, P as DEFAULT_STORAGE_KEY_PREFIX, R as PAGE_USE_MASK_COLORS, S as getElapsedSeconds, T as isRunning, U as TOUR_STYLE_TRAINER, V as browserTtsEngine, W as TOUR_STYLE_USER, _ 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 SIMULATOR_MASK_ID } from "./src-ChJ6q7jl.mjs";
1
+ import { A as pageUseSettings, B as BROWSER_ENGINE_ID, C as getPageUseConfig, D as pageUsePresets, E as pageUseStore, F as DEFAULT_TOUR_MAX_TAB_SWITCHES, H as DEFAULT_TOUR_STYLES, I as normalizeOptions, L as readLauncherSwitch, M as DEFAULT_MODEL, N as DEFAULT_SESSION_HEADER, O as pageUseHistory, P as DEFAULT_STORAGE_KEY_PREFIX, R as PAGE_USE_MASK_COLORS, S as getElapsedSeconds, T as isRunning, U as TOUR_STYLE_TRAINER, V as browserTtsEngine, W as TOUR_STYLE_USER, _ 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 SIMULATOR_MASK_ID } from "./src-MjVXh_cW.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.7",
4
+ "version": "0.0.9",
5
5
  "description": "基于 page-agent 的页面操作智能体:自然语言指令驱动页面点击与输入,框架无关,附 Web Component 调试面板与 Vue 适配层",
6
6
  "type": "module",
7
7
  "main": "./dist/index.mjs",