@mearl/client 2.21.0 → 2.22.0

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.
Files changed (125) hide show
  1. package/README.md +31 -1
  2. package/dist/actionTimeouts.js +1 -1
  3. package/dist/artifacts.d.ts +1 -1
  4. package/dist/browserRegistry.d.ts +1 -1
  5. package/dist/check.d.ts +1 -1
  6. package/dist/cli.js +4 -3
  7. package/dist/commands.d.ts +9 -9
  8. package/dist/commands.js +3 -2
  9. package/dist/{generated-app-profile-definition.d.ts → generated/app-profile-definition.d.ts} +2 -2
  10. package/dist/{generated-app-profile-runtime-types.d.ts → generated/app-profile-runtime-types.d.ts} +2 -2
  11. package/dist/{generated-plugin-diagnostics.d.ts → generated/plugin-diagnostics.d.ts} +4 -4
  12. package/dist/{generated-plugin-execution.d.ts → generated/plugin-execution.d.ts} +2 -2
  13. package/dist/{generated-plugin-pages.d.ts → generated/plugin-pages.d.ts} +1 -1
  14. package/dist/{generated-plugin-tasks.d.ts → generated/plugin-tasks.d.ts} +2 -2
  15. package/dist/index.d.ts +15 -15
  16. package/dist/index.js +7 -7
  17. package/dist/pageEvalArguments.d.ts +1 -1
  18. package/dist/pageEvalArguments.js +1 -1
  19. package/dist/plugin-task-host.js +1 -1
  20. package/dist/plugin-worker.js +2 -2
  21. package/dist/plugin.d.ts +1 -118
  22. package/dist/plugin.js +1 -672
  23. package/dist/pluginModelSessionWorker.d.ts +2 -2
  24. package/dist/pluginModelSessionWorker.js +4 -4
  25. package/dist/{pluginHostConnection.d.ts → plugins/clients/pluginHostConnection.d.ts} +2 -2
  26. package/dist/{pluginHostConnection.js → plugins/clients/pluginHostConnection.js} +6 -7
  27. package/dist/{pluginModels.d.ts → plugins/clients/pluginModels.d.ts} +3 -3
  28. package/dist/{pluginPages.d.ts → plugins/clients/pluginPages.d.ts} +3 -3
  29. package/dist/{pluginPages.js → plugins/clients/pluginPages.js} +1 -1
  30. package/dist/{pluginState.d.ts → plugins/clients/pluginState.d.ts} +3 -3
  31. package/dist/{pluginTasks.d.ts → plugins/clients/pluginTasks.d.ts} +4 -4
  32. package/dist/{pluginTasks.js → plugins/clients/pluginTasks.js} +4 -4
  33. package/dist/{officialPluginInstaller.js → plugins/officialPluginInstaller.js} +1 -3
  34. package/dist/{pluginRegistry.d.ts → plugins/pluginRegistry.d.ts} +1 -1
  35. package/dist/{pluginRegistry.js → plugins/pluginRegistry.js} +3 -3
  36. package/dist/{pluginTaskProtocol.d.ts → plugins/pluginTaskProtocol.d.ts} +2 -2
  37. package/dist/{pluginCommandWorker.js → plugins/runtime/pluginCommandWorker.js} +3 -3
  38. package/dist/{pluginDiagnostics.d.ts → plugins/runtime/pluginDiagnostics.d.ts} +4 -4
  39. package/dist/{pluginDiagnostics.js → plugins/runtime/pluginDiagnostics.js} +2 -2
  40. package/dist/{pluginExecution.d.ts → plugins/runtime/pluginExecution.d.ts} +3 -3
  41. package/dist/{pluginExecution.js → plugins/runtime/pluginExecution.js} +1 -1
  42. package/dist/{pluginExecutor.d.ts → plugins/runtime/pluginExecutor.d.ts} +3 -3
  43. package/dist/{pluginExecutor.js → plugins/runtime/pluginExecutor.js} +4 -4
  44. package/dist/{pluginExecutorProtocol.d.ts → plugins/runtime/pluginExecutorProtocol.d.ts} +4 -4
  45. package/dist/{pluginHost.d.ts → plugins/runtime/pluginHost.d.ts} +3 -3
  46. package/dist/{pluginHostPaths.js → plugins/runtime/pluginHostPaths.js} +1 -1
  47. package/dist/{pluginHostServer.js → plugins/runtime/pluginHostServer.js} +3 -3
  48. package/dist/{pluginModelCatalog.d.ts → plugins/runtime/pluginModelCatalog.d.ts} +1 -1
  49. package/dist/{pluginModelSessions.js → plugins/runtime/pluginModelSessions.js} +3 -3
  50. package/dist/{pluginPageManager.d.ts → plugins/runtime/pluginPageManager.d.ts} +4 -4
  51. package/dist/{pluginPageManager.js → plugins/runtime/pluginPageManager.js} +5 -5
  52. package/dist/{pluginRevision.d.ts → plugins/runtime/pluginRevision.d.ts} +1 -1
  53. package/dist/{pluginRevision.js → plugins/runtime/pluginRevision.js} +1 -1
  54. package/dist/{pluginRuntimeCleanup.js → plugins/runtime/pluginRuntimeCleanup.js} +2 -2
  55. package/dist/{pluginStateManager.d.ts → plugins/runtime/pluginStateManager.d.ts} +2 -2
  56. package/dist/{pluginStateManager.js → plugins/runtime/pluginStateManager.js} +2 -2
  57. package/dist/{pluginStateStore.d.ts → plugins/runtime/pluginStateStore.d.ts} +1 -1
  58. package/dist/{pluginStateStore.js → plugins/runtime/pluginStateStore.js} +1 -1
  59. package/dist/{pluginTaskManager.d.ts → plugins/runtime/pluginTaskManager.d.ts} +12 -12
  60. package/dist/{pluginTaskManager.js → plugins/runtime/pluginTaskManager.js} +6 -6
  61. package/dist/{pluginTaskStore.d.ts → plugins/runtime/pluginTaskStore.d.ts} +4 -4
  62. package/dist/{pluginTaskStore.js → plugins/runtime/pluginTaskStore.js} +1 -1
  63. package/dist/{pythonPlugin.d.ts → plugins/runtime/pythonPlugin.d.ts} +2 -2
  64. package/dist/{pythonPlugin.js → plugins/runtime/pythonPlugin.js} +2 -2
  65. package/dist/plugins/sdk/plugin.d.ts +118 -0
  66. package/dist/plugins/sdk/plugin.js +672 -0
  67. package/dist/{pluginAppProfiles.d.ts → plugins/sdk/pluginAppProfiles.d.ts} +1 -1
  68. package/dist/{pluginAppProfiles.js → plugins/sdk/pluginAppProfiles.js} +2 -2
  69. package/dist/{pluginModelDefinition.d.ts → plugins/sdk/pluginModelDefinition.d.ts} +1 -1
  70. package/dist/{pluginPageDefinition.d.ts → plugins/sdk/pluginPageDefinition.d.ts} +1 -1
  71. package/dist/{pluginPageDefinition.js → plugins/sdk/pluginPageDefinition.js} +1 -1
  72. package/dist/{pluginRecoveryDefinition.d.ts → plugins/sdk/pluginRecoveryDefinition.d.ts} +1 -1
  73. package/dist/{pluginStateDefinition.d.ts → plugins/sdk/pluginStateDefinition.d.ts} +2 -2
  74. package/dist/runtimePaths.d.ts +4 -0
  75. package/dist/runtimePaths.js +8 -0
  76. package/dist/socket.d.ts +2 -2
  77. package/dist/socket.js +5 -4
  78. package/dist/unified.d.ts +2 -2
  79. package/dist/unified.js +7 -7
  80. package/package.json +5 -5
  81. /package/dist/{generated-app-profile-definition.js → generated/app-profile-definition.js} +0 -0
  82. /package/dist/{generated-app-profile-runtime-types.js → generated/app-profile-runtime-types.js} +0 -0
  83. /package/dist/{generated-browser-action-protocol.d.ts → generated/browser-action-protocol.d.ts} +0 -0
  84. /package/dist/{generated-browser-action-protocol.js → generated/browser-action-protocol.js} +0 -0
  85. /package/dist/{generated-plugin-diagnostics.js → generated/plugin-diagnostics.js} +0 -0
  86. /package/dist/{generated-plugin-execution.js → generated/plugin-execution.js} +0 -0
  87. /package/dist/{generated-plugin-models.d.ts → generated/plugin-models.d.ts} +0 -0
  88. /package/dist/{generated-plugin-models.js → generated/plugin-models.js} +0 -0
  89. /package/dist/{generated-plugin-pages.js → generated/plugin-pages.js} +0 -0
  90. /package/dist/{generated-plugin-recovery.d.ts → generated/plugin-recovery.d.ts} +0 -0
  91. /package/dist/{generated-plugin-recovery.js → generated/plugin-recovery.js} +0 -0
  92. /package/dist/{generated-plugin-state.d.ts → generated/plugin-state.d.ts} +0 -0
  93. /package/dist/{generated-plugin-state.js → generated/plugin-state.js} +0 -0
  94. /package/dist/{generated-plugin-tasks.js → generated/plugin-tasks.js} +0 -0
  95. /package/dist/{generated-toolbox-icon.d.ts → generated/toolbox-icon.d.ts} +0 -0
  96. /package/dist/{generated-toolbox-icon.js → generated/toolbox-icon.js} +0 -0
  97. /package/dist/{pluginModels.js → plugins/clients/pluginModels.js} +0 -0
  98. /package/dist/{pluginState.js → plugins/clients/pluginState.js} +0 -0
  99. /package/dist/{officialPluginCatalog.d.ts → plugins/officialPluginCatalog.d.ts} +0 -0
  100. /package/dist/{officialPluginCatalog.js → plugins/officialPluginCatalog.js} +0 -0
  101. /package/dist/{officialPluginInstaller.d.ts → plugins/officialPluginInstaller.d.ts} +0 -0
  102. /package/dist/{pluginPageBundle.d.ts → plugins/pluginPageBundle.d.ts} +0 -0
  103. /package/dist/{pluginPageBundle.js → plugins/pluginPageBundle.js} +0 -0
  104. /package/dist/{pluginSource.d.ts → plugins/pluginSource.d.ts} +0 -0
  105. /package/dist/{pluginSource.js → plugins/pluginSource.js} +0 -0
  106. /package/dist/{pluginTaskProtocol.js → plugins/pluginTaskProtocol.js} +0 -0
  107. /package/dist/{pluginTaskWire.d.ts → plugins/pluginTaskWire.d.ts} +0 -0
  108. /package/dist/{pluginTaskWire.js → plugins/pluginTaskWire.js} +0 -0
  109. /package/dist/{pluginCommandWorker.d.ts → plugins/runtime/pluginCommandWorker.d.ts} +0 -0
  110. /package/dist/{pluginExecutorProtocol.js → plugins/runtime/pluginExecutorProtocol.js} +0 -0
  111. /package/dist/{pluginExecutorSupervisor.d.ts → plugins/runtime/pluginExecutorSupervisor.d.ts} +0 -0
  112. /package/dist/{pluginExecutorSupervisor.js → plugins/runtime/pluginExecutorSupervisor.js} +0 -0
  113. /package/dist/{pluginHost.js → plugins/runtime/pluginHost.js} +0 -0
  114. /package/dist/{pluginHostFiles.d.ts → plugins/runtime/pluginHostFiles.d.ts} +0 -0
  115. /package/dist/{pluginHostFiles.js → plugins/runtime/pluginHostFiles.js} +0 -0
  116. /package/dist/{pluginHostPaths.d.ts → plugins/runtime/pluginHostPaths.d.ts} +0 -0
  117. /package/dist/{pluginHostServer.d.ts → plugins/runtime/pluginHostServer.d.ts} +0 -0
  118. /package/dist/{pluginModelCatalog.js → plugins/runtime/pluginModelCatalog.js} +0 -0
  119. /package/dist/{pluginModelSessions.d.ts → plugins/runtime/pluginModelSessions.d.ts} +0 -0
  120. /package/dist/{pluginProcessTree.d.ts → plugins/runtime/pluginProcessTree.d.ts} +0 -0
  121. /package/dist/{pluginProcessTree.js → plugins/runtime/pluginProcessTree.js} +0 -0
  122. /package/dist/{pluginRuntimeCleanup.d.ts → plugins/runtime/pluginRuntimeCleanup.d.ts} +0 -0
  123. /package/dist/{pluginModelDefinition.js → plugins/sdk/pluginModelDefinition.js} +0 -0
  124. /package/dist/{pluginRecoveryDefinition.js → plugins/sdk/pluginRecoveryDefinition.js} +0 -0
  125. /package/dist/{pluginStateDefinition.js → plugins/sdk/pluginStateDefinition.js} +0 -0
package/README.md CHANGED
@@ -211,6 +211,20 @@ Provider 与插件仍可独立安装、更新和卸载,帮助聚合不会启
211
211
  注册名优先使用显式名称,其次读取入口的 `name` metadata,最后回退到 skill 目录名;常规注册只传路径。
212
212
  setup 会补齐缺失或低于自身版本的 client、native-host;安装参数透传给 Ali Skills,并固定全局共享安装。
213
213
 
214
+ `mearl-bbrowser` Skill 提供 `bbrowser` 插件,可直接加载 bb-browser 格式的社区及私有站点适配器,无需安装 bb-browser:
215
+
216
+ ```bash
217
+ npx @mearl/setup plugin install trip/mearl --skill mearl-bbrowser --yes
218
+ mearl bbrowser site list
219
+ mearl bbrowser site fliggy-ebooking/whoami
220
+ mearl bbrowser site ./fliggy-ebooking/ai-agent.js
221
+ mearl bbrowser site zhihu/hot 10
222
+ mearl bbrowser site zhihu/hot 10 --cdp
223
+ ```
224
+
225
+ 插件通过同一 `page_eval` 接口调用扩展或直连 CDP。适配器来源、私有目录、更新与结构化调用见
226
+ [mearl-bbrowser Skill](../skills/mearl-bbrowser/SKILL.md)。插件默认输出 JSON。
227
+
214
228
  需要单独检查插件时运行 `mearl <name> --version`。命令会解析注册记录并加载入口,但不连接浏览器;
215
229
  退出码为 0 表示插件已注册且入口可加载,stdout 返回同目录 `SKILL.md` 的版本,缺少版本元数据时返回 `unknown`。
216
230
  未注册、入口丢失或加载失败会以退出码 2 和对应的 `PLUGIN_*` 错误结束。普通业务调用无需预先检查,直接处理同样的错误即可。
@@ -220,6 +234,7 @@ setup 会补齐缺失或低于自身版本的 client、native-host;安装参
220
234
  使用位置参数和业务选项,`--payload` 不能与前两种形式混用。JSON 保留业务字段类型;正文等文件输入按具体
221
235
  skill 的字段约定处理。`browser`、`timeout`、`output` 等宿主选项保留原有含义;同名业务字段以及数字、
222
236
  布尔值、对象和数组通过 `--payload` 传入。插件不使用上表中内置 action 的 `--payload-file` 入口。
237
+ 业务选项名称支持字母开头的字母、数字和下划线组合,下划线原样传递。
223
238
 
224
239
  注册后的插件也可从 SDK 调用;实例方法 `client.invokePlugin` 复用既有连接和默认浏览器:
225
240
 
@@ -347,6 +362,8 @@ Preact、Hooks 和 HTM 运行时。页面从 `window.mearl.ui` 读取 `html`、`
347
362
  `--mearl-accent` 等语义变量;主操作按钮使用 `--mearl-action-primary`、
348
363
  `--mearl-action-primary-hover` 和 `--mearl-action-primary-text`,以保持与扩展按钮一致。
349
364
 
365
+ 工具箱面向人,CLI 面向 Agent:复用业务操作、保持结果一致即可,不要求共享中间态。表单草稿、选择、预览等纯 UI 状态默认放浏览器内存;确需刷新或重新打开后恢复时再用浏览器存储。sandbox 页不能假定可直接访问 `localStorage`、IndexedDB 或 `chrome.storage`,应使用宿主提供的能力。只有业务记录、关闭页面后继续的任务、安全重试回执或受消息大小限制的资源传输才需要 Node 状态,并说明其生命周期及清理方式。
366
+
350
367
  需要 BUC 身份的内部 HTTP 接口通过官方 `buc` 插件调用。CLI 使用 `mearl buc request <url> [app]`,业务插件使用
351
368
  `app.invoke('buc', { command: 'request', input })`;当前身份和人员资料分别使用 `whoami` 与 `profile`
352
369
  子命令。BUC 插件按请求创建一次性凭据,只接受无 URL 凭据的 HTTPS 地址,过滤认证字段与 Cookie;
@@ -377,12 +394,14 @@ AuthX 对应 `mearl authx request <url> [audience]`,省略 `audience` 时同
377
394
 
378
395
  页面交互动作(`page_click` / `page_drag` / `page_type` / `page_hover` / `page_scroll` / `page_press` / `page_upload`)默认等待异步稳定并返回 `{ action, observation }`。参数、ref 或目标解析在派发前失败时返回 `action.stage: "precondition"`,省略无意义的 `observation` / `diagnostics`;浏览器可能已收到输入但确认超时时返回 `action.stage: "dispatch-uncertain"`,并保留 observation 供核验当前状态。能够在超时前确定的目标、命中、坐标、派发模式和输入序列状态保存在 `action.attempt`,它是诊断证据,不表示动作已经生效。失败时 CLI 退出码为 1。传 `observe: false` 可执行裸动作;需要同一动作期间的新增 error logs 和业务 requests 时传 `diagnostics: true`,埋点通过 `diagnostics.events` 按需开启。`page_eval` 默认裸执行,可按需开启观察或诊断。
379
396
 
380
- `tab_open active:true` 会激活目标 Tab、恢复最小化窗口,并通过 `activation` 返回实际标签页、窗口和 `visibilityState`;依赖可信触摸时先确认页面为 `visible`。页面动作的稳定观察会在有限预算内等待有限时长 CSS 动画。selector/ref 点击遇到嵌套滚动裁剪时会先滚动目标,仍不可见时才以明确的裁剪错误停止。
397
+ `tab_open active:true` 请求激活目标页。扩展免打扰默认开启:HTTP(S) 页面在首次导航前启用后台焦点模拟,不切换标签页或窗口;关闭免打扰才会真实激活并恢复最小化窗口。`activation.mode` 区分 `background` / `foreground`,模拟后的 `visibilityState` 不代表窗口在前台。焦点模拟在交接、释放控制或扩展连接断开时关闭,`preserveEnvironment` 不保留它;交还后按需对同 URL 使用 `reuse:"require", active:true` 再次激活。不带会话时通过 `browser_release` 收尾。纯 CDP 和外部 Provider 遵循各自的激活能力。页面动作的稳定观察会在有限预算内等待有限时长 CSS 动画。selector/ref 点击遇到嵌套滚动裁剪时会先滚动目标,仍不可见时才以明确的裁剪错误停止。
381
398
 
382
399
  `page_click` 默认 `auto` 在隐藏页使用 DOM fallback,selector、文本、ref 和坐标定位都保持可用,并通过 `dispatchMode: "dom"`、`fallbackReason: "page-hidden"` 明确说明实际路径。普通后台任务不需要为了点击主动激活页面;只有站点明确拒绝非可信事件时才切换到可见页并强制 `mouse` / `touch`。
383
400
 
384
401
  `observation.effects.interactives` 会把内容未变化但 DOM 节点被框架重建的控件标记为 `recreated`,保留 selector/ref 与语义信息供后续定位,同时省略未变化的 value 和状态字段;值或状态确实变化时仍返回完整差异。
385
402
 
403
+ `observation.effects.texts` 按需返回普通可见叶子文本的当前值 `{ selector, text }`,覆盖独立计数、金额等非控件文字。结果最多 8 项,每项 text 最多 160 字符;同一节点连续更新只保留最终值。非空文字的 Range 矩形必须完整处于视口和祖先滚动/裁剪框内,并通过命中检查;CSS 掩码文本不进入该通道。空文本使用元素框检查。结果不作为可交互控件或业务成功信号。复杂结构、不可读内容及预算溢出仍保留快照回退;该通道不改变导航等待策略。
404
+
386
405
  `page_press.pressMode` 支持 `auto` / `dom` / `keyboard`。默认 `auto` 在隐藏页使用 DOM 键盘事件,并通过返回的 `dispatchMode`、`fallbackReason` 和 `defaultAction` 说明实际派发及默认行为模拟结果;依赖浏览器原生编辑、选择或滚动行为时使用可见页面和 `keyboard`。
387
406
 
388
407
  `page_snapshot` 默认返回完整 AX Tree;长列表可传 `mode: "viewport"`,只需要当前视口内的控件时传 `mode: "interactive"`,AX 信息为空或过于稀疏时可显式传 `mode: "dom"`,返回实际渲染文本、原生控件、显式 role 和高置信 clickable 节点。DOM 模式同样返回可供后续动作使用的 `@ref`,但不会猜测任意容器的业务语义。已知 CSS 区域时传 `rootSelector`,已有 ref 时传 `rootRef`(可用 `ancestorDepth` 向上补充上下文),只查找特定文案或角色时传 `query`。`interactive` 在视口内缺少 AX 控件语义时仍只回退到 AX viewport,并返回 `fallbackMode: "viewport"`,不会自动切换数据来源。`maxNodes` / `maxChars` 截断会同时保留首尾内容。
@@ -418,6 +437,17 @@ debugger/CDP 控制和会话级临时状态,保留浏览器及全部标签页
418
437
 
419
438
  基础设施组件必须避免递归路由:`@mearl/cloud-connector` 使用 `@mearl/client/local` 子路径直连所在机器的 native-host。普通 Agent、CLI 与 MCP 集成均使用包根入口。
420
439
 
440
+ 插件代码按职责组织在 `src/plugins/`:
441
+
442
+ | 目录 | 职责 |
443
+ | --- | --- |
444
+ | `sdk/` | 插件声明、命令接口及页面、模型、状态和恢复声明的校验 |
445
+ | `clients/` | 插件服务连接及任务、模型、页面、状态的调用接口 |
446
+ | `runtime/` | 服务组装、任务调度、存储、代码快照、执行器和进程清理 |
447
+ | 插件目录根部 | 注册、资源打包、官方插件安装及调用端与服务端共享的通信协议 |
448
+
449
+ 测试位于各模块附近的 `__tests__/`。对外通过 `@mearl/client` 和 `@mearl/client/plugin` 导出;包根部的 `plugin.ts` 是插件公开入口。三个进程入口 `plugin-worker.ts`、`plugin-task-host.ts` 和 `pluginModelSessionWorker.ts` 保留在 `src/` 根部,`runtimePaths.ts` 统一定位包版本和进程入口,使逐文件编译与 Native Host 打包使用相同的入口布局。生成协议仍由 `browser-core` 同步到 `src/generated/`。
450
+
421
451
  ## 构建
422
452
 
423
453
  ```bash
@@ -1,4 +1,4 @@
1
- import { PAGE_ACT_ACTIONS } from './generated-browser-action-protocol.js';
1
+ import { PAGE_ACT_ACTIONS } from './generated/browser-action-protocol.js';
2
2
  const SEND_REQUEST_FILE_TRANSFER_TIMEOUT_MS = 120_000;
3
3
  // Remote Providers may stage files before forwarding a page upload.
4
4
  const PAGE_UPLOAD_FILE_TRANSFER_TIMEOUT_MS = 180_000;
@@ -1,4 +1,4 @@
1
- import type { BrowserArtifact } from './generated-browser-action-protocol.js';
1
+ import type { BrowserArtifact } from './generated/browser-action-protocol.js';
2
2
  import type { UnifiedInvokeOptions } from './unified.js';
3
3
  interface Invoker {
4
4
  invoke(action: string, data?: Record<string, any>, options?: UnifiedInvokeOptions): Promise<any>;
@@ -8,7 +8,7 @@
8
8
  * registry directory and record shape; reading scans every *.json in the dir,
9
9
  * so it never needs to replicate daemon-core's filename hashing.
10
10
  */
11
- import type { BrowserCapabilities, BrowserDetails, BrowserPairingInfo, BrowserProviderIdentity, BrowserProviderOperation, BrowserReference, BrowserTransport } from './generated-browser-action-protocol.js';
11
+ import type { BrowserCapabilities, BrowserDetails, BrowserPairingInfo, BrowserProviderIdentity, BrowserProviderOperation, BrowserReference, BrowserTransport } from './generated/browser-action-protocol.js';
12
12
  export interface LiveBrowser {
13
13
  pid: number;
14
14
  browserId: string;
package/dist/check.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { CloudConnectorInfo } from '@mearl/cloud-types';
2
2
  import { type NativeHostDiagnostic } from './nativeHost.js';
3
- import type { BrowserCapabilities, BrowserProviderIdentity, BrowserProviderOperation } from './generated-browser-action-protocol.js';
3
+ import type { BrowserCapabilities, BrowserProviderIdentity, BrowserProviderOperation } from './generated/browser-action-protocol.js';
4
4
  import { type UnifiedClientOptions, type UnifiedInvokeOptions } from './unified.js';
5
5
  export interface UnifiedCheckVersions {
6
6
  nativeHost?: string;
package/dist/cli.js CHANGED
@@ -8,7 +8,7 @@ import { commandInput, findCommandSuggestions, formatCommandSuggestions, } from
8
8
  import { COMMANDS, COMMAND_MAP } from './commands.js';
9
9
  import { CLIENT_VERSION } from './socket.js';
10
10
  import { UnifiedClient } from './unified.js';
11
- import { findPluginEntry, findPluginRegistration, findOfficialPlugin, listPluginNames, listOfficialPluginNames, loadRegisteredPlugin, PluginError, } from './plugin.js';
11
+ import { findPluginEntry, findPluginRegistration, findOfficialPlugin, listPluginNames, listOfficialPluginNames, loadRegisteredPlugin, PluginError, } from './plugins/sdk/plugin.js';
12
12
  import { getCloudServerConfigPath, loadCloudServerConfig } from './unifiedConfig.js';
13
13
  const TOP_LEVEL_COMMAND_NAME_WIDTH = 22;
14
14
  const CATEGORIES = [
@@ -90,6 +90,7 @@ const PLUGIN_HOST_OPTIONS = new Set([
90
90
  '--payload',
91
91
  '--payload-file',
92
92
  '--server',
93
+ '--session',
93
94
  '--timeout',
94
95
  '--verbose',
95
96
  '--version',
@@ -104,7 +105,7 @@ function findPluginInputOptionNames(args) {
104
105
  if (PLUGIN_HOST_OPTIONS.has(option))
105
106
  continue;
106
107
  const name = option.slice(2);
107
- if (!/^[a-zA-Z][a-zA-Z0-9]*$/.test(name)) {
108
+ if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(name)) {
108
109
  throw new Error(`无效的插件业务选项: ${option}`);
109
110
  }
110
111
  names.add(name);
@@ -473,7 +474,7 @@ export function parseClientArgs(args, plugin = false) {
473
474
  throw new Error('插件业务选项不能与 --payload 同时使用');
474
475
  }
475
476
  const json = options.json === true;
476
- if (json && action !== 'check')
477
+ if (json && action !== 'check' && !plugin)
477
478
  throw new Error('--json 仅适用于 check');
478
479
  if (options.updates && action !== 'check')
479
480
  throw new Error('--updates 仅适用于 check');
@@ -1,4 +1,4 @@
1
- import { type BrowserCommandAction } from './generated-browser-action-protocol.js';
1
+ import { type BrowserCommandAction } from './generated/browser-action-protocol.js';
2
2
  export interface ParamDef {
3
3
  name: string;
4
4
  type: string;
@@ -487,7 +487,7 @@ export declare const COMMANDS: readonly [{
487
487
  }, {
488
488
  readonly name: "active";
489
489
  readonly type: "boolean";
490
- readonly description: "是否激活目标 Tab 并恢复最小化窗口,默认 false;响应返回 activation 验证结果";
490
+ readonly description: "是否激活目标 Tab,默认 false;扩展免打扰默认开启,使用后台焦点模拟,关闭后才切换前台;响应返回 activation";
491
491
  }, {
492
492
  readonly name: "openerTabId";
493
493
  readonly type: "number";
@@ -613,7 +613,7 @@ export declare const COMMANDS: readonly [{
613
613
  readonly required: true;
614
614
  readonly description: "目标标签页 ID";
615
615
  }];
616
- readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。失败以退出码 1 结束。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。"];
616
+ readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。失败以退出码 1 结束。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "effects.texts 按需返回普通可见文本的 selector/text,不代表可点击控件或业务成功;超限或覆盖不完整时仍提示补快照。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。"];
617
617
  readonly notes: readonly ["selector / text / point 必须且只能提供一个。隐藏页 auto 使用 DOM;只有明确依赖真实用户手势时才激活页面。", "原生 select 可按 option 文本点击;checkbox/radio 返回 controlState.checkedBefore/checkedAfter。"];
618
618
  readonly examples: ["page_click --payload '{\"tabId\":12345,\"text\":\"提交\"}'", "page_click --payload '{\"tabId\":12345,\"text\":\"退款明细\",\"role\":\"button\"}'", "page_click --payload '{\"tabId\":12345,\"text\":\"确定\",\"scope\":\"@e12\"}'", "page_click --payload '{\"tabId\":12345,\"selector\":\"@e3\"}'", "page_click --payload '{\"tabId\":12345,\"selector\":\".submit-btn\"}'", "page_click --payload '{\"tabId\":12345,\"selector\":\".gesture-btn\",\"clickMode\":\"touch\"}'", "page_click --payload '{\"tabId\":12345,\"point\":{\"x\":336,\"y\":117}}'", "page_click --payload '{\"tabId\":12345,\"point\":{\"x\":196,\"y\":240},\"coordinateSpace\":\"active-frame\"}'"];
619
619
  }, {
@@ -643,7 +643,7 @@ export declare const COMMANDS: readonly [{
643
643
  readonly required: true;
644
644
  readonly description: "目标标签页 ID";
645
645
  }];
646
- readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。失败以退出码 1 结束。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。"];
646
+ readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。失败以退出码 1 结束。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "effects.texts 按需返回普通可见文本的 selector/text,不代表可点击控件或业务成功;超限或覆盖不完整时仍提示补快照。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。"];
647
647
  readonly notes: readonly ["起点会自动滚入视口,终点必须同时位于当前视口;否则先滚动页面。隐藏页 auto 使用 DOM,不切换活动页。"];
648
648
  readonly examples: ["page_drag --payload '{\"tabId\":12345,\"from\":{\"x\":350,\"y\":80},\"to\":{\"x\":80,\"y\":80}}'", "page_drag --payload '{\"tabId\":12345,\"from\":\"@e3\",\"to\":\"#drop-zone\",\"dragMode\":\"mouse\"}'"];
649
649
  }, {
@@ -669,7 +669,7 @@ export declare const COMMANDS: readonly [{
669
669
  readonly required: true;
670
670
  readonly description: "目标标签页 ID";
671
671
  }];
672
- readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。失败以退出码 1 结束。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。"];
672
+ readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。失败以退出码 1 结束。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "effects.texts 按需返回普通可见文本的 selector/text,不代表可点击控件或业务成功;超限或覆盖不完整时仍提示补快照。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。"];
673
673
  readonly examples: ["page_type --payload '{\"tabId\":12345,\"selector\":\"@e6\",\"text\":\"搜索关键词\"}'"];
674
674
  }, {
675
675
  readonly name: "page_hover";
@@ -685,7 +685,7 @@ export declare const COMMANDS: readonly [{
685
685
  readonly required: true;
686
686
  readonly description: "目标标签页 ID";
687
687
  }];
688
- readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。失败以退出码 1 结束。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。"];
688
+ readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。失败以退出码 1 结束。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "effects.texts 按需返回普通可见文本的 selector/text,不代表可点击控件或业务成功;超限或覆盖不完整时仍提示补快照。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。"];
689
689
  readonly examples: ["page_hover --payload '{\"tabId\":12345,\"selector\":\".nav-menu\"}'"];
690
690
  }, {
691
691
  readonly name: "page_scroll";
@@ -713,7 +713,7 @@ export declare const COMMANDS: readonly [{
713
713
  readonly required: true;
714
714
  readonly description: "目标标签页 ID";
715
715
  }];
716
- readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。失败以退出码 1 结束。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。", "action.data 返回 moved、atTop/atBottom、scrollYBefore/After、maxScrollY、resolvedContainer 和 ancestorDistance;自动发现的内部容器提供可复用 containerSelector。"];
716
+ readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。失败以退出码 1 结束。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "effects.texts 按需返回普通可见文本的 selector/text,不代表可点击控件或业务成功;超限或覆盖不完整时仍提示补快照。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。", "action.data 返回 moved、atTop/atBottom、scrollYBefore/After、maxScrollY、resolvedContainer 和 ancestorDistance;自动发现的内部容器提供可复用 containerSelector。"];
717
717
  readonly examples: ["page_scroll --payload '{\"tabId\":12345,\"direction\":\"down\"}'", "page_scroll --payload '{\"tabId\":12345,\"direction\":\"bottom\"}'", "page_scroll --payload '{\"tabId\":12345,\"selector\":\".virtual-list\",\"direction\":\"down\",\"distance\":800}'", "page_scroll --payload '{\"tabId\":12345,\"selector\":\"@e8\",\"containerPolicy\":\"nearest\",\"direction\":\"bottom\"}'"];
718
718
  }, {
719
719
  readonly name: "page_runtime";
@@ -821,7 +821,7 @@ export declare const COMMANDS: readonly [{
821
821
  readonly description: "目标标签页 ID";
822
822
  }];
823
823
  readonly notes: readonly ["隐藏页 DOM 模式支持 Tab 焦点移动、原生控件 Enter/Space 激活和输入框 Enter 提交;编辑、选择、方向键和页面滚动等原生行为需可见页与 pressMode=keyboard。"];
824
- readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。失败以退出码 1 结束。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。", "action.data.dispatchMode / fallbackReason / defaultAction 说明实际输入路径。"];
824
+ readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。失败以退出码 1 结束。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "effects.texts 按需返回普通可见文本的 selector/text,不代表可点击控件或业务成功;超限或覆盖不完整时仍提示补快照。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。", "action.data.dispatchMode / fallbackReason / defaultAction 说明实际输入路径。"];
825
825
  readonly examples: ["page_press --payload '{\"tabId\":12345,\"key\":\"Enter\"}'"];
826
826
  }, {
827
827
  readonly name: "page_wait";
@@ -911,7 +911,7 @@ export declare const COMMANDS: readonly [{
911
911
  readonly required: true;
912
912
  readonly description: "目标标签页 ID";
913
913
  }];
914
- readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。失败以退出码 1 结束。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。"];
914
+ readonly result: readonly ["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。", "observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。", "包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。失败以退出码 1 结束。", "observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。", "effects.texts 按需返回普通可见文本的 selector/text,不代表可点击控件或业务成功;超限或覆盖不完整时仍提示补快照。", "fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。", "显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。"];
915
915
  readonly notes: readonly ["直接写入 input[type=file],不依赖 file chooser;隐藏的文件节点也可上传。外部 Provider 的文件中转能力查询 mearl <providerId>。"];
916
916
  readonly examples: ["page_upload --payload '{\"tabId\":12345,\"selector\":\"#file-input\",\"filePaths\":[\"/Users/me/photo.jpg\"]}'"];
917
917
  }, {
package/dist/commands.js CHANGED
@@ -1,4 +1,4 @@
1
- import { APP_PROFILE_NAMES, BROWSER_DEVICE_PRESET_NAMES, } from './generated-browser-action-protocol.js';
1
+ import { APP_PROFILE_NAMES, BROWSER_DEVICE_PRESET_NAMES, } from './generated/browser-action-protocol.js';
2
2
  /** 容器档案名列表(拼进参数说明,新增档案无需改本文件) */
3
3
  const APP_PROFILE_NAME_LIST = APP_PROFILE_NAMES.join('/');
4
4
  const DEVICE_PRESET_TYPE = BROWSER_DEVICE_PRESET_NAMES.map(name => JSON.stringify(name)).join(' | ');
@@ -32,6 +32,7 @@ const PAGE_ACTION_RESULT = [
32
32
  'observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。',
33
33
  '包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。失败以退出码 1 结束。',
34
34
  'observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。',
35
+ 'effects.texts 按需返回普通可见文本的 selector/text,不代表可点击控件或业务成功;超限或覆盖不完整时仍提示补快照。',
35
36
  'fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。',
36
37
  '显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。',
37
38
  ];
@@ -499,7 +500,7 @@ export const COMMANDS = [
499
500
  {
500
501
  name: 'active',
501
502
  type: 'boolean',
502
- description: '是否激活目标 Tab 并恢复最小化窗口,默认 false;响应返回 activation 验证结果',
503
+ description: '是否激活目标 Tab,默认 false;扩展免打扰默认开启,使用后台焦点模拟,关闭后才切换前台;响应返回 activation',
503
504
  },
504
505
  {
505
506
  name: 'openerTabId',
@@ -1,5 +1,5 @@
1
- import type { BrowserDevicePresetName, AppBridgeConfig } from './generated-browser-action-protocol.js';
2
- import type { AppBridgeSpec, AppImagePickerConfig, AppLayerUrlProxyConfig, AppMiniProgramConfig, AppNativeBackConfig, AppOverlayConfig, AppSchemeRule, AppTitleBarHostStyle, BridgeActionMap } from './generated-app-profile-runtime-types.js';
1
+ import type { BrowserDevicePresetName, AppBridgeConfig } from './browser-action-protocol.js';
2
+ import type { AppBridgeSpec, AppImagePickerConfig, AppLayerUrlProxyConfig, AppMiniProgramConfig, AppNativeBackConfig, AppOverlayConfig, AppSchemeRule, AppTitleBarHostStyle, BridgeActionMap } from './app-profile-runtime-types.js';
3
3
  export interface AppProfilePolicies {
4
4
  titleBar?: 'default' | 'taobao' | 'fliggy' | 'alipay' | 'wechat';
5
5
  navigatorLanguage?: boolean;
@@ -1,5 +1,5 @@
1
- import type { AppProfileBinding, AppProfilePolicies, AppProfileSetting } from './generated-app-profile-definition.js';
2
- import type { BrowserDevicePresetName } from './generated-browser-action-protocol.js';
1
+ import type { AppProfileBinding, AppProfilePolicies, AppProfileSetting } from './app-profile-definition.js';
2
+ import type { BrowserDevicePresetName } from './browser-action-protocol.js';
3
3
  type DeviceCutout = 'none' | 'dynamic-island' | 'notch' | 'side-camera';
4
4
  /** 桥调用风格,与页面适配器使用的端内调用约定一一对应。 */
5
5
  export type AppBridgeStyle = 'windvane' | 'fliggy' | 'alipay' | 'callback' | 'btrip' | 'invoke' | 'callHandler' | 'amap' | 'didi' | 'easybikeNative' | 'mega' | 'wechat' | 'wechatMiniProgram';
@@ -1,7 +1,7 @@
1
- import type { PluginExecutionHost, PluginInvocationSource } from './generated-plugin-execution.js';
2
- import type { PluginTaskState, PluginTaskResultReference } from './generated-plugin-tasks.js';
3
- import type { PluginTaskCheckpointReference } from './generated-plugin-recovery.js';
4
- import type { PluginModelDiagnostic } from './generated-plugin-models.js';
1
+ import type { PluginExecutionHost, PluginInvocationSource } from './plugin-execution.js';
2
+ import type { PluginTaskState, PluginTaskResultReference } from './plugin-tasks.js';
3
+ import type { PluginTaskCheckpointReference } from './plugin-recovery.js';
4
+ import type { PluginModelDiagnostic } from './plugin-models.js';
5
5
  export interface PluginDiagnosticOptions {
6
6
  taskId?: string;
7
7
  plugin?: string;
@@ -1,5 +1,5 @@
1
- import type { PluginPageBinding } from './generated-plugin-pages.js';
2
- import type { PluginTaskRecoveryContext } from './generated-plugin-recovery.js';
1
+ import type { PluginPageBinding } from './plugin-pages.js';
2
+ import type { PluginTaskRecoveryContext } from './plugin-recovery.js';
3
3
  /** Identifies an execution environment separately from a process incarnation. */
4
4
  export interface PluginExecutionHost {
5
5
  hostId: string;
@@ -1,4 +1,4 @@
1
- import type { PluginExecutionError, PluginExecutionHost } from './generated-plugin-execution.js';
1
+ import type { PluginExecutionError, PluginExecutionHost } from './plugin-execution.js';
2
2
  export declare const PLUGIN_PAGE_LEASE_MS = 30000;
3
3
  /** Document or access-scope invalidation can cross transports that preserve only a message. */
4
4
  export declare function isPluginPageInvalidation(error: unknown): boolean;
@@ -1,5 +1,5 @@
1
- import type { PluginExecutionError, PluginExecutionHost, PluginInvocationSource } from './generated-plugin-execution.js';
2
- import type { PluginTaskCheckpointReference } from './generated-plugin-recovery.js';
1
+ import type { PluginExecutionError, PluginExecutionHost, PluginInvocationSource } from './plugin-execution.js';
2
+ import type { PluginTaskCheckpointReference } from './plugin-recovery.js';
3
3
  export declare const PLUGIN_TASK_PROTOCOL_VERSION = 5;
4
4
  export type PluginTaskState = 'queued' | 'running' | 'cancelling' | 'success' | 'error' | 'cancelled' | 'interrupted';
5
5
  export interface PluginTaskResultReference {
package/dist/index.d.ts CHANGED
@@ -1,21 +1,21 @@
1
- export { PluginHostConnection, type PluginHostConnectionOptions, type PluginHostClientOptions, } from './pluginHostConnection.js';
1
+ export { PluginHostConnection, type PluginHostConnectionOptions, type PluginHostClientOptions, } from './plugins/clients/pluginHostConnection.js';
2
2
  /**
3
3
  * @mearl/client — unified Mearl browser client
4
4
  *
5
5
  * Discovers browser targets on this machine and every configured cloud connector,
6
6
  * then routes actions using the global browser ids returned by browser_list.
7
7
  */
8
- export { PluginTaskClient, type PluginTaskStartOptions, type PluginTaskWaitOptions, type PluginTaskClientOptions, type PluginTask, type PluginTaskEvents, type PluginTaskListResult, type PluginTaskStartResult, } from './pluginTasks.js';
9
- export { PluginPageClient } from './pluginPages.js';
10
- export type { PluginPageInstance, PluginPageEvents, PluginPageRuntime, PluginPageActivation, PluginPageTarget, PluginPageOperation, } from './pluginPages.js';
11
- export { executeRegisteredPlugin, type PluginExecutorOptions, type PluginExecutorDependencies, type PluginCommandContext, type PluginExecutionHost, type PluginInvocationIdentity, type PluginInvocationSource, } from './plugin.js';
8
+ export { PluginTaskClient, type PluginTaskStartOptions, type PluginTaskWaitOptions, type PluginTaskClientOptions, type PluginTask, type PluginTaskEvents, type PluginTaskListResult, type PluginTaskStartResult, } from './plugins/clients/pluginTasks.js';
9
+ export { PluginPageClient } from './plugins/clients/pluginPages.js';
10
+ export type { PluginPageInstance, PluginPageEvents, PluginPageRuntime, PluginPageActivation, PluginPageTarget, PluginPageOperation, } from './plugins/clients/pluginPages.js';
11
+ export { executeRegisteredPlugin, type PluginExecutorOptions, type PluginExecutorDependencies, type PluginCommandContext, type PluginExecutionHost, type PluginInvocationIdentity, type PluginInvocationSource, } from './plugins/sdk/plugin.js';
12
12
  export { UnifiedClient, UnifiedClient as MearlClient, decodeBrowserTarget, invoke, invokePlugin, listCloudConnectors, } from './unified.js';
13
13
  export type { UnifiedClientOptions, UnifiedInvokeOptions, UnifiedInvokeOptions as InvokeOptions, } from './unified.js';
14
- export type { PluginInvocation, PluginInvokeOptions, PluginProgress, StructuredPluginProgress, } from './plugin.js';
15
- export { APP_PROFILE_NAMES, BROWSER_DEVICE_PRESET_NAMES, BROWSER_ACTIONS, BROWSER_CAPABILITY_ACTIONS, BROWSER_COMMAND_ACTIONS, EXTENSION_BROWSER_ACTIONS, PAGE_ACT_ACTIONS, SEND_REQUEST_MAX_FILES, SEND_REQUEST_MAX_TOTAL_BASE64_FILE_BYTES, SEND_REQUEST_MAX_TOTAL_FILE_BYTES, isBrowserAction, isBrowserCapabilityAction, isBrowserCommandAction, isExtensionBrowserAction, } from './generated-browser-action-protocol.js';
16
- export type { ActionStep, AppProfileName, BrowserAction, BrowserActionMap, BrowserActionRequest, BrowserActionResponse, BrowserCapabilities, BrowserCapabilityAction, BrowserCloseParams, BrowserCommandAction, BrowserInfo, BrowserInfoBase, BrowserJsonValue, BrowserLaunchParams, BrowserProviderOperation, BrowserListResult, BrowserPairingInfo, BrowserReleaseFailure, BrowserReleaseResult, BrowserProviderDefinition, BrowserProviderIdentity, BrowserProviderInputSchema, BrowserProviderListResult, BrowserReference, BrowserDetails, BrowserSource, BrowserStatus, BrowserScreenshotKind, BrowserTransport, CaptureCheckpointParams, CaptureCheckpointResult, BrowserDevicePresetName, BrowserEmulationOptions, ExtensionBrowserAction, GetCookieParams, GetCookieResult, GetEventsParams, GetLogsParams, GetMocksParams, GetRequestsParams, ManagedBrowserInfo, PageClickParams, PageDragEndpoint, PageDragParams, PageDragPoint, PageActAction, PageDiagnosticsOptions, PageDiagnosticsSetting, PageEvalParams, PageFramesParams, PageHoverParams, PageInspectFilter, PageInspectParams, PageNavigateParams, PageObservationWaitOptions, PagePressParams, PageScreenshotParams, PageScrollParams, PageSnapshotParams, PageSnapshotQuery, PageTypeParams, PageUploadParams, PageWaitParams, RegularBrowserInfo, RequestDomainPermissionParams, RulesResult, RunActionName, RunActionsParams, SelectBrowserParams, SelectBrowserResult, SendRequestFile, SendRequestBinaryBody, SendRequestFormValue, SendMtopRequestParams, SendRequestParams, SetAppProfileParams, SetCookieParams, SetCookieResult, SetDeviceEmulationParams, SetMockParams, SetRuleParams, SetTimezoneParams, SetTimezoneResult, TabCloseParams, TabOpenParams, } from './generated-browser-action-protocol.js';
14
+ export type { PluginInvocation, PluginInvokeOptions, PluginProgress, StructuredPluginProgress, } from './plugins/sdk/plugin.js';
15
+ export { APP_PROFILE_NAMES, BROWSER_DEVICE_PRESET_NAMES, BROWSER_ACTIONS, BROWSER_CAPABILITY_ACTIONS, BROWSER_COMMAND_ACTIONS, EXTENSION_BROWSER_ACTIONS, PAGE_ACT_ACTIONS, SEND_REQUEST_MAX_FILES, SEND_REQUEST_MAX_TOTAL_BASE64_FILE_BYTES, SEND_REQUEST_MAX_TOTAL_FILE_BYTES, isBrowserAction, isBrowserCapabilityAction, isBrowserCommandAction, isExtensionBrowserAction, } from './generated/browser-action-protocol.js';
16
+ export type { ActionStep, AppProfileName, BrowserAction, BrowserActionMap, BrowserActionRequest, BrowserActionResponse, BrowserCapabilities, BrowserCapabilityAction, BrowserCloseParams, BrowserCommandAction, BrowserInfo, BrowserInfoBase, BrowserJsonValue, BrowserLaunchParams, BrowserProviderOperation, BrowserListResult, BrowserPairingInfo, BrowserReleaseFailure, BrowserReleaseResult, BrowserProviderDefinition, BrowserProviderIdentity, BrowserProviderInputSchema, BrowserProviderListResult, BrowserReference, BrowserDetails, BrowserSource, BrowserStatus, BrowserScreenshotKind, BrowserTransport, CaptureCheckpointParams, CaptureCheckpointResult, BrowserDevicePresetName, BrowserEmulationOptions, ExtensionBrowserAction, GetCookieParams, GetCookieResult, GetEventsParams, GetLogsParams, GetMocksParams, GetRequestsParams, ManagedBrowserInfo, PageClickParams, PageDragEndpoint, PageDragParams, PageDragPoint, PageActAction, PageDiagnosticsOptions, PageDiagnosticsSetting, PageEvalParams, PageFramesParams, PageHoverParams, PageInspectFilter, PageInspectParams, PageNavigateParams, PageObservationWaitOptions, PagePressParams, PageScreenshotParams, PageScrollParams, PageSnapshotParams, PageSnapshotQuery, PageTypeParams, PageUploadParams, PageWaitParams, RegularBrowserInfo, RequestDomainPermissionParams, RulesResult, RunActionName, RunActionsParams, SelectBrowserParams, SelectBrowserResult, SendRequestFile, SendRequestBinaryBody, SendRequestFormValue, SendMtopRequestParams, SendRequestParams, SetAppProfileParams, SetCookieParams, SetCookieResult, SetDeviceEmulationParams, SetMockParams, SetRuleParams, SetTimezoneParams, SetTimezoneResult, TabCloseParams, TabOpenParams, } from './generated/browser-action-protocol.js';
17
17
  import { type UnifiedInvokeOptions } from './unified.js';
18
- import type * as Protocol from './generated-browser-action-protocol.js';
18
+ import type * as Protocol from './generated/browser-action-protocol.js';
19
19
  export declare function tabCheckpoint(params: Protocol.CaptureCheckpointParams, options?: UnifiedInvokeOptions): Promise<Protocol.BrowserActionResponse<'tab_checkpoint'>>;
20
20
  /** Compatibility wrapper for tabCheckpoint. */
21
21
  export declare function captureCheckpoint(params: Protocol.CaptureCheckpointParams, options?: UnifiedInvokeOptions): Promise<Protocol.BrowserActionResponse<'tab_checkpoint'>>;
@@ -66,9 +66,9 @@ export declare function saveArtifact(artifact: Protocol.BrowserArtifact & {
66
66
  outputPath: string;
67
67
  bytes: number;
68
68
  }>;
69
- export { PluginStateClient } from './pluginState.js';
70
- export { PluginModelClient } from './pluginModels.js';
71
- export type * from './generated-plugin-state.js';
72
- export type * from './generated-plugin-models.js';
73
- export type * from './generated-plugin-recovery.js';
74
- export type * from './generated-plugin-diagnostics.js';
69
+ export { PluginStateClient } from './plugins/clients/pluginState.js';
70
+ export { PluginModelClient } from './plugins/clients/pluginModels.js';
71
+ export type * from './generated/plugin-state.js';
72
+ export type * from './generated/plugin-models.js';
73
+ export type * from './generated/plugin-recovery.js';
74
+ export type * from './generated/plugin-diagnostics.js';
package/dist/index.js CHANGED
@@ -1,15 +1,15 @@
1
- export { PluginHostConnection, } from './pluginHostConnection.js';
1
+ export { PluginHostConnection, } from './plugins/clients/pluginHostConnection.js';
2
2
  /**
3
3
  * @mearl/client — unified Mearl browser client
4
4
  *
5
5
  * Discovers browser targets on this machine and every configured cloud connector,
6
6
  * then routes actions using the global browser ids returned by browser_list.
7
7
  */
8
- export { PluginTaskClient, } from './pluginTasks.js';
9
- export { PluginPageClient } from './pluginPages.js';
10
- export { executeRegisteredPlugin, } from './plugin.js';
8
+ export { PluginTaskClient, } from './plugins/clients/pluginTasks.js';
9
+ export { PluginPageClient } from './plugins/clients/pluginPages.js';
10
+ export { executeRegisteredPlugin, } from './plugins/sdk/plugin.js';
11
11
  export { UnifiedClient, UnifiedClient as MearlClient, decodeBrowserTarget, invoke, invokePlugin, listCloudConnectors, } from './unified.js';
12
- export { APP_PROFILE_NAMES, BROWSER_DEVICE_PRESET_NAMES, BROWSER_ACTIONS, BROWSER_CAPABILITY_ACTIONS, BROWSER_COMMAND_ACTIONS, EXTENSION_BROWSER_ACTIONS, PAGE_ACT_ACTIONS, SEND_REQUEST_MAX_FILES, SEND_REQUEST_MAX_TOTAL_BASE64_FILE_BYTES, SEND_REQUEST_MAX_TOTAL_FILE_BYTES, isBrowserAction, isBrowserCapabilityAction, isBrowserCommandAction, isExtensionBrowserAction, } from './generated-browser-action-protocol.js';
12
+ export { APP_PROFILE_NAMES, BROWSER_DEVICE_PRESET_NAMES, BROWSER_ACTIONS, BROWSER_CAPABILITY_ACTIONS, BROWSER_COMMAND_ACTIONS, EXTENSION_BROWSER_ACTIONS, PAGE_ACT_ACTIONS, SEND_REQUEST_MAX_FILES, SEND_REQUEST_MAX_TOTAL_BASE64_FILE_BYTES, SEND_REQUEST_MAX_TOTAL_FILE_BYTES, isBrowserAction, isBrowserCapabilityAction, isBrowserCommandAction, isExtensionBrowserAction, } from './generated/browser-action-protocol.js';
13
13
  import { invoke } from './unified.js';
14
14
  export function tabCheckpoint(params, options) {
15
15
  return invoke('tab_checkpoint', params, options);
@@ -144,5 +144,5 @@ export async function saveArtifact(artifact, outputPath, options = {}) {
144
144
  const { exportArtifact } = await import('./artifacts.js');
145
145
  return exportArtifact({ invoke }, artifact, outputPath, options);
146
146
  }
147
- export { PluginStateClient } from './pluginState.js';
148
- export { PluginModelClient } from './pluginModels.js';
147
+ export { PluginStateClient } from './plugins/clients/pluginState.js';
148
+ export { PluginModelClient } from './plugins/clients/pluginModels.js';
@@ -1,3 +1,3 @@
1
- import { type PageEvalParams } from './generated-browser-action-protocol.js';
1
+ import { type PageEvalParams } from './generated/browser-action-protocol.js';
2
2
  /** Serialize page_eval arguments within transport limits while retaining the caller's execution world. */
3
3
  export declare function invokePageEvalWithArgs(invoke: (payload: Record<string, unknown>, transfer?: boolean) => Promise<any>, params: PageEvalParams): Promise<any>;
@@ -1,5 +1,5 @@
1
1
  import { randomUUID } from 'node:crypto';
2
- import { validatePageUserScriptParams, resolvePageEvalExpression, } from './generated-browser-action-protocol.js';
2
+ import { validatePageUserScriptParams, resolvePageEvalExpression, } from './generated/browser-action-protocol.js';
3
3
  const CHUNK_CHARACTERS = 48 * 1024;
4
4
  /** Serialize page_eval arguments within transport limits while retaining the caller's execution world. */
5
5
  export async function invokePageEvalWithArgs(invoke, params) {
@@ -1,4 +1,4 @@
1
- import { startPluginHostServer } from './pluginHostServer.js';
1
+ import { startPluginHostServer } from './plugins/runtime/pluginHostServer.js';
2
2
  try {
3
3
  const server = await startPluginHostServer();
4
4
  const close = () => {
@@ -1,9 +1,9 @@
1
- import { supervisePluginExecutor } from './pluginExecutorSupervisor.js';
1
+ import { supervisePluginExecutor } from './plugins/runtime/pluginExecutorSupervisor.js';
2
2
  if (process.argv[2] === '--command') {
3
3
  let command;
4
4
  // Register IPC before loading command code so startup messages retain their order.
5
5
  process.on('message', (message) => {
6
- void (command ??= import('./pluginCommandWorker.js'))
6
+ void (command ??= import('./plugins/runtime/pluginCommandWorker.js'))
7
7
  .then(worker => worker.handlePluginWorkerMessage(message))
8
8
  .catch(error => {
9
9
  process.stderr.write(String(error));
package/dist/plugin.d.ts CHANGED
@@ -1,118 +1 @@
1
- import type { PluginTaskRecoveryDeclaration, PluginTaskCheckpoint, PluginCheckpointMigrationInput } from './generated-plugin-recovery.js';
2
- import type { PluginStateDeclaration } from './generated-plugin-state.js';
3
- import type { PluginModelRequest, PluginModelResult } from './generated-plugin-models.js';
4
- import type { PluginPageRuntime } from './generated-plugin-pages.js';
5
- import type { AppProfileContribution } from './generated-app-profile-definition.js';
6
- export type { AppProfileContribution, AppProfileDefinition, } from './generated-app-profile-definition.js';
7
- export { invokePageEvalWithArgs } from './pageEvalArguments.js';
8
- import { type OfficialPluginInstaller } from './officialPluginInstaller.js';
9
- import { type PluginToolboxContribution, type PluginRegistration } from './pluginRegistry.js';
10
- import { type PluginCommandContext, type PluginInvocationIdentity, type PluginInvocationSource } from './pluginExecution.js';
11
- import type { UnifiedInvokeOptions } from './unified.js';
12
- export type { PluginCommandContext, PluginExecutionHost, PluginInvocationIdentity, PluginInvocationSource, } from './pluginExecution.js';
13
- export { executeRegisteredPlugin, type PluginExecutorOptions, type PluginExecutorDependencies, } from './pluginExecutor.js';
14
- export { PluginTaskClient } from './pluginTasks.js';
15
- export { cleanupPluginRuntime } from './pluginRuntimeCleanup.js';
16
- export { PluginPageClient } from './pluginPages.js';
17
- export { assertPluginName, findPluginDirectoryEntry, findPluginEntry, findPluginRegistration, listPluginNames, pluginDirectory, registerPlugin, resolvePluginEntry, unregisterPlugin, PluginError, readPluginPageBundleChunk, type PluginRegistration, type PluginRegistrationOptions, type PluginToolboxAgentConfig, type PluginPageBundleRegistration, type PluginToolboxContribution, type PluginToolboxLocale, type PluginToolboxSandboxPage, } from './pluginRegistry.js';
18
- export { findOfficialPlugin, listOfficialPluginNames, OFFICIAL_PLUGIN_MANAGER, OFFICIAL_PLUGINS, type OfficialPluginDefinition, type OfficialPluginName, } from './officialPluginCatalog.js';
19
- export type PluginOptions = UnifiedInvokeOptions;
20
- export interface StructuredPluginProgress {
21
- message: string;
22
- data?: Record<string, unknown>;
23
- }
24
- export type PluginProgress = string | StructuredPluginProgress;
25
- export interface PluginInvocation {
26
- command: string;
27
- input: Record<string, any>;
28
- }
29
- export interface PluginInvokeOptions extends UnifiedInvokeOptions {
30
- onProgress?: (progress: PluginProgress) => void;
31
- signal?: AbortSignal;
32
- /** Audit label supplied by the entry point, never an authorization decision. */
33
- source?: PluginInvocationSource;
34
- }
35
- export interface PluginExecutionContext {
36
- runModel?(plugin: string, request: PluginModelRequest, options: Pick<PluginInvokeOptions, 'signal' | 'onProgress'>): Promise<PluginModelResult>;
37
- ensurePlugin?: OfficialPluginInstaller;
38
- source?: PluginInvocationSource;
39
- parentInvocation?: PluginInvocationIdentity;
40
- invocation?: PluginInvocationIdentity;
41
- resolveRegistration?: (name: string) => PluginRegistration | undefined;
42
- invoke(action: string, payload?: Record<string, any>, options?: UnifiedInvokeOptions, onProgress?: PluginInvokeOptions['onProgress']): Promise<any>;
43
- }
44
- export interface PluginApp {
45
- readonly options: Readonly<PluginOptions>;
46
- /** Examples omit the `mearl <plugin>` prefix, which help adds when displayed. */
47
- command(signature: string, handler: PluginHandler, description?: string, examples?: string[]): void;
48
- /** Registers a page-only command, also declared in toolbox.page.commands. */
49
- state(collection: string, operation: string, input?: Record<string, unknown>): Promise<any>;
50
- model(request: PluginModelRequest, options?: Pick<PluginInvokeOptions, 'onProgress'>): Promise<PluginModelResult>;
51
- runtimeCommand(signature: string, handler: PluginHandler, description?: string, examples?: string[]): void;
52
- recoveryCommand(command: string, handler: PluginHandler): void;
53
- checkpointMigration(command: string, handler: (input: PluginCheckpointMigrationInput, context: PluginCommandContext) => unknown | Promise<unknown>): void;
54
- checkpoint(data: unknown, expectedSequence: number): Promise<PluginTaskCheckpoint>;
55
- page(operation: string, input?: Record<string, unknown>): Promise<any>;
56
- toolboxCommand(signature: string, handler: PluginHandler, description?: string, examples?: string[]): void;
57
- invoke(action: string, payload?: Record<string, any>, options?: UnifiedInvokeOptions): Promise<any>;
58
- progress(progress: PluginProgress): void;
59
- }
60
- export type PluginHandler = (input: Record<string, any>, context: PluginCommandContext) => unknown | Promise<unknown>;
61
- /** 工具列表仅检查入口;页面资源只在打开对应工具时检查。 */
62
- export declare function refreshRegisteredPlugin(name: string, includePage?: boolean): Promise<PluginRegistration | undefined>;
63
- /** 注册和执行复用同一宿主能力边界;仅 handler 执行期间开放浏览器调用。 */
64
- export declare function loadPlugin(entry: string, context: Pick<PluginApp, 'options' | 'progress'> & {
65
- invoke: PluginExecutionContext['invoke'];
66
- source?: PluginInvocationSource;
67
- parentInvocation?: PluginInvocationIdentity;
68
- invocation?: PluginInvocationIdentity;
69
- signal?: AbortSignal;
70
- runModel?: PluginExecutionContext['runModel'];
71
- onInvocation?: (identity: PluginInvocationIdentity | undefined) => void;
72
- }, pluginName?: string): Promise<{
73
- name: string | undefined;
74
- description: string | undefined;
75
- toolbox: PluginToolboxContribution | undefined;
76
- pageRuntime: PluginPageRuntime | undefined;
77
- stateStorage: PluginStateDeclaration | undefined;
78
- taskRecovery: PluginTaskRecoveryDeclaration | undefined;
79
- appProfiles: AppProfileContribution | undefined;
80
- profileSources: Record<string, string> | undefined;
81
- version: string | undefined;
82
- commandHelp(namespace: string): string;
83
- help(namespace: string, name?: string): string;
84
- run(positionals: string[], payload?: unknown, namedInput?: Record<string, unknown>): Promise<unknown>;
85
- runRuntime(invocation: PluginInvocation): Promise<unknown>;
86
- runRecovery(invocation: PluginInvocation): Promise<unknown>;
87
- runMigration(invocation: PluginInvocation): Promise<unknown>;
88
- runToolbox(invocation: PluginInvocation): Promise<unknown>;
89
- }>;
90
- export declare function loadRegisteredPlugin(name: string, context: PluginExecutionContext, options?: PluginInvokeOptions): Promise<{
91
- name: string | undefined;
92
- description: string | undefined;
93
- toolbox: PluginToolboxContribution | undefined;
94
- pageRuntime: PluginPageRuntime | undefined;
95
- stateStorage: PluginStateDeclaration | undefined;
96
- taskRecovery: PluginTaskRecoveryDeclaration | undefined;
97
- appProfiles: AppProfileContribution | undefined;
98
- profileSources: Record<string, string> | undefined;
99
- version: string | undefined;
100
- commandHelp(namespace: string): string;
101
- help(namespace: string, name?: string): string;
102
- run(positionals: string[], payload?: unknown, namedInput?: Record<string, unknown>): Promise<unknown>;
103
- runRuntime(invocation: PluginInvocation): Promise<unknown>;
104
- runRecovery(invocation: PluginInvocation): Promise<unknown>;
105
- runMigration(invocation: PluginInvocation): Promise<unknown>;
106
- runToolbox(invocation: PluginInvocation): Promise<unknown>;
107
- }>;
108
- export declare function invokeRegisteredPlugin(name: string, invocation: PluginInvocation, context: PluginExecutionContext, options?: PluginInvokeOptions): Promise<unknown>;
109
- /** Entry point for the native toolbox service; nested plugin calls retain public-command access. */
110
- export declare function invokeRegisteredToolboxPlugin(name: string, invocation: PluginInvocation, context: PluginExecutionContext, options?: PluginInvokeOptions): Promise<unknown>;
111
- export declare function invokeRegisteredRuntimePlugin(name: string, invocation: PluginInvocation, context: PluginExecutionContext, options?: PluginInvokeOptions): Promise<unknown>;
112
- export declare function invokeRegisteredRecoveryPlugin(name: string, invocation: PluginInvocation, context: PluginExecutionContext, options?: PluginInvokeOptions): Promise<unknown>;
113
- export { PluginStateClient } from './pluginState.js';
114
- export { PluginModelClient } from './pluginModels.js';
115
- export type * from './generated-plugin-state.js';
116
- export type * from './generated-plugin-models.js';
117
- export type * from './generated-plugin-recovery.js';
118
- export type * from './generated-plugin-diagnostics.js';
1
+ export * from './plugins/sdk/plugin.js';