From 34ce56b446b8737bf3e53fe8d299bf3f9edcaf98 Mon Sep 17 00:00:00 2001 From: Simon <10131203+gaomeng1900@users.noreply.github.com> Date: Wed, 21 Jan 2026 18:54:17 +0800 Subject: [PATCH 1/2] feat(PageController): make sure page is indexed before calling actions on elements --- .../page-controller/src/PageController.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/packages/page-controller/src/PageController.ts b/packages/page-controller/src/PageController.ts index 1e1f2d8..bbe0893 100644 --- a/packages/page-controller/src/PageController.ts +++ b/packages/page-controller/src/PageController.ts @@ -80,6 +80,9 @@ export class PageController extends EventTarget { /** last time the tree was updated */ private lastTimeUpdate = 0 + /** Whether the tree has been indexed at least once */ + private isIndexed = false + /** Visual mask overlay for blocking user interaction during automation */ private mask: InstanceType | null = null private maskReady: Promise | null = null @@ -196,6 +199,9 @@ export class PageController extends EventTarget { this.elementTextMap.clear() this.elementTextMap = dom.getElementTextMap(this.simplifiedHTML) + // Mark as indexed - now element actions are allowed + this.isIndexed = true + // Restore mask blocking if (this.mask) { this.mask.wrapper.style.pointerEvents = 'auto' @@ -215,11 +221,22 @@ export class PageController extends EventTarget { // ======= Element Actions ======= + /** + * Ensure the tree has been indexed before any index-based operation. + * Throws if updateTree() hasn't been called yet. + */ + private assertIndexed(): void { + if (!this.isIndexed) { + throw new Error('DOM tree not indexed. Can not perform actions on elements.') + } + } + /** * Click element by index */ async clickElement(index: number): Promise { try { + this.assertIndexed() const element = getElementByIndex(this.selectorMap, index) const elemText = this.elementTextMap.get(index) await clickElement(element) @@ -249,6 +266,7 @@ export class PageController extends EventTarget { */ async inputText(index: number, text: string): Promise { try { + this.assertIndexed() const element = getElementByIndex(this.selectorMap, index) const elemText = this.elementTextMap.get(index) await inputTextElement(element, text) @@ -270,6 +288,7 @@ export class PageController extends EventTarget { */ async selectOption(index: number, optionText: string): Promise { try { + this.assertIndexed() const element = getElementByIndex(this.selectorMap, index) const elemText = this.elementTextMap.get(index) await selectOptionElement(element as HTMLSelectElement, optionText) @@ -298,6 +317,8 @@ export class PageController extends EventTarget { try { const { down, numPages, pixels, index } = options + this.assertIndexed() + const scrollAmount = pixels ?? numPages * (down ? 1 : -1) * window.innerHeight const element = index !== undefined ? getElementByIndex(this.selectorMap, index) : null @@ -327,6 +348,8 @@ export class PageController extends EventTarget { try { const { right, pixels, index } = options + this.assertIndexed() + const scrollAmount = pixels * (right ? 1 : -1) const element = index !== undefined ? getElementByIndex(this.selectorMap, index) : null @@ -394,6 +417,7 @@ export class PageController extends EventTarget { this.selectorMap.clear() this.elementTextMap.clear() this.simplifiedHTML = '' + this.isIndexed = false this.mask?.dispose() this.mask = null } From 6cbb4e99c477e54a81eae29f6d70cb93d74ab706 Mon Sep 17 00:00:00 2001 From: Simon <10131203+gaomeng1900@users.noreply.github.com> Date: Wed, 21 Jan 2026 18:55:07 +0800 Subject: [PATCH 2/2] chore(version): bump version to 1.0.0-beta.4 --- README-zh.md | 6 +++--- README.md | 6 +++--- package-lock.json | 28 +++++++++++++-------------- package.json | 2 +- packages/core/package.json | 6 +++--- packages/llms/package.json | 2 +- packages/page-agent/package.json | 10 +++++----- packages/page-controller/package.json | 2 +- packages/ui/package.json | 2 +- packages/website/package.json | 2 +- packages/website/src/constants.ts | 4 ++-- 11 files changed, 35 insertions(+), 35 deletions(-) diff --git a/README-zh.md b/README-zh.md index 3b0de6f..87d8a53 100644 --- a/README-zh.md +++ b/README-zh.md @@ -37,7 +37,7 @@ ```html ``` @@ -46,8 +46,8 @@ | 镜像 | URL | | ------ | ----------------------------------------------------------------------------------------- | -| Global | https://cdn.jsdelivr.net/npm/page-agent@1.0.0-beta.3/dist/iife/page-agent.demo.js | -| China | https://registry.npmmirror.com/page-agent/1.0.0-beta.3/files/dist/iife/page-agent.demo.js | +| Global | https://cdn.jsdelivr.net/npm/page-agent@1.0.0-beta.4/dist/iife/page-agent.demo.js | +| China | https://registry.npmmirror.com/page-agent/1.0.0-beta.4/files/dist/iife/page-agent.demo.js | ### NPM 安装 diff --git a/README.md b/README.md index fbb1bdb..b8b8626 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Fastest way to try PageAgent: ```html ``` @@ -46,8 +46,8 @@ Fastest way to try PageAgent: | Mirrors | URL | | ------- | ----------------------------------------------------------------------------------------- | -| Global | https://cdn.jsdelivr.net/npm/page-agent@1.0.0-beta.3/dist/iife/page-agent.demo.js | -| China | https://registry.npmmirror.com/page-agent/1.0.0-beta.3/files/dist/iife/page-agent.demo.js | +| Global | https://cdn.jsdelivr.net/npm/page-agent@1.0.0-beta.4/dist/iife/page-agent.demo.js | +| China | https://registry.npmmirror.com/page-agent/1.0.0-beta.4/files/dist/iife/page-agent.demo.js | ### NPM Installation diff --git a/package-lock.json b/package-lock.json index 54a592e..9d5425f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "root", - "version": "1.0.0-beta.3", + "version": "1.0.0-beta.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "root", - "version": "1.0.0-beta.3", + "version": "1.0.0-beta.4", "license": "MIT", "workspaces": [ "packages/page-controller", @@ -8142,18 +8142,18 @@ }, "packages/core": { "name": "@page-agent/core", - "version": "1.0.0-beta.3", + "version": "1.0.0-beta.4", "license": "MIT", "dependencies": { - "@page-agent/llms": "1.0.0-beta.3", - "@page-agent/page-controller": "1.0.0-beta.3", + "@page-agent/llms": "1.0.0-beta.4", + "@page-agent/page-controller": "1.0.0-beta.4", "chalk": "^5.6.2", "zod": "^4.3.5" } }, "packages/llms": { "name": "@page-agent/llms", - "version": "1.0.0-beta.3", + "version": "1.0.0-beta.4", "license": "MIT", "dependencies": { "chalk": "^5.6.2", @@ -8161,20 +8161,20 @@ } }, "packages/page-agent": { - "version": "1.0.0-beta.3", + "version": "1.0.0-beta.4", "license": "MIT", "dependencies": { - "@page-agent/core": "1.0.0-beta.3", - "@page-agent/llms": "1.0.0-beta.3", - "@page-agent/page-controller": "1.0.0-beta.3", - "@page-agent/ui": "1.0.0-beta.3", + "@page-agent/core": "1.0.0-beta.4", + "@page-agent/llms": "1.0.0-beta.4", + "@page-agent/page-controller": "1.0.0-beta.4", + "@page-agent/ui": "1.0.0-beta.4", "chalk": "^5.6.2", "zod": "^4.3.5" } }, "packages/page-controller": { "name": "@page-agent/page-controller", - "version": "1.0.0-beta.3", + "version": "1.0.0-beta.4", "license": "MIT", "dependencies": { "ai-motion": "^0.4.8" @@ -8182,12 +8182,12 @@ }, "packages/ui": { "name": "@page-agent/ui", - "version": "1.0.0-beta.3", + "version": "1.0.0-beta.4", "license": "MIT" }, "packages/website": { "name": "@page-agent/website", - "version": "1.0.0-beta.3", + "version": "1.0.0-beta.4", "dependencies": { "@radix-ui/react-icons": "^1.3.2", "@radix-ui/react-separator": "^1.1.8", diff --git a/package.json b/package.json index 2c89712..c0eecda 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "root", "private": true, - "version": "1.0.0-beta.3", + "version": "1.0.0-beta.4", "type": "module", "workspaces": [ "packages/page-controller", diff --git a/packages/core/package.json b/packages/core/package.json index e9f33ea..381c16e 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,7 +1,7 @@ { "name": "@page-agent/core", "private": false, - "version": "1.0.0-beta.3", + "version": "1.0.0-beta.4", "type": "module", "main": "./dist/esm/page-agent-core.js", "module": "./dist/esm/page-agent-core.js", @@ -45,7 +45,7 @@ "dependencies": { "chalk": "^5.6.2", "zod": "^4.3.5", - "@page-agent/llms": "1.0.0-beta.3", - "@page-agent/page-controller": "1.0.0-beta.3" + "@page-agent/llms": "1.0.0-beta.4", + "@page-agent/page-controller": "1.0.0-beta.4" } } diff --git a/packages/llms/package.json b/packages/llms/package.json index 71caec1..d7534ac 100644 --- a/packages/llms/package.json +++ b/packages/llms/package.json @@ -1,6 +1,6 @@ { "name": "@page-agent/llms", - "version": "1.0.0-beta.3", + "version": "1.0.0-beta.4", "type": "module", "main": "./dist/lib/page-agent-llms.js", "module": "./dist/lib/page-agent-llms.js", diff --git a/packages/page-agent/package.json b/packages/page-agent/package.json index e30611a..4eb9e53 100644 --- a/packages/page-agent/package.json +++ b/packages/page-agent/package.json @@ -1,7 +1,7 @@ { "name": "page-agent", "private": false, - "version": "1.0.0-beta.3", + "version": "1.0.0-beta.4", "type": "module", "main": "./dist/esm/page-agent.js", "module": "./dist/esm/page-agent.js", @@ -46,9 +46,9 @@ "dependencies": { "chalk": "^5.6.2", "zod": "^4.3.5", - "@page-agent/llms": "1.0.0-beta.3", - "@page-agent/page-controller": "1.0.0-beta.3", - "@page-agent/core": "1.0.0-beta.3", - "@page-agent/ui": "1.0.0-beta.3" + "@page-agent/llms": "1.0.0-beta.4", + "@page-agent/page-controller": "1.0.0-beta.4", + "@page-agent/core": "1.0.0-beta.4", + "@page-agent/ui": "1.0.0-beta.4" } } diff --git a/packages/page-controller/package.json b/packages/page-controller/package.json index ae21da2..70d8a7c 100644 --- a/packages/page-controller/package.json +++ b/packages/page-controller/package.json @@ -1,6 +1,6 @@ { "name": "@page-agent/page-controller", - "version": "1.0.0-beta.3", + "version": "1.0.0-beta.4", "type": "module", "main": "./dist/lib/page-controller.js", "module": "./dist/lib/page-controller.js", diff --git a/packages/ui/package.json b/packages/ui/package.json index f5e838e..1328b71 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@page-agent/ui", - "version": "1.0.0-beta.3", + "version": "1.0.0-beta.4", "type": "module", "main": "./dist/lib/page-agent-ui.js", "module": "./dist/lib/page-agent-ui.js", diff --git a/packages/website/package.json b/packages/website/package.json index a718e7c..f7174a2 100644 --- a/packages/website/package.json +++ b/packages/website/package.json @@ -1,7 +1,7 @@ { "name": "@page-agent/website", "private": true, - "version": "1.0.0-beta.3", + "version": "1.0.0-beta.4", "type": "module", "scripts": { "dev": "vite --host 0.0.0.0", diff --git a/packages/website/src/constants.ts b/packages/website/src/constants.ts index 10bb371..f0a604b 100644 --- a/packages/website/src/constants.ts +++ b/packages/website/src/constants.ts @@ -1,8 +1,8 @@ // Demo build (auto-init with demo LLM, for quick testing) export const CDN_DEMO_URL = - 'https://cdn.jsdelivr.net/npm/page-agent@1.0.0-beta.3/dist/iife/page-agent.demo.js' + 'https://cdn.jsdelivr.net/npm/page-agent@1.0.0-beta.4/dist/iife/page-agent.demo.js' export const CDN_DEMO_CN_URL = - 'https://registry.npmmirror.com/page-agent/1.0.0-beta.3/files/dist/iife/page-agent.demo.js' + 'https://registry.npmmirror.com/page-agent/1.0.0-beta.4/files/dist/iife/page-agent.demo.js' // Demo LLM for website testing export const DEMO_MODEL = 'PAGE-AGENT-FREE-TESTING-RANDOM'