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 073f600..045e9f6 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",
@@ -11628,11 +11628,11 @@
},
"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"
}
@@ -11684,7 +11684,7 @@
},
"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",
@@ -11692,20 +11692,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"
@@ -11713,12 +11713,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 559985a..3688d47 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/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
}
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'