Compare commits

...

21 Commits

Author SHA1 Message Date
Simon ebc785d1fe chore(version): bump version to 1.8.2 2026-05-11 19:40:30 +08:00
Simon ba932283f2 Merge pull request #501 from alibaba/feat/iife-cdn-without-auto-init
feat: add autoInit switch for demo CDN script
2026-05-11 19:39:19 +08:00
Simon f05bf68f61 docs: ?autoInit=false docs 2026-05-11 19:28:49 +08:00
Simon 35ab12a20a feat: add autoInit switch for IIFE demo 2026-05-11 19:20:52 +08:00
Simon fd7c54a695 Merge pull request #500 from alibaba/fix/demo-showpanel-type
fix(page-agent): keep demo showPanel out of config type
2026-05-11 19:06:35 +08:00
Simon eafd834daf fix(page-agent): keep demo showPanel out of config type 2026-05-11 19:05:27 +08:00
Feffery f575ae0fa4 feat: add showPanel switch to IIFE demo 2026-05-11 19:01:00 +08:00
Simon 797c9f8575 Merge pull request #499 from alibaba/chore/upgrade-dependencies
chore: upgrade dependencies
2026-05-11 17:23:36 +08:00
Simon fb3ac4d454 chore: upgrade dependencies 2026-05-11 17:19:23 +08:00
Simon c629d706ec chore: remove vite-bundle-analyzer 2026-04-28 16:46:05 +08:00
Simon 7896786311 Merge pull request #491 from alibaba/feat/vite8
Upgrade vite 8
2026-04-28 16:29:42 +08:00
Simon 820a2654ff fix: set minimal npm version to avoid peer: true 2026-04-28 16:24:50 +08:00
Simon 8d45ab8436 chore(deps): update package-lock.json 2026-04-28 16:15:16 +08:00
Simon 855020636b Merge branch 'main' into feat/vite8 2026-04-28 16:03:01 +08:00
Simon ff82603839 Merge pull request #490 from alibaba/fix/ts-value-space
fix(ts): `InvokeErrorType` separate confusing value/type space
2026-04-28 16:02:35 +08:00
Simon 90270fb76c fix(ts): InvokeErrorType separate confusing value/type space 2026-04-28 15:57:51 +08:00
Simon c9edeaea44 refactor(setup): upgrade vite8 2026-04-28 15:33:11 +08:00
Simon 757fe07b4d Merge pull request #489 from alibaba/fix/website-manual-chunks
fix(website): make manualChunks work
2026-04-28 14:44:29 +08:00
Simon f04fa706f7 fix(website): make manualChunks work 2026-04-28 14:42:34 +08:00
Simon 9daf914a89 Merge pull request #486 from alibaba/dependabot/npm_and_yarn/development-dependencies-82874c61ad
chore(deps-dev): bump the development-dependencies group with 7 updates
2026-04-28 14:21:07 +08:00
dependabot[bot] c8e5ff3010 chore(deps-dev): bump the development-dependencies group with 7 updates
Bumps the development-dependencies group with 7 updates:

| Package | From | To |
| --- | --- | --- |
| [@commitlint/cli](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli) | `20.5.0` | `20.5.2` |
| [@microsoft/api-extractor](https://github.com/microsoft/rushstack/tree/HEAD/apps/api-extractor) | `7.58.6` | `7.58.7` |
| [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite) | `4.2.3` | `4.2.4` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.59.0` | `8.59.1` |
| [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `1.8.0` | `1.11.0` |
| [simple-icons](https://github.com/simple-icons/simple-icons) | `16.17.0` | `16.18.0` |
| [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) | `4.2.3` | `4.2.4` |


Updates `@commitlint/cli` from 20.5.0 to 20.5.2
- [Release notes](https://github.com/conventional-changelog/commitlint/releases)
- [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/cli/CHANGELOG.md)
- [Commits](https://github.com/conventional-changelog/commitlint/commits/v20.5.2/@commitlint/cli)

Updates `@microsoft/api-extractor` from 7.58.6 to 7.58.7
- [Changelog](https://github.com/microsoft/rushstack/blob/main/apps/api-extractor/CHANGELOG.md)
- [Commits](https://github.com/microsoft/rushstack/commits/@microsoft/api-extractor_v7.58.7/apps/api-extractor)

Updates `@tailwindcss/vite` from 4.2.3 to 4.2.4
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.2.4/packages/@tailwindcss-vite)

Updates `typescript-eslint` from 8.59.0 to 8.59.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.1/packages/typescript-eslint)

Updates `lucide-react` from 1.8.0 to 1.11.0
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.11.0/packages/lucide-react)

Updates `simple-icons` from 16.17.0 to 16.18.0
- [Release notes](https://github.com/simple-icons/simple-icons/releases)
- [Commits](https://github.com/simple-icons/simple-icons/compare/16.17.0...16.18.0)

Updates `tailwindcss` from 4.2.3 to 4.2.4
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.2.4/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: "@commitlint/cli"
  dependency-version: 20.5.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development-dependencies
- dependency-name: "@microsoft/api-extractor"
  dependency-version: 7.58.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development-dependencies
- dependency-name: "@tailwindcss/vite"
  dependency-version: 4.2.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development-dependencies
- dependency-name: typescript-eslint
  dependency-version: 8.59.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development-dependencies
- dependency-name: lucide-react
  dependency-version: 1.11.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: development-dependencies
- dependency-name: simple-icons
  dependency-version: 16.18.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: development-dependencies
- dependency-name: tailwindcss
  dependency-version: 4.2.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-27 22:52:43 +00:00
21 changed files with 790 additions and 2353 deletions
+4 -2
View File
@@ -50,8 +50,10 @@ Fastest way to try PageAgent with our free Demo LLM:
| Mirrors | URL | | Mirrors | URL |
| ------- | ---------------------------------------------------------------------------------- | | ------- | ---------------------------------------------------------------------------------- |
| Global | https://cdn.jsdelivr.net/npm/page-agent@1.8.1/dist/iife/page-agent.demo.js | | Global | https://cdn.jsdelivr.net/npm/page-agent@1.8.2/dist/iife/page-agent.demo.js |
| China | https://registry.npmmirror.com/page-agent/1.8.1/files/dist/iife/page-agent.demo.js | | China | https://registry.npmmirror.com/page-agent/1.8.2/files/dist/iife/page-agent.demo.js |
Add `?autoInit=false` to load the script without creating the demo agent automatically. You can then instantiate it with `new window.PageAgent(...)`.
### NPM Installation ### NPM Installation
+4 -2
View File
@@ -49,8 +49,10 @@
| Mirrors | URL | | Mirrors | URL |
| ------- | ---------------------------------------------------------------------------------- | | ------- | ---------------------------------------------------------------------------------- |
| Global | https://cdn.jsdelivr.net/npm/page-agent@1.8.1/dist/iife/page-agent.demo.js | | Global | https://cdn.jsdelivr.net/npm/page-agent@1.8.2/dist/iife/page-agent.demo.js |
| China | https://registry.npmmirror.com/page-agent/1.8.1/files/dist/iife/page-agent.demo.js | | China | https://registry.npmmirror.com/page-agent/1.8.2/files/dist/iife/page-agent.demo.js |
在 URL 后添加 `?autoInit=false` 可只加载脚本,不自动创建 Demo Agent;之后可通过 `new window.PageAgent(...)` 手动初始化。
### NPM 安装 ### NPM 安装
+658 -2237
View File
File diff suppressed because it is too large Load Diff
+13 -14
View File
@@ -1,7 +1,7 @@
{ {
"name": "root", "name": "root",
"private": true, "private": true,
"version": "1.8.1", "version": "1.8.2",
"type": "module", "type": "module",
"workspaces": [ "workspaces": [
"packages/page-controller", "packages/page-controller",
@@ -22,7 +22,8 @@
}, },
"homepage": "https://alibaba.github.io/page-agent/", "homepage": "https://alibaba.github.io/page-agent/",
"engines": { "engines": {
"node": "^22.13.0 || >=24" "node": "^22.13.0 || >=24",
"npm": "^11.6.3"
}, },
"scripts": { "scripts": {
"start": "npm run dev --workspace=@page-agent/website", "start": "npm run dev --workspace=@page-agent/website",
@@ -41,15 +42,15 @@
"prepare": "husky || true" "prepare": "husky || true"
}, },
"devDependencies": { "devDependencies": {
"@commitlint/cli": "^20.5.0", "@commitlint/cli": "^20.5.3",
"@commitlint/config-conventional": "^20.5.0", "@commitlint/config-conventional": "^20.5.3",
"@eslint-react/eslint-plugin": "^4.2.3", "@eslint-react/eslint-plugin": "^4.2.3",
"@eslint/js": "^10.0.1", "@eslint/js": "^10.0.1",
"@microsoft/api-extractor": "^7.58.6", "@microsoft/api-extractor": "^7.58.7",
"@tailwindcss/vite": "^4.2.3", "@tailwindcss/vite": "^4.3.0",
"@trivago/prettier-plugin-sort-imports": "^6.0.2", "@trivago/prettier-plugin-sort-imports": "^6.0.2",
"@types/node": "^25.6.0", "@types/node": "^25.6.0",
"@vitejs/plugin-react-swc": "^4.3.0", "@vitejs/plugin-react": "^6.0.1",
"chalk": "^5.6.2", "chalk": "^5.6.2",
"concurrently": "^9.2.1", "concurrently": "^9.2.1",
"dotenv": "^17.4.2", "dotenv": "^17.4.2",
@@ -59,15 +60,13 @@
"lint-staged": "^16.4.0", "lint-staged": "^16.4.0",
"prettier": "^3.8.2", "prettier": "^3.8.2",
"typescript": "^6.0.2", "typescript": "^6.0.2",
"typescript-eslint": "^8.59.0", "typescript-eslint": "^8.59.2",
"unplugin-dts": "^1.0.0-beta.6", "unplugin-dts": "^1.0.0",
"vite": "^7.3.2", "vite": "^8.0.12",
"vite-bundle-analyzer": "^1.3.7", "vite-plugin-css-injected-by-js": "^5.0.1"
"vite-plugin-css-injected-by-js": "^4.0.1"
}, },
"overrides": { "overrides": {
"typescript": "^6.0.2", "typescript": "^6.0.2"
"@vitejs/plugin-react": "^5.2.0"
}, },
"lint-staged": { "lint-staged": {
"*.{js,ts,cjs,cts,mjs,mts}": [ "*.{js,ts,cjs,cts,mjs,mts}": [
+4 -4
View File
@@ -1,7 +1,7 @@
{ {
"name": "@page-agent/core", "name": "@page-agent/core",
"private": false, "private": false,
"version": "1.8.1", "version": "1.8.2",
"type": "module", "type": "module",
"main": "./src/PageAgentCore.ts", "main": "./src/PageAgentCore.ts",
"types": "./src/PageAgentCore.ts", "types": "./src/PageAgentCore.ts",
@@ -54,13 +54,13 @@
}, },
"dependencies": { "dependencies": {
"chalk": "^5.6.2", "chalk": "^5.6.2",
"@page-agent/llms": "1.8.1", "@page-agent/llms": "1.8.2",
"@page-agent/page-controller": "1.8.1" "@page-agent/page-controller": "1.8.2"
}, },
"peerDependencies": { "peerDependencies": {
"zod": "^3.25.0 || ^4.0.0" "zod": "^3.25.0 || ^4.0.0"
}, },
"devDependencies": { "devDependencies": {
"zod": "^4.3.6" "zod": "^4.4.3"
} }
} }
+3 -3
View File
@@ -1,4 +1,4 @@
import { InvokeError, InvokeErrorType } from '@page-agent/llms' import { InvokeError, InvokeErrorTypes } from '@page-agent/llms'
import chalk from 'chalk' import chalk from 'chalk'
import * as z from 'zod/v4' import * as z from 'zod/v4'
@@ -137,7 +137,7 @@ function validateAction(action: any, tools: Map<string, PageAgentTool>): any {
if (!tool) { if (!tool) {
const available = Array.from(tools.keys()).join(', ') const available = Array.from(tools.keys()).join(', ')
throw new InvokeError( throw new InvokeError(
InvokeErrorType.INVALID_TOOL_ARGS, InvokeErrorTypes.INVALID_TOOL_ARGS,
`Unknown action "${toolName}". Available: ${available}` `Unknown action "${toolName}". Available: ${available}`
) )
} }
@@ -159,7 +159,7 @@ function validateAction(action: any, tools: Map<string, PageAgentTool>): any {
const result = schema.safeParse(value) const result = schema.safeParse(value)
if (!result.success) { if (!result.success) {
throw new InvokeError( throw new InvokeError(
InvokeErrorType.INVALID_TOOL_ARGS, InvokeErrorTypes.INVALID_TOOL_ARGS,
`Invalid input for action "${toolName}": ${z.prettifyError(result.error)}` `Invalid input for action "${toolName}": ${z.prettifyError(result.error)}`
) )
} }
+13 -13
View File
@@ -1,7 +1,7 @@
{ {
"name": "@page-agent/ext", "name": "@page-agent/ext",
"private": true, "private": true,
"version": "1.8.1", "version": "1.8.2",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "wxt", "dev": "wxt",
@@ -16,32 +16,32 @@
"@radix-ui/react-separator": "^1.1.8", "@radix-ui/react-separator": "^1.1.8",
"@radix-ui/react-slot": "^1.2.4", "@radix-ui/react-slot": "^1.2.4",
"@radix-ui/react-switch": "^1.2.6", "@radix-ui/react-switch": "^1.2.6",
"@tailwindcss/vite": "^4.2.3", "@tailwindcss/vite": "^4.3.0",
"@types/chrome": "^0.1.40", "@types/chrome": "^0.1.42",
"@types/react": "^19.2.14", "@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3", "@types/react-dom": "^19.2.3",
"@wxt-dev/module-react": "^1.2.2", "@wxt-dev/module-react": "^1.2.2",
"class-variance-authority": "^0.7.1", "class-variance-authority": "^0.7.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"idb": "^8.0.3", "idb": "^8.0.3",
"lucide-react": "^1.8.0", "lucide-react": "^1.14.0",
"motion": "^12.38.0", "motion": "^12.38.0",
"next-themes": "^0.4.6", "next-themes": "^0.4.6",
"react": "^19.2.5", "react": "^19.2.6",
"react-dom": "^19.2.5", "react-dom": "^19.2.6",
"rough-notation": "^0.5.1", "rough-notation": "^0.5.1",
"simple-icons": "^16.16.0", "simple-icons": "^16.19.0",
"sonner": "^2.0.7", "sonner": "^2.0.7",
"tailwind-merge": "^3.5.0", "tailwind-merge": "^3.6.0",
"tailwindcss": "^4.2.2", "tailwindcss": "^4.3.0",
"tw-animate-css": "^1.4.0", "tw-animate-css": "^1.4.0",
"wxt": "^0.20.25" "wxt": "^0.20.25"
}, },
"dependencies": { "dependencies": {
"@page-agent/core": "1.8.1", "@page-agent/core": "1.8.2",
"@page-agent/llms": "1.8.1", "@page-agent/llms": "1.8.2",
"@page-agent/page-controller": "1.8.1", "@page-agent/page-controller": "1.8.2",
"@page-agent/ui": "1.8.1", "@page-agent/ui": "1.8.2",
"ai-motion": "^0.4.8", "ai-motion": "^0.4.8",
"chalk": "^5.6.2" "chalk": "^5.6.2"
}, },
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "@page-agent/llms", "name": "@page-agent/llms",
"version": "1.8.1", "version": "1.8.2",
"type": "module", "type": "module",
"main": "./src/index.ts", "main": "./src/index.ts",
"types": "./src/index.ts", "types": "./src/index.ts",
@@ -53,6 +53,6 @@
"zod": "^3.25.0 || ^4.0.0" "zod": "^3.25.0 || ^4.0.0"
}, },
"devDependencies": { "devDependencies": {
"zod": "^4.3.6" "zod": "^4.4.3"
} }
} }
+17 -17
View File
@@ -3,7 +3,7 @@
*/ */
import * as z from 'zod/v4' import * as z from 'zod/v4'
import { InvokeError, InvokeErrorType } from './errors' import { InvokeError, InvokeErrorTypes } from './errors'
import type { InvokeOptions, InvokeResult, LLMClient, LLMConfig, Message, Tool } from './types' import type { InvokeOptions, InvokeResult, LLMClient, LLMConfig, Message, Tool } from './types'
import { modelPatch, zodToOpenAITool } from './utils' import { modelPatch, zodToOpenAITool } from './utils'
@@ -50,7 +50,7 @@ export class OpenAIClient implements LLMClient {
transformedBody = this.config.transformRequestBody(requestBody) transformedBody = this.config.transformRequestBody(requestBody)
} catch (error) { } catch (error) {
throw new InvokeError( throw new InvokeError(
InvokeErrorType.CONFIG_ERROR, InvokeErrorTypes.CONFIG_ERROR,
`transformRequestBody failed: ${(error as Error).message}`, `transformRequestBody failed: ${(error as Error).message}`,
error error
) )
@@ -73,7 +73,7 @@ export class OpenAIClient implements LLMClient {
const isAbortError = (error as any)?.name === 'AbortError' const isAbortError = (error as any)?.name === 'AbortError'
const errorMessage = isAbortError ? 'Network request aborted' : 'Network request failed' const errorMessage = isAbortError ? 'Network request aborted' : 'Network request failed'
if (!isAbortError) console.error(error) if (!isAbortError) console.error(error)
throw new InvokeError(InvokeErrorType.NETWORK_ERROR, errorMessage, error) throw new InvokeError(InvokeErrorTypes.NETWORK_ERROR, errorMessage, error)
} }
// 3. Handle HTTP errors // 3. Handle HTTP errors
@@ -84,27 +84,27 @@ export class OpenAIClient implements LLMClient {
if (response.status === 401 || response.status === 403) { if (response.status === 401 || response.status === 403) {
throw new InvokeError( throw new InvokeError(
InvokeErrorType.AUTH_ERROR, InvokeErrorTypes.AUTH_ERROR,
`Authentication failed: ${errorMessage}`, `Authentication failed: ${errorMessage}`,
errorData errorData
) )
} }
if (response.status === 429) { if (response.status === 429) {
throw new InvokeError( throw new InvokeError(
InvokeErrorType.RATE_LIMIT, InvokeErrorTypes.RATE_LIMIT,
`Rate limit exceeded: ${errorMessage}`, `Rate limit exceeded: ${errorMessage}`,
errorData errorData
) )
} }
if (response.status >= 500) { if (response.status >= 500) {
throw new InvokeError( throw new InvokeError(
InvokeErrorType.SERVER_ERROR, InvokeErrorTypes.SERVER_ERROR,
`Server error: ${errorMessage}`, `Server error: ${errorMessage}`,
errorData errorData
) )
} }
throw new InvokeError( throw new InvokeError(
InvokeErrorType.UNKNOWN, InvokeErrorTypes.UNKNOWN,
`HTTP ${response.status}: ${errorMessage}`, `HTTP ${response.status}: ${errorMessage}`,
errorData errorData
) )
@@ -115,7 +115,7 @@ export class OpenAIClient implements LLMClient {
const choice = data.choices?.[0] const choice = data.choices?.[0]
if (!choice) { if (!choice) {
throw new InvokeError(InvokeErrorType.UNKNOWN, 'No choices in response', data) throw new InvokeError(InvokeErrorTypes.UNKNOWN, 'No choices in response', data)
} }
// Check finish_reason // Check finish_reason
@@ -126,21 +126,21 @@ export class OpenAIClient implements LLMClient {
break break
case 'length': case 'length':
throw new InvokeError( throw new InvokeError(
InvokeErrorType.CONTEXT_LENGTH, InvokeErrorTypes.CONTEXT_LENGTH,
'Response truncated: max tokens reached', 'Response truncated: max tokens reached',
undefined, undefined,
data data
) )
case 'content_filter': case 'content_filter':
throw new InvokeError( throw new InvokeError(
InvokeErrorType.CONTENT_FILTER, InvokeErrorTypes.CONTENT_FILTER,
'Content filtered by safety system', 'Content filtered by safety system',
undefined, undefined,
data data
) )
default: default:
throw new InvokeError( throw new InvokeError(
InvokeErrorType.UNKNOWN, InvokeErrorTypes.UNKNOWN,
`Unexpected finish_reason: ${choice.finish_reason}`, `Unexpected finish_reason: ${choice.finish_reason}`,
undefined, undefined,
data data
@@ -155,7 +155,7 @@ export class OpenAIClient implements LLMClient {
const toolCallName = normalizedChoice?.message?.tool_calls?.[0]?.function?.name const toolCallName = normalizedChoice?.message?.tool_calls?.[0]?.function?.name
if (!toolCallName) { if (!toolCallName) {
throw new InvokeError( throw new InvokeError(
InvokeErrorType.NO_TOOL_CALL, InvokeErrorTypes.NO_TOOL_CALL,
'No tool call found in response', 'No tool call found in response',
undefined, undefined,
data data
@@ -165,7 +165,7 @@ export class OpenAIClient implements LLMClient {
const tool = tools[toolCallName] const tool = tools[toolCallName]
if (!tool) { if (!tool) {
throw new InvokeError( throw new InvokeError(
InvokeErrorType.UNKNOWN, InvokeErrorTypes.UNKNOWN,
`Tool "${toolCallName}" not found in tools`, `Tool "${toolCallName}" not found in tools`,
undefined, undefined,
data data
@@ -176,7 +176,7 @@ export class OpenAIClient implements LLMClient {
const argString = normalizedChoice.message?.tool_calls?.[0]?.function?.arguments const argString = normalizedChoice.message?.tool_calls?.[0]?.function?.arguments
if (!argString) { if (!argString) {
throw new InvokeError( throw new InvokeError(
InvokeErrorType.INVALID_TOOL_ARGS, InvokeErrorTypes.INVALID_TOOL_ARGS,
'No tool call arguments found', 'No tool call arguments found',
undefined, undefined,
data data
@@ -188,7 +188,7 @@ export class OpenAIClient implements LLMClient {
parsedArgs = JSON.parse(argString) parsedArgs = JSON.parse(argString)
} catch (error) { } catch (error) {
throw new InvokeError( throw new InvokeError(
InvokeErrorType.INVALID_TOOL_ARGS, InvokeErrorTypes.INVALID_TOOL_ARGS,
'Failed to parse tool arguments as JSON', 'Failed to parse tool arguments as JSON',
error, error,
data data
@@ -200,7 +200,7 @@ export class OpenAIClient implements LLMClient {
if (!validation.success) { if (!validation.success) {
console.error(z.prettifyError(validation.error)) console.error(z.prettifyError(validation.error))
throw new InvokeError( throw new InvokeError(
InvokeErrorType.INVALID_TOOL_ARGS, InvokeErrorTypes.INVALID_TOOL_ARGS,
'Tool arguments validation failed', 'Tool arguments validation failed',
validation.error, validation.error,
data data
@@ -214,7 +214,7 @@ export class OpenAIClient implements LLMClient {
toolResult = await tool.execute(toolInput) toolResult = await tool.execute(toolInput)
} catch (e) { } catch (e) {
throw new InvokeError( throw new InvokeError(
InvokeErrorType.TOOL_EXECUTION_ERROR, InvokeErrorTypes.TOOL_EXECUTION_ERROR,
`Tool execution failed: ${(e as Error).message}`, `Tool execution failed: ${(e as Error).message}`,
e, e,
data data
+9 -9
View File
@@ -2,7 +2,7 @@
* Error types and error handling for LLM invocations * Error types and error handling for LLM invocations
*/ */
export const InvokeErrorType = { export const InvokeErrorTypes = {
// Retryable // Retryable
NETWORK_ERROR: 'network_error', // Network error, retry NETWORK_ERROR: 'network_error', // Network error, retry
RATE_LIMIT: 'rate_limit', // Rate limit, retry RATE_LIMIT: 'rate_limit', // Rate limit, retry
@@ -20,7 +20,7 @@ export const InvokeErrorType = {
CONTENT_FILTER: 'content_filter', // Content filtered CONTENT_FILTER: 'content_filter', // Content filtered
} as const } as const
export type InvokeErrorType = (typeof InvokeErrorType)[keyof typeof InvokeErrorType] type InvokeErrorType = (typeof InvokeErrorTypes)[keyof typeof InvokeErrorTypes]
export class InvokeError extends Error { export class InvokeError extends Error {
type: InvokeErrorType type: InvokeErrorType
@@ -45,13 +45,13 @@ export class InvokeError extends Error {
if (isAbortError) return false if (isAbortError) return false
const retryableTypes: InvokeErrorType[] = [ const retryableTypes: InvokeErrorType[] = [
InvokeErrorType.NETWORK_ERROR, InvokeErrorTypes.NETWORK_ERROR,
InvokeErrorType.RATE_LIMIT, InvokeErrorTypes.RATE_LIMIT,
InvokeErrorType.SERVER_ERROR, InvokeErrorTypes.SERVER_ERROR,
InvokeErrorType.NO_TOOL_CALL, InvokeErrorTypes.NO_TOOL_CALL,
InvokeErrorType.INVALID_TOOL_ARGS, InvokeErrorTypes.INVALID_TOOL_ARGS,
InvokeErrorType.TOOL_EXECUTION_ERROR, InvokeErrorTypes.TOOL_EXECUTION_ERROR,
InvokeErrorType.UNKNOWN, InvokeErrorTypes.UNKNOWN,
] ]
return retryableTypes.includes(type) return retryableTypes.includes(type)
} }
+2 -2
View File
@@ -1,9 +1,9 @@
import { OpenAIClient } from './OpenAIClient' import { OpenAIClient } from './OpenAIClient'
import { DEFAULT_TEMPERATURE, LLM_MAX_RETRIES } from './constants' import { DEFAULT_TEMPERATURE, LLM_MAX_RETRIES } from './constants'
import { InvokeError, InvokeErrorType } from './errors' import { InvokeError, InvokeErrorTypes } from './errors'
import type { InvokeOptions, InvokeResult, LLMClient, LLMConfig, Message, Tool } from './types' import type { InvokeOptions, InvokeResult, LLMClient, LLMConfig, Message, Tool } from './types'
export { InvokeError, InvokeErrorType } export { InvokeError, InvokeErrorTypes }
export type { InvokeOptions, InvokeResult, LLMClient, LLMConfig, Message, Tool } export type { InvokeOptions, InvokeResult, LLMClient, LLMConfig, Message, Tool }
export function parseLLMConfig(config: LLMConfig): Required<LLMConfig> { export function parseLLMConfig(config: LLMConfig): Required<LLMConfig> {
+2 -2
View File
@@ -1,7 +1,7 @@
{ {
"name": "@page-agent/mcp", "name": "@page-agent/mcp",
"private": false, "private": false,
"version": "1.8.1", "version": "1.8.2",
"type": "module", "type": "module",
"bin": { "bin": {
"page-agent-mcp": "src/index.js" "page-agent-mcp": "src/index.js"
@@ -30,6 +30,6 @@
"dependencies": { "dependencies": {
"@modelcontextprotocol/sdk": "^1.29.0", "@modelcontextprotocol/sdk": "^1.29.0",
"ws": "^8.20.0", "ws": "^8.20.0",
"zod": "^4.3.6" "zod": "^4.4.3"
} }
} }
+6 -6
View File
@@ -1,7 +1,7 @@
{ {
"name": "page-agent", "name": "page-agent",
"private": false, "private": false,
"version": "1.8.1", "version": "1.8.2",
"type": "module", "type": "module",
"main": "./src/PageAgent.ts", "main": "./src/PageAgent.ts",
"types": "./src/PageAgent.ts", "types": "./src/PageAgent.ts",
@@ -54,16 +54,16 @@
"postpublish": "node ../../scripts/post-publish.js" "postpublish": "node ../../scripts/post-publish.js"
}, },
"dependencies": { "dependencies": {
"@page-agent/core": "1.8.1", "@page-agent/core": "1.8.2",
"@page-agent/llms": "1.8.1", "@page-agent/llms": "1.8.2",
"@page-agent/page-controller": "1.8.1", "@page-agent/page-controller": "1.8.2",
"@page-agent/ui": "1.8.1", "@page-agent/ui": "1.8.2",
"chalk": "^5.6.2" "chalk": "^5.6.2"
}, },
"peerDependencies": { "peerDependencies": {
"zod": "^3.25.0 || ^4.0.0" "zod": "^3.25.0 || ^4.0.0"
}, },
"devDependencies": { "devDependencies": {
"zod": "^4.3.6" "zod": "^4.4.3"
} }
} }
+32 -25
View File
@@ -3,8 +3,12 @@
*/ */
import { PageAgent, type PageAgentConfig } from './PageAgent' import { PageAgent, type PageAgentConfig } from './PageAgent'
const currentScript = document.currentScript as HTMLScriptElement | null
const currentScriptURL = currentScript?.src ? new URL(currentScript.src) : null
const autoInit = currentScriptURL?.searchParams.get('autoInit') !== 'false'
// Clean up existing instances to prevent multiple injections from bookmarklet // Clean up existing instances to prevent multiple injections from bookmarklet
if (window.pageAgent) { if (autoInit && window.pageAgent) {
window.pageAgent.dispose() window.pageAgent.dispose()
} }
@@ -17,32 +21,35 @@ const DEMO_MODEL = 'qwen3.5-plus'
const DEMO_BASE_URL = 'https://page-ag-testing-ohftxirgbn.cn-shanghai.fcapp.run' const DEMO_BASE_URL = 'https://page-ag-testing-ohftxirgbn.cn-shanghai.fcapp.run'
const DEMO_API_KEY = 'NA' const DEMO_API_KEY = 'NA'
const currentScript = document.currentScript as HTMLScriptElement | null
// in case document.x is not ready yet // in case document.x is not ready yet
setTimeout(() => { if (autoInit) {
let config: PageAgentConfig setTimeout(() => {
let config: PageAgentConfig
let showPanel = true
if (currentScript) { if (currentScriptURL) {
console.log('🚀 page-agent.js detected current script:', currentScript.src) const url = currentScriptURL
const url = new URL(currentScript.src) const model = url.searchParams.get('model') || DEMO_MODEL
const model = url.searchParams.get('model') || DEMO_MODEL const baseURL = url.searchParams.get('baseURL') || DEMO_BASE_URL
const baseURL = url.searchParams.get('baseURL') || DEMO_BASE_URL const apiKey = url.searchParams.get('apiKey') || DEMO_API_KEY
const apiKey = url.searchParams.get('apiKey') || DEMO_API_KEY const language = (url.searchParams.get('lang') as 'zh-CN' | 'en-US') || 'zh-CN'
const language = (url.searchParams.get('lang') as 'zh-CN' | 'en-US') || 'zh-CN' showPanel = ((url.searchParams.get('showPanel') as 'true' | 'false') || 'true') === 'true'
config = { model, baseURL, apiKey, language } config = { model, baseURL, apiKey, language }
} else { } else {
console.log('🚀 page-agent.js no current script detected, using default demo config') console.log('🚀 page-agent.js no current script detected, using default demo config')
config = { config = {
model: import.meta.env.LLM_MODEL_NAME ? import.meta.env.LLM_MODEL_NAME : DEMO_MODEL, model: import.meta.env.LLM_MODEL_NAME ? import.meta.env.LLM_MODEL_NAME : DEMO_MODEL,
baseURL: import.meta.env.LLM_BASE_URL ? import.meta.env.LLM_BASE_URL : DEMO_BASE_URL, baseURL: import.meta.env.LLM_BASE_URL ? import.meta.env.LLM_BASE_URL : DEMO_BASE_URL,
apiKey: import.meta.env.LLM_API_KEY ? import.meta.env.LLM_API_KEY : DEMO_API_KEY, apiKey: import.meta.env.LLM_API_KEY ? import.meta.env.LLM_API_KEY : DEMO_API_KEY,
}
} }
}
// Create agent // Create agent
window.pageAgent = new PageAgent(config) window.pageAgent = new PageAgent(config)
window.pageAgent.panel.show() if (showPanel) {
window.pageAgent.panel.show()
}
console.log('🚀 page-agent.js initialized with config:', window.pageAgent.config) console.log('🚀 page-agent.js initialized with config:', window.pageAgent.config)
}) })
}
-1
View File
@@ -3,7 +3,6 @@ import { config as dotenvConfig } from 'dotenv'
import { dirname, resolve } from 'path' import { dirname, resolve } from 'path'
import { fileURLToPath } from 'url' import { fileURLToPath } from 'url'
import { defineConfig } from 'vite' import { defineConfig } from 'vite'
// import { analyzer } from 'vite-bundle-analyzer'
import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js' import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js'
const __dirname = dirname(fileURLToPath(import.meta.url)) const __dirname = dirname(fileURLToPath(import.meta.url))
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@page-agent/page-controller", "name": "@page-agent/page-controller",
"version": "1.8.1", "version": "1.8.2",
"type": "module", "type": "module",
"main": "./src/PageController.ts", "main": "./src/PageController.ts",
"types": "./src/PageController.ts", "types": "./src/PageController.ts",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@page-agent/ui", "name": "@page-agent/ui",
"version": "1.8.1", "version": "1.8.2",
"type": "module", "type": "module",
"main": "./src/index.ts", "main": "./src/index.ts",
"types": "./src/index.ts", "types": "./src/index.ts",
+7 -7
View File
@@ -1,7 +1,7 @@
{ {
"name": "@page-agent/website", "name": "@page-agent/website",
"private": true, "private": true,
"version": "1.8.1", "version": "1.8.2",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite --host 0.0.0.0", "dev": "vite --host 0.0.0.0",
@@ -18,16 +18,16 @@
"@types/react-dom": "^19.2.3", "@types/react-dom": "^19.2.3",
"class-variance-authority": "^0.7.1", "class-variance-authority": "^0.7.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"lucide-react": "^1.8.0", "lucide-react": "^1.14.0",
"motion": "^12.38.0", "motion": "^12.38.0",
"next-themes": "^0.4.6", "next-themes": "^0.4.6",
"react": "^19.2.5", "react": "^19.2.6",
"react-dom": "^19.2.5", "react-dom": "^19.2.6",
"rough-notation": "^0.5.1", "rough-notation": "^0.5.1",
"simple-icons": "^16.16.0", "simple-icons": "^16.19.0",
"sonner": "^2.0.7", "sonner": "^2.0.7",
"tailwind-merge": "^3.5.0", "tailwind-merge": "^3.6.0",
"tailwindcss": "^4.2.2", "tailwindcss": "^4.3.0",
"tw-animate-css": "^1.4.0", "tw-animate-css": "^1.4.0",
"wouter": "^3.9.0" "wouter": "^3.9.0"
} }
+2 -2
View File
@@ -1,8 +1,8 @@
// Demo build (auto-init with demo LLM, for quick testing) // Demo build (auto-init with demo LLM, for quick testing)
export const CDN_DEMO_URL = export const CDN_DEMO_URL =
'https://cdn.jsdelivr.net/npm/page-agent@1.8.1/dist/iife/page-agent.demo.js' 'https://cdn.jsdelivr.net/npm/page-agent@1.8.2/dist/iife/page-agent.demo.js'
export const CDN_DEMO_CN_URL = export const CDN_DEMO_CN_URL =
'https://registry.npmmirror.com/page-agent/1.8.1/files/dist/iife/page-agent.demo.js' 'https://registry.npmmirror.com/page-agent/1.8.2/files/dist/iife/page-agent.demo.js'
// Demo LLM for website testing (homepage quick trial uses flash) // Demo LLM for website testing (homepage quick trial uses flash)
export const DEMO_MODEL = 'qwen3.5-flash' export const DEMO_MODEL = 'qwen3.5-flash'
@@ -58,6 +58,11 @@ export default function QuickStart() {
code={`<script src="DEMO_CDN_URL" crossorigin="true"></script>`} code={`<script src="DEMO_CDN_URL" crossorigin="true"></script>`}
language="html" language="html"
/> />
<p className="text-sm text-gray-600 dark:text-gray-300 mb-3">
{isZh
? '在 URL 后添加 ?autoInit=false 可只加载脚本,不自动创建 Demo Agent;之后可通过 new window.PageAgent(...) 手动初始化。'
: 'Add ?autoInit=false to load the script without creating the demo agent automatically. You can then instantiate it with new window.PageAgent(...).'}
</p>
<table className="w-full border-collapse text-sm"> <table className="w-full border-collapse text-sm">
<thead> <thead>
<tr className="border-b border-gray-200 dark:border-gray-700"> <tr className="border-b border-gray-200 dark:border-gray-700">
+5 -3
View File
@@ -1,5 +1,5 @@
import tailwindcss from '@tailwindcss/vite' import tailwindcss from '@tailwindcss/vite'
import react from '@vitejs/plugin-react-swc' import react from '@vitejs/plugin-react'
import { config as dotenvConfig } from 'dotenv' import { config as dotenvConfig } from 'dotenv'
import { copyFileSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs' import { copyFileSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'
import process from 'node:process' import process from 'node:process'
@@ -82,8 +82,10 @@ export default defineConfig(({ mode }) => ({
handler(message) handler(message)
}, },
output: { output: {
manualChunks: { manualChunks(id) {
vendor: ['react', 'react-dom', 'wouter'], if (/[\\/]node_modules[\\/](react|react-dom|wouter)([\\/]|$)/.test(id)) {
return 'vendor'
}
}, },
}, },
}, },