Compare commits
73 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3d014f15e7 | |||
| ce8f0fdbd8 | |||
| 48fede38fd | |||
| f303ed5fc5 | |||
| 6dbc33efd9 | |||
| 53628532df | |||
| 2aae34d74a | |||
| e27d1fb57f | |||
| 0fa7dc0531 | |||
| 89546887bd | |||
| b0bcba2922 | |||
| 618ae8bf14 | |||
| 5ed5d574fd | |||
| bde9d9023a | |||
| c8a8858d24 | |||
| 6491118cde | |||
| b4acd02007 | |||
| 5695b3d6aa | |||
| 0a160697d1 | |||
| 11d3ca3d6e | |||
| ee88b23891 | |||
| ca68be7a56 | |||
| 4ad2abe997 | |||
| 8f08322721 | |||
| fb043e5a81 | |||
| 1628d48c97 | |||
| 025cb3391e | |||
| 4aab7f991f | |||
| 67846db28f | |||
| cac55fa2bf | |||
| a74b7542ba | |||
| a9f462ed37 | |||
| c33b3d8278 | |||
| de3a6e4660 | |||
| e2c00b1bfc | |||
| 692ac4acca | |||
| c4bdd8fc4b | |||
| aa88221845 | |||
| b425e48afe | |||
| ff54b363aa | |||
| 4d931b4430 | |||
| 6054ca1217 | |||
| 7f9f0d1589 | |||
| ddcfa5b499 | |||
| 441b41c713 | |||
| ed71dd08b9 | |||
| 1c354ab5d3 | |||
| 151760713a | |||
| 4450d6302b | |||
| 2d055d3909 | |||
| 16da7d936d | |||
| efe08f445f | |||
| 4e7f755ae9 | |||
| 28bb2204e7 | |||
| 0c3b4592b2 | |||
| 222bbef670 | |||
| fa8ab451eb | |||
| b4ebb2b98f | |||
| c757270101 | |||
| 5873e68d63 | |||
| 0c124c3b44 | |||
| d46a57f8ef | |||
| 153fa23a71 | |||
| 5852054e3a | |||
| 5988d4ba24 | |||
| 0b6a698f6b | |||
| 01db520881 | |||
| 30b9956c4f | |||
| 4b37a3e538 | |||
| 928d8d2fb3 | |||
| 8ece20f54b | |||
| 26b4afca6a | |||
| 5f43b76b57 |
@@ -23,3 +23,4 @@ Closes #(issue)
|
|||||||
## Requirements / 要求
|
## Requirements / 要求
|
||||||
|
|
||||||
- [ ] I have read and follow the [Code of Conduct](../docs/CODE_OF_CONDUCT.md) and [Contributing Guide](../CONTRIBUTING.md) . / 我已阅读并遵守行为准则。
|
- [ ] I have read and follow the [Code of Conduct](../docs/CODE_OF_CONDUCT.md) and [Contributing Guide](../CONTRIBUTING.md) . / 我已阅读并遵守行为准则。
|
||||||
|
- [ ] This PR is NOT generated by a bot or AI agent acting autonomously. I have authored or meaningfully reviewed every change. / 此 PR 不是由 bot 或 AI 自主生成的,我已亲自编写或充分审查了每一处变更。
|
||||||
|
|||||||
Vendored
+1
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"cSpell.words": [
|
"cSpell.words": [
|
||||||
|
"contenteditable",
|
||||||
"deepseek",
|
"deepseek",
|
||||||
"historychange",
|
"historychange",
|
||||||
"HITL",
|
"HITL",
|
||||||
|
|||||||
+11
-24
@@ -1,21 +1,23 @@
|
|||||||
# Contributing to PageAgent
|
# Contributing to PageAgent
|
||||||
|
|
||||||
Thank you for your interest in contributing to PageAgent! We welcome contributions from everyone.
|
♥️ We welcome contributions from everyone.
|
||||||
|
|
||||||
## 🚀 Quick Start
|
## 🚀 Quick Start
|
||||||
|
|
||||||
### Development Setup
|
### Development Setup
|
||||||
|
|
||||||
1. **Prerequisites**
|
1. **Prerequisites**
|
||||||
|
- `macOS` / `Linux` / `WSL`
|
||||||
- `node.js >= 20` with `npm >= 10`
|
- `node.js >= 20` with `npm >= 10`
|
||||||
- An editor that supports `ts/eslint/prettier`
|
- An editor that supports `ts/eslint/prettier`
|
||||||
- Make sure `eslint`, `prettier` and `commitlint` work well
|
- Make sure `eslint`, `prettier` and `commitlint` work well. Un-linted code won't pass the CI.
|
||||||
|
|
||||||
2. **Setup**
|
2. **Setup**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm ci
|
npm i
|
||||||
npm start # Start demo and documentation site
|
npm start # Start demo and documentation site
|
||||||
|
npm run build # Build libs and website
|
||||||
```
|
```
|
||||||
|
|
||||||
### Project Structure
|
### Project Structure
|
||||||
@@ -30,8 +32,8 @@ This is a **monorepo** with npm workspaces containing **4 main packages**:
|
|||||||
> We use a simplified monorepo solution with `native npm-workspace + ts reference + vite alias`. No fancy tooling. Hoisting is required.
|
> We use a simplified monorepo solution with `native npm-workspace + ts reference + vite alias`. No fancy tooling. Hoisting is required.
|
||||||
>
|
>
|
||||||
> - When developing. Use alias so that we don't have to pre-build.
|
> - When developing. Use alias so that we don't have to pre-build.
|
||||||
> - When bundling. Use external and disable ts `paths` alias to leave deps out.
|
> - When bundling. Use external and disable ts `paths` alias.
|
||||||
> - When bundling `IIFE` and `Website`. Bundle everything including local packages.
|
> - When bundling `IIFE` and `Website`. Bundle everything together.
|
||||||
|
|
||||||
## 🤝 How to Contribute
|
## 🤝 How to Contribute
|
||||||
|
|
||||||
@@ -63,6 +65,7 @@ This is a **monorepo** with npm workspaces containing **4 main packages**:
|
|||||||
- Update documentation as needed
|
- Update documentation as needed
|
||||||
|
|
||||||
4. **Test Your Changes**
|
4. **Test Your Changes**
|
||||||
|
- Build and lint everything.
|
||||||
- Test in our demo website
|
- Test in our demo website
|
||||||
- Test it on other websites if applicable
|
- Test it on other websites if applicable
|
||||||
- `@TODO: test suite`
|
- `@TODO: test suite`
|
||||||
@@ -92,7 +95,7 @@ This is a **monorepo** with npm workspaces containing **4 main packages**:
|
|||||||
|
|
||||||
### Vibe Coding with AI
|
### Vibe Coding with AI
|
||||||
|
|
||||||
> [Vibe coding](https://en.wikipedia.org/wiki/Vibe_coding) = describe what you want in natural language, let AI write the code, and you review the result.
|
> [Vibe coding](https://en.wikipedia.org/wiki/Vibe_coding)
|
||||||
|
|
||||||
- Vibe coding is **RECOMMENDED** when maintaining **the demo, the website, the UI and tests**.
|
- Vibe coding is **RECOMMENDED** when maintaining **the demo, the website, the UI and tests**.
|
||||||
- We have a [website/AGENTS.md](packages/website/AGENTS.md) for that.
|
- We have a [website/AGENTS.md](packages/website/AGENTS.md) for that.
|
||||||
@@ -143,12 +146,6 @@ If your AI assistant does not support [AGENTS.md](https://agents.md/). Add an al
|
|||||||
- **Restart the dev server** to load new env vars
|
- **Restart the dev server** to load new env vars
|
||||||
- If not provided, the demo will use the free testing proxy by default. By using it, you agree to its [terms](https://github.com/alibaba/page-agent/blob/main/docs/terms-and-privacy.md).
|
- If not provided, the demo will use the free testing proxy by default. By using it, you agree to its [terms](https://github.com/alibaba/page-agent/blob/main/docs/terms-and-privacy.md).
|
||||||
|
|
||||||
### Website Development
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm start
|
|
||||||
```
|
|
||||||
|
|
||||||
### Extension Development
|
### Extension Development
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -184,17 +181,6 @@ Ask an AI to help you add documentation to the `website/` package. Follow the ex
|
|||||||
|
|
||||||
> Our AGENTS.md file and guardrails are designed for this purpose. But please be careful and review anything AI generated.
|
> Our AGENTS.md file and guardrails are designed for this purpose. But please be careful and review anything AI generated.
|
||||||
|
|
||||||
## 🎯 Contribution Areas
|
|
||||||
|
|
||||||
We especially welcome contributions in:
|
|
||||||
|
|
||||||
- **Browser compatibility** improvements
|
|
||||||
- **Performance optimizations** for DOM processing
|
|
||||||
- **Documentation** and examples
|
|
||||||
- **Testing** and quality assurance
|
|
||||||
- **Accessibility** features
|
|
||||||
- **Internationalization** support
|
|
||||||
|
|
||||||
## 🚫 What We Don't Accept
|
## 🚫 What We Don't Accept
|
||||||
|
|
||||||
- Breaking changes and large PRs without prior discussion
|
- Breaking changes and large PRs without prior discussion
|
||||||
@@ -202,12 +188,13 @@ We especially welcome contributions in:
|
|||||||
- Contributions without proper testing
|
- Contributions without proper testing
|
||||||
- Code that doesn't follow project conventions
|
- Code that doesn't follow project conventions
|
||||||
- Dependencies or code with licenses incompatible with MIT
|
- Dependencies or code with licenses incompatible with MIT
|
||||||
|
- Bot or AI-generated pull requests without meaningful human involvement
|
||||||
|
|
||||||
## 📄 Legal
|
## 📄 Legal
|
||||||
|
|
||||||
By contributing to this project, you agree that your contributions will be licensed under the MIT License.
|
By contributing to this project, you agree that your contributions will be licensed under the MIT License.
|
||||||
|
|
||||||
> You need to sign a github CLA when you create a PR.
|
> CLA is optional.
|
||||||
|
|
||||||
## 💬 Questions?
|
## 💬 Questions?
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2026 Alibaba
|
Copyright (c) 2026 SimonLuvRamen
|
||||||
Copyright (c) 2026 Simon
|
Copyright (c) 2026 Alibaba Group Holding Limited
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -5,13 +5,13 @@
|
|||||||
<img alt="Page Agent Banner" src="https://img.alicdn.com/imgextra/i1/O1CN01NCMKXj1Gn4tkFTsxf_!!6000000000666-2-tps-1280-256.png">
|
<img alt="Page Agent Banner" src="https://img.alicdn.com/imgextra/i1/O1CN01NCMKXj1Gn4tkFTsxf_!!6000000000666-2-tps-1280-256.png">
|
||||||
</picture>
|
</picture>
|
||||||
|
|
||||||
[](https://opensource.org/licenses/MIT) [](http://www.typescriptlang.org/) [](https://www.npmjs.com/package/page-agent) [](https://bundlephobia.com/package/page-agent) [](https://github.com/alibaba/page-agent)
|
[](https://opensource.org/licenses/MIT) [](http://www.typescriptlang.org/) [](https://bundlephobia.com/package/page-agent) [](https://www.npmjs.com/package/page-agent) [](https://github.com/alibaba/page-agent)
|
||||||
|
|
||||||
The GUI Agent Living in Your Webpage. Control web interfaces with natural language.
|
The GUI Agent Living in Your Webpage. Control web interfaces with natural language.
|
||||||
|
|
||||||
🌐 **English** | [中文](./docs/README-zh.md)
|
🌐 **English** | [中文](./docs/README-zh.md)
|
||||||
|
|
||||||
👉 <a href="https://alibaba.github.io/page-agent/" target="_blank"><b>🚀 Demo</b></a> | <a href="https://alibaba.github.io/page-agent/docs/introduction/overview" target="_blank"><b>📖 Documentation</b></a> | <a href="https://news.ycombinator.com/item?id=47264138" target="_blank">📢 Join HN Discussion</a>
|
<a href="https://alibaba.github.io/page-agent/" target="_blank"><b>🚀 Demo</b></a> | <a href="https://alibaba.github.io/page-agent/docs/introduction/overview" target="_blank"><b>📖 Docs</b></a> | <a href="https://news.ycombinator.com/item?id=47264138" target="_blank"><b>📢 HN Discussion</b></a> | <a href="https://x.com/simonluvramen" target="_blank"><b>𝕏 Follow on X</b></a>
|
||||||
|
|
||||||
<video id="demo-video" src="https://github.com/user-attachments/assets/a1f2eae2-13fb-4aae-98cf-a3fc1620a6c2" controls crossorigin muted></video>
|
<video id="demo-video" src="https://github.com/user-attachments/assets/a1f2eae2-13fb-4aae-98cf-a3fc1620a6c2" controls crossorigin muted></video>
|
||||||
|
|
||||||
@@ -22,20 +22,18 @@ The GUI Agent Living in Your Webpage. Control web interfaces with natural langua
|
|||||||
- **🎯 Easy integration**
|
- **🎯 Easy integration**
|
||||||
- No need for `browser extension` / `python` / `headless browser`.
|
- No need for `browser extension` / `python` / `headless browser`.
|
||||||
- Just in-page javascript. Everything happens in your web page.
|
- Just in-page javascript. Everything happens in your web page.
|
||||||
- The best tool for your agent to control web pages.
|
|
||||||
- **📖 Text-based DOM manipulation**
|
- **📖 Text-based DOM manipulation**
|
||||||
- No screenshots. No OCR or multi-modal LLMs needed.
|
- No screenshots. No multi-modal LLMs or special permissions needed.
|
||||||
- No special permissions required.
|
|
||||||
- **🧠 Bring your own LLMs**
|
- **🧠 Bring your own LLMs**
|
||||||
- **🎨 Pretty UI with human-in-the-loop**
|
- **🎨 Pretty UI with human-in-the-loop**
|
||||||
- **🐙 Optional [chrome extension](https://alibaba.github.io/page-agent/docs/features/chrome-extension) for multi-page tasks.**
|
- **🐙 Optional [chrome extension](https://alibaba.github.io/page-agent/docs/features/chrome-extension) for multi-page tasks.**
|
||||||
|
|
||||||
## 💡 Use Cases
|
## 💡 Use Cases
|
||||||
|
|
||||||
- **SaaS AI Copilot** — Ship an AI copilot in your product in lines of code. No backend rewrite needed.
|
- **SaaS AI Copilot** — Ship an AI copilot in your product in lines of code. No backend rewrite.
|
||||||
- **Smart Form Filling** — Turn 20-click workflows into one sentence. Perfect for ERP, CRM, and admin systems.
|
- **Smart Form Filling** — Turn 20-click workflows into one sentence. Perfect for ERP, CRM, and admin systems.
|
||||||
- **Accessibility** — Make any web app accessible through natural language. Voice commands, screen readers, zero barrier.
|
- **Accessibility** — Make any web app accessible through natural language. Voice commands, screen readers, zero barrier.
|
||||||
- **Multi-page Agent** — Extend your agent's reach across browser tabs with the optional [chrome extension](https://alibaba.github.io/page-agent/docs/features/chrome-extension).
|
- **Multi-page Agent** — Extend your own agent's reach across browser tabs with the optional [chrome extension](https://alibaba.github.io/page-agent/docs/features/chrome-extension).
|
||||||
|
|
||||||
## 🚀 Quick Start
|
## 🚀 Quick Start
|
||||||
|
|
||||||
@@ -47,12 +45,12 @@ Fastest way to try PageAgent with our free Demo LLM:
|
|||||||
<script src="{URL}" crossorigin="true"></script>
|
<script src="{URL}" crossorigin="true"></script>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> **⚠️ For technical evaluation only.** This demo CDN uses our free [testing LLM API](https://alibaba.github.io/page-agent/docs/features/models#free-testing-api). By using it, you agree to its [terms](https://github.com/alibaba/page-agent/blob/main/docs/terms-and-privacy.md).
|
||||||
|
|
||||||
| Mirrors | URL |
|
| Mirrors | URL |
|
||||||
| ------- | ---------------------------------------------------------------------------------- |
|
| ------- | ---------------------------------------------------------------------------------- |
|
||||||
| Global | https://cdn.jsdelivr.net/npm/page-agent@1.5.3/dist/iife/page-agent.demo.js |
|
| Global | https://cdn.jsdelivr.net/npm/page-agent@1.5.8/dist/iife/page-agent.demo.js |
|
||||||
| China | https://registry.npmmirror.com/page-agent/1.5.3/files/dist/iife/page-agent.demo.js |
|
| China | https://registry.npmmirror.com/page-agent/1.5.8/files/dist/iife/page-agent.demo.js |
|
||||||
|
|
||||||
> **⚠️ For technical evaluation only.** This demo CDN uses our free [testing LLM API](https://alibaba.github.io/page-agent/docs/features/models#free-testing-api). By using it, you agree to its [terms](https://github.com/alibaba/page-agent/blob/main/docs/terms-and-privacy.md).
|
|
||||||
|
|
||||||
### NPM Installation
|
### NPM Installation
|
||||||
|
|
||||||
@@ -77,10 +75,12 @@ For more programmatic usage, see [📖 Documentations](https://alibaba.github.io
|
|||||||
|
|
||||||
## 🤝 Contributing
|
## 🤝 Contributing
|
||||||
|
|
||||||
We welcome contributions from the community! Follow our instructions in [CONTRIBUTING.md](CONTRIBUTING.md) for environment setup and local development.
|
We welcome contributions from the community! Follow our instructions in [CONTRIBUTING.md](CONTRIBUTING.md) for setup and guidelines.
|
||||||
|
|
||||||
Please read [Code of Conduct](docs/CODE_OF_CONDUCT.md) before contributing.
|
Please read [Code of Conduct](docs/CODE_OF_CONDUCT.md) before contributing.
|
||||||
|
|
||||||
|
Contributions generated entirely by bots or agents without substantial human involvement will not be accepted, and bot accounts may be blocked.
|
||||||
|
|
||||||
## 👏 Acknowledgments
|
## 👏 Acknowledgments
|
||||||
|
|
||||||
This project builds upon the excellent work of **[`browser-use`](https://github.com/browser-use/browser-use)**.
|
This project builds upon the excellent work of **[`browser-use`](https://github.com/browser-use/browser-use)**.
|
||||||
@@ -90,12 +90,10 @@ This project builds upon the excellent work of **[`browser-use`](https://github.
|
|||||||
```
|
```
|
||||||
DOM processing components and prompt are derived from browser-use:
|
DOM processing components and prompt are derived from browser-use:
|
||||||
|
|
||||||
Browser Use
|
Browser Use <https://github.com/browser-use/browser-use>
|
||||||
Copyright (c) 2024 Gregor Zunic
|
Copyright (c) 2024 Gregor Zunic
|
||||||
Licensed under the MIT License
|
Licensed under the MIT License
|
||||||
|
|
||||||
Original browser-use project: <https://github.com/browser-use/browser-use>
|
|
||||||
|
|
||||||
We gratefully acknowledge the browser-use project and its contributors for their
|
We gratefully acknowledge the browser-use project and its contributors for their
|
||||||
excellent work on web automation and DOM interaction patterns that helped make
|
excellent work on web automation and DOM interaction patterns that helped make
|
||||||
this project possible.
|
this project possible.
|
||||||
@@ -114,8 +112,8 @@ file and in the node_modules directory after installation.
|
|||||||
|
|
||||||
<a href="https://www.star-history.com/?repos=alibaba%2Fpage-agent&type=date">
|
<a href="https://www.star-history.com/?repos=alibaba%2Fpage-agent&type=date">
|
||||||
<picture>
|
<picture>
|
||||||
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/image?repos=alibaba/page-agent&type=date&theme=dark" />
|
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/image?repos=alibaba/page-agent&type=date&theme=dark&legend=top-left&v=7" />
|
||||||
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/image?repos=alibaba/page-agent&type=date" />
|
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/image?repos=alibaba/page-agent&type=date&legend=top-left&v=7" />
|
||||||
<img alt="Star History Chart" src="https://api.star-history.com/image?repos=alibaba/page-agent&type=date" />
|
<img alt="Star History Chart" src="https://api.star-history.com/image?repos=alibaba/page-agent&type=date&legend=top-left&v=7" />
|
||||||
</picture>
|
</picture>
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Supported Versions
|
||||||
|
|
||||||
|
We provide security fixes on a best-effort basis for:
|
||||||
|
|
||||||
|
| Version | Supported |
|
||||||
|
| --------------------------------------------------------- | --------- |
|
||||||
|
| `main` | Yes |
|
||||||
|
| Latest npm release of `page-agent` and workspace packages | Yes |
|
||||||
|
| Older releases | No |
|
||||||
|
|
||||||
|
Please upgrade to the latest release before reporting an issue against an older build.
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.
|
||||||
|
|
||||||
|
Use GitHub's private vulnerability reporting flow:
|
||||||
|
|
||||||
|
- Open https://github.com/alibaba/page-agent/security/policy
|
||||||
|
- Click `Report a vulnerability`
|
||||||
|
|
||||||
|
If private reporting is unavailable, open a minimal public issue only to request a private contact channel. Do not include exploit details.
|
||||||
|
|
||||||
|
## What to Include
|
||||||
|
|
||||||
|
- Affected package or feature
|
||||||
|
- Exact version, commit, or build
|
||||||
|
- Browser, OS, and runtime environment
|
||||||
|
- Reproduction steps or a proof of concept
|
||||||
|
- Expected impact
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
We prioritize reports that show a real security boundary failure, such as:
|
||||||
|
|
||||||
|
- Unauthorized access to data, tokens, or extension capabilities
|
||||||
|
- Bypassing explicit safety constraints
|
||||||
|
- Sensitive data exposure caused by default behavior
|
||||||
|
|
||||||
|
The following usually do not qualify by themselves:
|
||||||
|
|
||||||
|
- Unsafe custom integrations that ignore documented safeguards
|
||||||
|
- Intentionally embedding secrets into client-side builds
|
||||||
|
- Reports against unsupported older versions
|
||||||
|
|
||||||
|
## Disclosure
|
||||||
|
|
||||||
|
Please avoid public disclosure until maintainers have had a reasonable chance to investigate and ship a fix.
|
||||||
+20
-16
@@ -5,13 +5,13 @@
|
|||||||
<img alt="Page Agent Banner" src="https://img.alicdn.com/imgextra/i1/O1CN01NCMKXj1Gn4tkFTsxf_!!6000000000666-2-tps-1280-256.png">
|
<img alt="Page Agent Banner" src="https://img.alicdn.com/imgextra/i1/O1CN01NCMKXj1Gn4tkFTsxf_!!6000000000666-2-tps-1280-256.png">
|
||||||
</picture>
|
</picture>
|
||||||
|
|
||||||
[](https://opensource.org/licenses/MIT) [](http://www.typescriptlang.org/) [](https://www.npmjs.com/package/page-agent) [](https://bundlephobia.com/package/page-agent) [](https://github.com/alibaba/page-agent)
|
[](https://opensource.org/licenses/MIT) [](http://www.typescriptlang.org/) [](https://bundlephobia.com/package/page-agent) [](https://www.npmjs.com/package/page-agent) [](https://github.com/alibaba/page-agent)
|
||||||
|
|
||||||
纯 JS 实现的 GUI agent。使用自然语言操作你的 Web 应用。无须后端、客户端、浏览器插件。
|
纯 JS 实现的 GUI agent。使用自然语言操作你的 Web 应用。无须后端、客户端、浏览器插件。
|
||||||
|
|
||||||
🌐 [English](../README.md) | **中文**
|
🌐 [English](../README.md) | **中文**
|
||||||
|
|
||||||
👉 <a href="https://alibaba.github.io/page-agent/" target="_blank"><b>🚀 Demo</b></a> | <a href="https://alibaba.github.io/page-agent/docs/introduction/overview" target="_blank"><b>📖 Documentation</b></a>
|
<a href="https://alibaba.github.io/page-agent/" target="_blank"><b>🚀 Demo</b></a> | <a href="https://alibaba.github.io/page-agent/docs/introduction/overview" target="_blank"><b>📖 Docs</b></a> | <a href="https://news.ycombinator.com/item?id=47264138" target="_blank"><b>📢 HN Discussion</b></a> | <a href="https://x.com/simonluvramen" target="_blank"><b>𝕏 Follow on X</b></a>
|
||||||
|
|
||||||
<video id="demo-video" src="https://github.com/user-attachments/assets/a1f2eae2-13fb-4aae-98cf-a3fc1620a6c2" controls crossorigin muted></video>
|
<video id="demo-video" src="https://github.com/user-attachments/assets/a1f2eae2-13fb-4aae-98cf-a3fc1620a6c2" controls crossorigin muted></video>
|
||||||
|
|
||||||
@@ -22,20 +22,18 @@
|
|||||||
- **🎯 轻松集成**
|
- **🎯 轻松集成**
|
||||||
- 无需 `浏览器插件` / `Python` / `无头浏览器`。
|
- 无需 `浏览器插件` / `Python` / `无头浏览器`。
|
||||||
- 纯页面内 JavaScript,一切都在你的网页中完成。
|
- 纯页面内 JavaScript,一切都在你的网页中完成。
|
||||||
- The best tool for your agent to control web pages.
|
|
||||||
- **📖 基于文本的 DOM 操作**
|
- **📖 基于文本的 DOM 操作**
|
||||||
- 无需截图,无需 OCR 或多模态模型。
|
- 无需截图,无需多模态模型或特殊权限。
|
||||||
- 无需特殊权限。
|
|
||||||
- **🧠 用你自己的 LLM**
|
- **🧠 用你自己的 LLM**
|
||||||
- **🎨 精美 UI,支持人机协同**
|
- **🎨 精美 UI,支持人机协同**
|
||||||
- **🐙 可选的 [Chrome 扩展](https://alibaba.github.io/page-agent/docs/features/chrome-extension),支持跨页面任务。**
|
- **🐙 可选的 [Chrome 扩展](https://alibaba.github.io/page-agent/docs/features/chrome-extension),支持跨页面任务。**
|
||||||
|
|
||||||
## 💡 应用场景
|
## 💡 应用场景
|
||||||
|
|
||||||
- **SaaS AI 副驾驶** — 几行代码为你的产品加上 AI 副驾驶,不需要重写后端。
|
- **SaaS AI 副驾驶** — 几行代码为你的产品加上 AI 副驾驶,无需重写后端。
|
||||||
- **智能表单填写** — 把 20 次点击变成一句话。ERP、CRM、管理后台的最佳拍档。
|
- **智能表单填写** — 把 20 次点击变成一句话。ERP、CRM、管理后台的最佳拍档。
|
||||||
- **无障碍增强** — 用自然语言让任何网页无障碍。语音指令、屏幕阅读器,零门槛。
|
- **无障碍增强** — 用自然语言让任何网页无障碍。语音指令、屏幕阅读器,零门槛。
|
||||||
- **跨页面 Agent** — 通过可选的 [Chrome 扩展](https://alibaba.github.io/page-agent/docs/features/chrome-extension),让你的 Agent 跨标签页工作。
|
- **跨页面 Agent** — 通过可选的 [Chrome 扩展](https://alibaba.github.io/page-agent/docs/features/chrome-extension),让你自己的 Agent 跨标签页工作。
|
||||||
|
|
||||||
## 🚀 快速开始
|
## 🚀 快速开始
|
||||||
|
|
||||||
@@ -47,12 +45,12 @@
|
|||||||
<script src="{URL}" crossorigin="true"></script>
|
<script src="{URL}" crossorigin="true"></script>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> **⚠️ 仅用于技术评估。** 该 Demo CDN 使用了免费的[测试 LLM API](https://alibaba.github.io/page-agent/docs/features/models#free-testing-api),使用即表示您同意其[条款](https://github.com/alibaba/page-agent/blob/main/docs/terms-and-privacy.md)。
|
||||||
|
|
||||||
| Mirrors | URL |
|
| Mirrors | URL |
|
||||||
| ------- | ---------------------------------------------------------------------------------- |
|
| ------- | ---------------------------------------------------------------------------------- |
|
||||||
| Global | https://cdn.jsdelivr.net/npm/page-agent@1.5.3/dist/iife/page-agent.demo.js |
|
| Global | https://cdn.jsdelivr.net/npm/page-agent@1.5.8/dist/iife/page-agent.demo.js |
|
||||||
| China | https://registry.npmmirror.com/page-agent/1.5.3/files/dist/iife/page-agent.demo.js |
|
| China | https://registry.npmmirror.com/page-agent/1.5.8/files/dist/iife/page-agent.demo.js |
|
||||||
|
|
||||||
> **⚠️ 仅用于技术评估。** 该 Demo CDN 使用了免费的[测试 LLM API](https://alibaba.github.io/page-agent/docs/features/models#free-testing-api),使用即表示您同意其[条款](https://github.com/alibaba/page-agent/blob/main/docs/terms-and-privacy.md)。
|
|
||||||
|
|
||||||
### NPM 安装
|
### NPM 安装
|
||||||
|
|
||||||
@@ -77,9 +75,9 @@ await agent.execute('点击登录按钮')
|
|||||||
|
|
||||||
## 🤝 贡献
|
## 🤝 贡献
|
||||||
|
|
||||||
欢迎社区贡献!请参阅 [CONTRIBUTING.md](../CONTRIBUTING.md) 了解环境配置和本地开发说明。
|
欢迎社区贡献!请参阅 [CONTRIBUTING.md](../CONTRIBUTING.md) 了解安装与贡献指南。请在贡献前阅读[行为准则](CODE_OF_CONDUCT.md)。
|
||||||
|
|
||||||
请在贡献前阅读[行为准则](CODE_OF_CONDUCT.md)。
|
我们不接受未经实质性人类参与、完全由 Bot 或 Agent 自动生成的代码,机器人账号可能被禁止参与互动。
|
||||||
|
|
||||||
## 👏 致谢
|
## 👏 致谢
|
||||||
|
|
||||||
@@ -90,12 +88,10 @@ await agent.execute('点击登录按钮')
|
|||||||
```
|
```
|
||||||
DOM processing components and prompt are derived from browser-use:
|
DOM processing components and prompt are derived from browser-use:
|
||||||
|
|
||||||
Browser Use
|
Browser Use <https://github.com/browser-use/browser-use>
|
||||||
Copyright (c) 2024 Gregor Zunic
|
Copyright (c) 2024 Gregor Zunic
|
||||||
Licensed under the MIT License
|
Licensed under the MIT License
|
||||||
|
|
||||||
Original browser-use project: <https://github.com/browser-use/browser-use>
|
|
||||||
|
|
||||||
We gratefully acknowledge the browser-use project and its contributors for their
|
We gratefully acknowledge the browser-use project and its contributors for their
|
||||||
excellent work on web automation and DOM interaction patterns that helped make
|
excellent work on web automation and DOM interaction patterns that helped make
|
||||||
this project possible.
|
this project possible.
|
||||||
@@ -111,3 +107,11 @@ file and in the node_modules directory after installation.
|
|||||||
---
|
---
|
||||||
|
|
||||||
**⭐ 如果觉得 PageAgent 有用或有趣,请给项目点个星!**
|
**⭐ 如果觉得 PageAgent 有用或有趣,请给项目点个星!**
|
||||||
|
|
||||||
|
<a href="https://www.star-history.com/?repos=alibaba%2Fpage-agent&type=date">
|
||||||
|
<picture>
|
||||||
|
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/image?repos=alibaba/page-agent&type=date&theme=dark&legend=top-left&v=7" />
|
||||||
|
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/image?repos=alibaba/page-agent&type=date&legend=top-left&v=7" />
|
||||||
|
<img alt="Star History Chart" src="https://api.star-history.com/image?repos=alibaba/page-agent&type=date&legend=top-left&v=7" />
|
||||||
|
</picture>
|
||||||
|
</a>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
**Last updated:** March 2026
|
**Last updated:** March 2026
|
||||||
|
|
||||||
"We" in this document refers to the maintainers of the open-source Page Agent project (https://github.com/alibaba/page-agent). "The software" refers to PageAgent.js (the JavaScript library) and Page Agent Ext (the browser extension). This document covers the software itself and the testing API we provide — **not** any third-party product or service built with it.
|
"We" in this document refers to the maintainers of the open-source Page Agent project (https://github.com/alibaba/page-agent). "The software" refers to Page Agent (the JavaScript library) and Page Agent Ext (the browser extension). This document covers the software itself and the testing API we provide — **not** any third-party product or service built with it.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -12,18 +12,18 @@ The software is a **client-side only** tool with a "Bring Your Own Key" (BYOK) a
|
|||||||
|
|
||||||
All data transmission occurs **only** between your browser and the LLM provider you configure. You are in full control of which provider receives your data.
|
All data transmission occurs **only** between your browser and the LLM provider you configure. You are in full control of which provider receives your data.
|
||||||
|
|
||||||
- You choose which LLM provider to use
|
The project is open source under the [MIT License](https://github.com/alibaba/page-agent/blob/main/LICENSE) and can be audited at: https://github.com/alibaba/page-agent
|
||||||
- You may configure your own API endpoint at any time
|
|
||||||
- The project is open source under the [MIT License](https://github.com/alibaba/page-agent/blob/main/LICENSE) and can be audited at: https://github.com/alibaba/page-agent
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 2. Testing API and Demo Disclaimer & Terms of Use
|
## 2. Testing API and Demo Disclaimer & Terms of Use
|
||||||
|
|
||||||
To facilitate easy testing and technical evaluation, we provide a free testing LLM API. This API is used in the project homepage's live demo, the pre-built demo CDN bundles, and the browser extension's default configuration. Users may also use it independently for their own technical evaluation of page-agent.
|
To facilitate easy testing and technical evaluation, we provide a free testing LLM API. This API is used in the project homepage's live demo, the pre-built demo CDN bundles, and the browser extension's default configuration. Users may also use it independently for their own technical evaluation of the software.
|
||||||
|
|
||||||
This free testing API is provided **strictly for technical evaluation and R&D purposes only**. It must not be used in any production environment. By using this API, you agree to the following terms:
|
This free testing API is provided **strictly for technical evaluation and R&D purposes only**. It must not be used in any production environment. By using this API, you agree to the following terms:
|
||||||
|
|
||||||
|
- **Permitted Use Only**: This API must be used solely for technical evaluation of the software. Any other use — including integration into other products or services, unlawful activities, violation of the underlying LLM provider's usage policies, or automated scraping at scale — is strictly prohibited.
|
||||||
|
|
||||||
- **No Sensitive Data**: You are strictly prohibited from inputting any Personal Identifiable Information (PII), confidential business data, financial/medical records, or using this agent on web pages containing such sensitive information.
|
- **No Sensitive Data**: You are strictly prohibited from inputting any Personal Identifiable Information (PII), confidential business data, financial/medical records, or using this agent on web pages containing such sensitive information.
|
||||||
|
|
||||||
- **Data Processing**: We do not store or log your prompts, webpage data (HTML), or any submitted content, nor do we use such data for model training. All data is processed in-transit and immediately discarded. We perform in-memory request validation to prevent abuse of the testing API, and temporarily process IP addresses for rate-limiting purposes. No data from these processes is retained. Data is processed through Alibaba Cloud infrastructure, which is subject to its own privacy policy.
|
- **Data Processing**: We do not store or log your prompts, webpage data (HTML), or any submitted content, nor do we use such data for model training. All data is processed in-transit and immediately discarded. We perform in-memory request validation to prevent abuse of the testing API, and temporarily process IP addresses for rate-limiting purposes. No data from these processes is retained. Data is processed through Alibaba Cloud infrastructure, which is subject to its own privacy policy.
|
||||||
|
|||||||
Generated
+230
-253
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "root",
|
"name": "root",
|
||||||
"version": "1.5.3",
|
"version": "1.5.8",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "root",
|
"name": "root",
|
||||||
"version": "1.5.3",
|
"version": "1.5.8",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"packages/page-controller",
|
"packages/page-controller",
|
||||||
@@ -18,13 +18,13 @@
|
|||||||
"packages/website"
|
"packages/website"
|
||||||
],
|
],
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@commitlint/cli": "^20.4.2",
|
"@commitlint/cli": "^20.4.3",
|
||||||
"@commitlint/config-conventional": "^20.4.2",
|
"@commitlint/config-conventional": "^20.4.3",
|
||||||
"@eslint/js": "^9.39.2",
|
"@eslint/js": "^9.39.2",
|
||||||
"@microsoft/api-extractor": "^7.57.6",
|
"@microsoft/api-extractor": "^7.57.7",
|
||||||
"@tailwindcss/vite": "^4.2.1",
|
"@tailwindcss/vite": "^4.2.1",
|
||||||
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
||||||
"@types/node": "^25.3.3",
|
"@types/node": "^25.4.0",
|
||||||
"@vitejs/plugin-react-swc": "^4.1.0",
|
"@vitejs/plugin-react-swc": "^4.1.0",
|
||||||
"chalk": "^5.6.2",
|
"chalk": "^5.6.2",
|
||||||
"concurrently": "^9.2.1",
|
"concurrently": "^9.2.1",
|
||||||
@@ -37,10 +37,10 @@
|
|||||||
"eslint-plugin-react-x": "^2.13.0",
|
"eslint-plugin-react-x": "^2.13.0",
|
||||||
"globals": "^17.4.0",
|
"globals": "^17.4.0",
|
||||||
"husky": "^9.1.7",
|
"husky": "^9.1.7",
|
||||||
"lint-staged": "^16.3.1",
|
"lint-staged": "^16.3.2",
|
||||||
"prettier": "^3.8.0",
|
"prettier": "^3.8.0",
|
||||||
"typescript": "^5.9.3",
|
"typescript": "^5.9.3",
|
||||||
"typescript-eslint": "^8.56.1",
|
"typescript-eslint": "^8.57.0",
|
||||||
"unplugin-dts": "^1.0.0-beta.6",
|
"unplugin-dts": "^1.0.0-beta.6",
|
||||||
"vite": "^7.3.1",
|
"vite": "^7.3.1",
|
||||||
"vite-bundle-analyzer": "^1.3.6",
|
"vite-bundle-analyzer": "^1.3.6",
|
||||||
@@ -468,17 +468,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@commitlint/cli": {
|
"node_modules/@commitlint/cli": {
|
||||||
"version": "20.4.2",
|
"version": "20.4.3",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-20.4.2.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-20.4.3.tgz",
|
||||||
"integrity": "sha512-YjYSX2yj/WsVoxh9mNiymfFS2ADbg2EK4+1WAsMuckwKMCqJ5PDG0CJU/8GvmHWcv4VRB2V02KqSiecRksWqZQ==",
|
"integrity": "sha512-Z37EMoDT7+Upg500vlr/vZrgRsb6Xc5JAA3Tv7BYbobnN/ZpqUeZnSLggBg2+1O+NptRDtyujr2DD1CPV2qwhA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@commitlint/format": "^20.4.0",
|
"@commitlint/format": "^20.4.3",
|
||||||
"@commitlint/lint": "^20.4.2",
|
"@commitlint/lint": "^20.4.3",
|
||||||
"@commitlint/load": "^20.4.0",
|
"@commitlint/load": "^20.4.3",
|
||||||
"@commitlint/read": "^20.4.0",
|
"@commitlint/read": "^20.4.3",
|
||||||
"@commitlint/types": "^20.4.0",
|
"@commitlint/types": "^20.4.3",
|
||||||
"tinyexec": "^1.0.0",
|
"tinyexec": "^1.0.0",
|
||||||
"yargs": "^17.0.0"
|
"yargs": "^17.0.0"
|
||||||
},
|
},
|
||||||
@@ -490,27 +490,27 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@commitlint/config-conventional": {
|
"node_modules/@commitlint/config-conventional": {
|
||||||
"version": "20.4.2",
|
"version": "20.4.3",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-20.4.2.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-20.4.3.tgz",
|
||||||
"integrity": "sha512-rwkTF55q7Q+6dpSKUmJoScV0f3EpDlWKw2UPzklkLS4o5krMN1tPWAVOgHRtyUTMneIapLeQwaCjn44Td6OzBQ==",
|
"integrity": "sha512-9RtLySbYQAs8yEqWEqhSZo9nYhbm57jx7qHXtgRmv/nmeQIjjMcwf6Dl+y5UZcGWgWx435TAYBURONaJIuCjWg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@commitlint/types": "^20.4.0",
|
"@commitlint/types": "^20.4.3",
|
||||||
"conventional-changelog-conventionalcommits": "^9.1.0"
|
"conventional-changelog-conventionalcommits": "^9.2.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=v18"
|
"node": ">=v18"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@commitlint/config-validator": {
|
"node_modules/@commitlint/config-validator": {
|
||||||
"version": "20.4.0",
|
"version": "20.4.3",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-20.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-20.4.3.tgz",
|
||||||
"integrity": "sha512-zShmKTF+sqyNOfAE0vKcqnpvVpG0YX8F9G/ZIQHI2CoKyK+PSdladXMSns400aZ5/QZs+0fN75B//3Q5CHw++w==",
|
"integrity": "sha512-jCZpZFkcSL3ZEdL5zgUzFRdytv3xPo8iukTe9VA+QGus/BGhpp1xXSVu2B006GLLb2gYUAEGEqv64kTlpZNgmA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@commitlint/types": "^20.4.0",
|
"@commitlint/types": "^20.4.3",
|
||||||
"ajv": "^8.11.0"
|
"ajv": "^8.11.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -518,13 +518,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@commitlint/ensure": {
|
"node_modules/@commitlint/ensure": {
|
||||||
"version": "20.4.1",
|
"version": "20.4.3",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-20.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-20.4.3.tgz",
|
||||||
"integrity": "sha512-WLQqaFx1pBooiVvBrA1YfJNFqZF8wS/YGOtr5RzApDbV9tQ52qT5VkTsY65hFTnXhW8PcDfZLaknfJTmPejmlw==",
|
"integrity": "sha512-WcXGKBNn0wBKpX8VlXgxqedyrLxedIlLBCMvdamLnJFEbUGJ9JZmBVx4vhLV3ZyA8uONGOb+CzW0Y9HDbQ+ONQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@commitlint/types": "^20.4.0",
|
"@commitlint/types": "^20.4.3",
|
||||||
"lodash.camelcase": "^4.3.0",
|
"lodash.camelcase": "^4.3.0",
|
||||||
"lodash.kebabcase": "^4.1.1",
|
"lodash.kebabcase": "^4.1.1",
|
||||||
"lodash.snakecase": "^4.1.1",
|
"lodash.snakecase": "^4.1.1",
|
||||||
@@ -546,13 +546,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@commitlint/format": {
|
"node_modules/@commitlint/format": {
|
||||||
"version": "20.4.0",
|
"version": "20.4.3",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/format/-/format-20.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/format/-/format-20.4.3.tgz",
|
||||||
"integrity": "sha512-i3ki3WR0rgolFVX6r64poBHXM1t8qlFel1G1eCBvVgntE3fCJitmzSvH5JD/KVJN/snz6TfaX2CLdON7+s4WVQ==",
|
"integrity": "sha512-UDJVErjLbNghop6j111rsHJYGw6MjCKAi95K0GT2yf4eeiDHy3JDRLWYWEjIaFgO+r+dQSkuqgJ1CdMTtrvHsA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@commitlint/types": "^20.4.0",
|
"@commitlint/types": "^20.4.3",
|
||||||
"picocolors": "^1.1.1"
|
"picocolors": "^1.1.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -560,13 +560,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@commitlint/is-ignored": {
|
"node_modules/@commitlint/is-ignored": {
|
||||||
"version": "20.4.1",
|
"version": "20.4.3",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-20.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-20.4.3.tgz",
|
||||||
"integrity": "sha512-In5EO4JR1lNsAv1oOBBO24V9ND1IqdAJDKZiEpdfjDl2HMasAcT7oA+5BKONv1pRoLG380DGPE2W2RIcUwdgLA==",
|
"integrity": "sha512-W5VQKZ7fdJ1X3Tko+h87YZaqRMGN1KvQKXyCM8xFdxzMIf1KCZgN4uLz3osLB1zsFcVS4ZswHY64LI26/9ACag==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@commitlint/types": "^20.4.0",
|
"@commitlint/types": "^20.4.3",
|
||||||
"semver": "^7.6.0"
|
"semver": "^7.6.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -574,33 +574,33 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@commitlint/lint": {
|
"node_modules/@commitlint/lint": {
|
||||||
"version": "20.4.2",
|
"version": "20.4.3",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-20.4.2.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-20.4.3.tgz",
|
||||||
"integrity": "sha512-buquzNRtFng6xjXvBU1abY/WPEEjCgUipNQrNmIWe8QuJ6LWLtei/LDBAzEe5ASm45+Q9L2Xi3/GVvlj50GAug==",
|
"integrity": "sha512-CYOXL23e+nRKij81+d0+dymtIi7Owl9QzvblJYbEfInON/4MaETNSLFDI74LDu+YJ0ML5HZyw9Vhp9QpckwQ0A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@commitlint/is-ignored": "^20.4.1",
|
"@commitlint/is-ignored": "^20.4.3",
|
||||||
"@commitlint/parse": "^20.4.1",
|
"@commitlint/parse": "^20.4.3",
|
||||||
"@commitlint/rules": "^20.4.2",
|
"@commitlint/rules": "^20.4.3",
|
||||||
"@commitlint/types": "^20.4.0"
|
"@commitlint/types": "^20.4.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=v18"
|
"node": ">=v18"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@commitlint/load": {
|
"node_modules/@commitlint/load": {
|
||||||
"version": "20.4.0",
|
"version": "20.4.3",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/load/-/load-20.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/load/-/load-20.4.3.tgz",
|
||||||
"integrity": "sha512-Dauup/GfjwffBXRJUdlX/YRKfSVXsXZLnINXKz0VZkXdKDcaEILAi9oflHGbfydonJnJAbXEbF3nXPm9rm3G6A==",
|
"integrity": "sha512-3cdJOUVP+VcgHa7bhJoWS+Z8mBNXB5aLWMBu7Q7uX8PSeWDzdbrBlR33J1MGGf7r1PZDp+mPPiFktk031PgdRw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@commitlint/config-validator": "^20.4.0",
|
"@commitlint/config-validator": "^20.4.3",
|
||||||
"@commitlint/execute-rule": "^20.0.0",
|
"@commitlint/execute-rule": "^20.0.0",
|
||||||
"@commitlint/resolve-extends": "^20.4.0",
|
"@commitlint/resolve-extends": "^20.4.3",
|
||||||
"@commitlint/types": "^20.4.0",
|
"@commitlint/types": "^20.4.3",
|
||||||
"cosmiconfig": "^9.0.0",
|
"cosmiconfig": "^9.0.1",
|
||||||
"cosmiconfig-typescript-loader": "^6.1.0",
|
"cosmiconfig-typescript-loader": "^6.1.0",
|
||||||
"is-plain-obj": "^4.1.0",
|
"is-plain-obj": "^4.1.0",
|
||||||
"lodash.mergewith": "^4.6.2",
|
"lodash.mergewith": "^4.6.2",
|
||||||
@@ -611,9 +611,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@commitlint/message": {
|
"node_modules/@commitlint/message": {
|
||||||
"version": "20.4.0",
|
"version": "20.4.3",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/message/-/message-20.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/message/-/message-20.4.3.tgz",
|
||||||
"integrity": "sha512-B5lGtvHgiLAIsK5nLINzVW0bN5hXv+EW35sKhYHE8F7V9Uz1fR4tx3wt7mobA5UNhZKUNgB/+ldVMQE6IHZRyA==",
|
"integrity": "sha512-6akwCYrzcrFcTYz9GyUaWlhisY4lmQ3KvrnabmhoeAV8nRH4dXJAh4+EUQ3uArtxxKQkvxJS78hNX2EU3USgxQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -621,29 +621,29 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@commitlint/parse": {
|
"node_modules/@commitlint/parse": {
|
||||||
"version": "20.4.1",
|
"version": "20.4.3",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-20.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-20.4.3.tgz",
|
||||||
"integrity": "sha512-XNtZjeRcFuAfUnhYrCY02+mpxwY4OmnvD3ETbVPs25xJFFz1nRo/25nHj+5eM+zTeRFvWFwD4GXWU2JEtoK1/w==",
|
"integrity": "sha512-hzC3JCo3zs3VkQ833KnGVuWjWIzR72BWZWjQM7tY/7dfKreKAm7fEsy71tIFCRtxf2RtMP2d3RLF1U9yhFSccA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@commitlint/types": "^20.4.0",
|
"@commitlint/types": "^20.4.3",
|
||||||
"conventional-changelog-angular": "^8.1.0",
|
"conventional-changelog-angular": "^8.2.0",
|
||||||
"conventional-commits-parser": "^6.2.1"
|
"conventional-commits-parser": "^6.3.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=v18"
|
"node": ">=v18"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@commitlint/read": {
|
"node_modules/@commitlint/read": {
|
||||||
"version": "20.4.0",
|
"version": "20.4.3",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/read/-/read-20.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/read/-/read-20.4.3.tgz",
|
||||||
"integrity": "sha512-QfpFn6/I240ySEGv7YWqho4vxqtPpx40FS7kZZDjUJ+eHxu3azfhy7fFb5XzfTqVNp1hNoI3tEmiEPbDB44+cg==",
|
"integrity": "sha512-j42OWv3L31WfnP8WquVjHZRt03w50Y/gEE8FAyih7GQTrIv2+pZ6VZ6pWLD/ml/3PO+RV2SPtRtTp/MvlTb8rQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@commitlint/top-level": "^20.4.0",
|
"@commitlint/top-level": "^20.4.3",
|
||||||
"@commitlint/types": "^20.4.0",
|
"@commitlint/types": "^20.4.3",
|
||||||
"git-raw-commits": "^4.0.0",
|
"git-raw-commits": "^4.0.0",
|
||||||
"minimist": "^1.2.8",
|
"minimist": "^1.2.8",
|
||||||
"tinyexec": "^1.0.0"
|
"tinyexec": "^1.0.0"
|
||||||
@@ -653,14 +653,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@commitlint/resolve-extends": {
|
"node_modules/@commitlint/resolve-extends": {
|
||||||
"version": "20.4.0",
|
"version": "20.4.3",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-20.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-20.4.3.tgz",
|
||||||
"integrity": "sha512-ay1KM8q0t+/OnlpqXJ+7gEFQNlUtSU5Gxr8GEwnVf2TPN3+ywc5DzL3JCxmpucqxfHBTFwfRMXxPRRnR5Ki20g==",
|
"integrity": "sha512-QucxcOy+00FhS9s4Uy0OyS5HeUV+hbC6OLqkTSIm6fwMdKva+OEavaCDuLtgd9akZZlsUo//XzSmPP3sLKBPog==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@commitlint/config-validator": "^20.4.0",
|
"@commitlint/config-validator": "^20.4.3",
|
||||||
"@commitlint/types": "^20.4.0",
|
"@commitlint/types": "^20.4.3",
|
||||||
"global-directory": "^4.0.1",
|
"global-directory": "^4.0.1",
|
||||||
"import-meta-resolve": "^4.0.0",
|
"import-meta-resolve": "^4.0.0",
|
||||||
"lodash.mergewith": "^4.6.2",
|
"lodash.mergewith": "^4.6.2",
|
||||||
@@ -671,16 +671,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@commitlint/rules": {
|
"node_modules/@commitlint/rules": {
|
||||||
"version": "20.4.2",
|
"version": "20.4.3",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-20.4.2.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-20.4.3.tgz",
|
||||||
"integrity": "sha512-oz83pnp5Yq6uwwTAabuVQPNlPfeD2Y5ZjMb7Wx8FSUlu4sLYJjbBWt8031Z0osCFPfHzAwSYrjnfDFKtuSMdKg==",
|
"integrity": "sha512-Yuosd7Grn5qiT7FovngXLyRXTMUbj9PYiSkvUgWK1B5a7+ZvrbWDS7epeUapYNYatCy/KTpPFPbgLUdE+MUrBg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@commitlint/ensure": "^20.4.1",
|
"@commitlint/ensure": "^20.4.3",
|
||||||
"@commitlint/message": "^20.4.0",
|
"@commitlint/message": "^20.4.3",
|
||||||
"@commitlint/to-lines": "^20.0.0",
|
"@commitlint/to-lines": "^20.0.0",
|
||||||
"@commitlint/types": "^20.4.0"
|
"@commitlint/types": "^20.4.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=v18"
|
"node": ">=v18"
|
||||||
@@ -697,9 +697,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@commitlint/top-level": {
|
"node_modules/@commitlint/top-level": {
|
||||||
"version": "20.4.0",
|
"version": "20.4.3",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-20.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-20.4.3.tgz",
|
||||||
"integrity": "sha512-NDzq8Q6jmFaIIBC/GG6n1OQEaHdmaAAYdrZRlMgW6glYWGZ+IeuXmiymDvQNXPc82mVxq2KiE3RVpcs+1OeDeA==",
|
"integrity": "sha512-qD9xfP6dFg5jQ3NMrOhG0/w5y3bBUsVGyJvXxdWEwBm8hyx4WOk3kKXw28T5czBYvyeCVJgJJ6aoJZUWDpaacQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -710,13 +710,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@commitlint/types": {
|
"node_modules/@commitlint/types": {
|
||||||
"version": "20.4.0",
|
"version": "20.4.3",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/types/-/types-20.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/types/-/types-20.4.3.tgz",
|
||||||
"integrity": "sha512-aO5l99BQJ0X34ft8b0h7QFkQlqxC6e7ZPVmBKz13xM9O8obDaM1Cld4sQlJDXXU/VFuUzQ30mVtHjVz74TuStw==",
|
"integrity": "sha512-51OWa1Gi6ODOasPmfJPq6js4pZoomima4XLZZCrkldaH2V5Nb3bVhNXPeT6XV0gubbainSpTw4zi68NqAeCNCg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"conventional-commits-parser": "^6.2.1",
|
"conventional-commits-parser": "^6.3.0",
|
||||||
"picocolors": "^1.1.1"
|
"picocolors": "^1.1.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -1685,9 +1685,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@microsoft/api-extractor": {
|
"node_modules/@microsoft/api-extractor": {
|
||||||
"version": "7.57.6",
|
"version": "7.57.7",
|
||||||
"resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.57.6.tgz",
|
"resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.57.7.tgz",
|
||||||
"integrity": "sha512-0rFv/D8Grzw1Mjs2+8NGUR+o4h9LVm5zKRtMeWnpdB5IMJF4TeHCL1zR5LMCIudkOvyvjbhMG5Wjs0B5nqsrRQ==",
|
"integrity": "sha512-kmnmVs32MFWbV5X6BInC1/TfCs7y1ugwxv1xHsAIj/DyUfoe7vtO0alRUgbQa57+yRGHBBjlNcEk33SCAt5/dA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -1700,7 +1700,7 @@
|
|||||||
"@rushstack/ts-command-line": "5.3.3",
|
"@rushstack/ts-command-line": "5.3.3",
|
||||||
"diff": "~8.0.2",
|
"diff": "~8.0.2",
|
||||||
"lodash": "~4.17.23",
|
"lodash": "~4.17.23",
|
||||||
"minimatch": "10.2.1",
|
"minimatch": "10.2.3",
|
||||||
"resolve": "~1.22.1",
|
"resolve": "~1.22.1",
|
||||||
"semver": "~7.5.4",
|
"semver": "~7.5.4",
|
||||||
"source-map": "~0.6.1",
|
"source-map": "~0.6.1",
|
||||||
@@ -3050,6 +3050,19 @@
|
|||||||
"string-argv": "~0.3.1"
|
"string-argv": "~0.3.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@simple-libs/stream-utils": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz",
|
||||||
|
"integrity": "sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://ko-fi.com/dangreen"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@swc/core": {
|
"node_modules/@swc/core": {
|
||||||
"version": "1.15.11",
|
"version": "1.15.11",
|
||||||
"resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.11.tgz",
|
"resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.11.tgz",
|
||||||
@@ -3788,9 +3801,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "25.3.3",
|
"version": "25.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.4.0.tgz",
|
||||||
"integrity": "sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==",
|
"integrity": "sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -3818,17 +3831,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/eslint-plugin": {
|
"node_modules/@typescript-eslint/eslint-plugin": {
|
||||||
"version": "8.56.1",
|
"version": "8.57.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.0.tgz",
|
||||||
"integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==",
|
"integrity": "sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@eslint-community/regexpp": "^4.12.2",
|
"@eslint-community/regexpp": "^4.12.2",
|
||||||
"@typescript-eslint/scope-manager": "8.56.1",
|
"@typescript-eslint/scope-manager": "8.57.0",
|
||||||
"@typescript-eslint/type-utils": "8.56.1",
|
"@typescript-eslint/type-utils": "8.57.0",
|
||||||
"@typescript-eslint/utils": "8.56.1",
|
"@typescript-eslint/utils": "8.57.0",
|
||||||
"@typescript-eslint/visitor-keys": "8.56.1",
|
"@typescript-eslint/visitor-keys": "8.57.0",
|
||||||
"ignore": "^7.0.5",
|
"ignore": "^7.0.5",
|
||||||
"natural-compare": "^1.4.0",
|
"natural-compare": "^1.4.0",
|
||||||
"ts-api-utils": "^2.4.0"
|
"ts-api-utils": "^2.4.0"
|
||||||
@@ -3841,7 +3854,7 @@
|
|||||||
"url": "https://opencollective.com/typescript-eslint"
|
"url": "https://opencollective.com/typescript-eslint"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@typescript-eslint/parser": "^8.56.1",
|
"@typescript-eslint/parser": "^8.57.0",
|
||||||
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
|
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
|
||||||
"typescript": ">=4.8.4 <6.0.0"
|
"typescript": ">=4.8.4 <6.0.0"
|
||||||
}
|
}
|
||||||
@@ -3857,16 +3870,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/parser": {
|
"node_modules/@typescript-eslint/parser": {
|
||||||
"version": "8.56.1",
|
"version": "8.57.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.0.tgz",
|
||||||
"integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==",
|
"integrity": "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/scope-manager": "8.56.1",
|
"@typescript-eslint/scope-manager": "8.57.0",
|
||||||
"@typescript-eslint/types": "8.56.1",
|
"@typescript-eslint/types": "8.57.0",
|
||||||
"@typescript-eslint/typescript-estree": "8.56.1",
|
"@typescript-eslint/typescript-estree": "8.57.0",
|
||||||
"@typescript-eslint/visitor-keys": "8.56.1",
|
"@typescript-eslint/visitor-keys": "8.57.0",
|
||||||
"debug": "^4.4.3"
|
"debug": "^4.4.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -3882,14 +3895,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/project-service": {
|
"node_modules/@typescript-eslint/project-service": {
|
||||||
"version": "8.56.1",
|
"version": "8.57.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.0.tgz",
|
||||||
"integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==",
|
"integrity": "sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/tsconfig-utils": "^8.56.1",
|
"@typescript-eslint/tsconfig-utils": "^8.57.0",
|
||||||
"@typescript-eslint/types": "^8.56.1",
|
"@typescript-eslint/types": "^8.57.0",
|
||||||
"debug": "^4.4.3"
|
"debug": "^4.4.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -3904,14 +3917,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/scope-manager": {
|
"node_modules/@typescript-eslint/scope-manager": {
|
||||||
"version": "8.56.1",
|
"version": "8.57.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.0.tgz",
|
||||||
"integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==",
|
"integrity": "sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "8.56.1",
|
"@typescript-eslint/types": "8.57.0",
|
||||||
"@typescript-eslint/visitor-keys": "8.56.1"
|
"@typescript-eslint/visitor-keys": "8.57.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||||
@@ -3922,9 +3935,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/tsconfig-utils": {
|
"node_modules/@typescript-eslint/tsconfig-utils": {
|
||||||
"version": "8.56.1",
|
"version": "8.57.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.0.tgz",
|
||||||
"integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==",
|
"integrity": "sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -3939,15 +3952,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/type-utils": {
|
"node_modules/@typescript-eslint/type-utils": {
|
||||||
"version": "8.56.1",
|
"version": "8.57.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.0.tgz",
|
||||||
"integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==",
|
"integrity": "sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "8.56.1",
|
"@typescript-eslint/types": "8.57.0",
|
||||||
"@typescript-eslint/typescript-estree": "8.56.1",
|
"@typescript-eslint/typescript-estree": "8.57.0",
|
||||||
"@typescript-eslint/utils": "8.56.1",
|
"@typescript-eslint/utils": "8.57.0",
|
||||||
"debug": "^4.4.3",
|
"debug": "^4.4.3",
|
||||||
"ts-api-utils": "^2.4.0"
|
"ts-api-utils": "^2.4.0"
|
||||||
},
|
},
|
||||||
@@ -3964,9 +3977,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/types": {
|
"node_modules/@typescript-eslint/types": {
|
||||||
"version": "8.56.1",
|
"version": "8.57.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.0.tgz",
|
||||||
"integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==",
|
"integrity": "sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -3978,16 +3991,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/typescript-estree": {
|
"node_modules/@typescript-eslint/typescript-estree": {
|
||||||
"version": "8.56.1",
|
"version": "8.57.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.0.tgz",
|
||||||
"integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==",
|
"integrity": "sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/project-service": "8.56.1",
|
"@typescript-eslint/project-service": "8.57.0",
|
||||||
"@typescript-eslint/tsconfig-utils": "8.56.1",
|
"@typescript-eslint/tsconfig-utils": "8.57.0",
|
||||||
"@typescript-eslint/types": "8.56.1",
|
"@typescript-eslint/types": "8.57.0",
|
||||||
"@typescript-eslint/visitor-keys": "8.56.1",
|
"@typescript-eslint/visitor-keys": "8.57.0",
|
||||||
"debug": "^4.4.3",
|
"debug": "^4.4.3",
|
||||||
"minimatch": "^10.2.2",
|
"minimatch": "^10.2.2",
|
||||||
"semver": "^7.7.3",
|
"semver": "^7.7.3",
|
||||||
@@ -4005,56 +4018,17 @@
|
|||||||
"typescript": ">=4.8.4 <6.0.0"
|
"typescript": ">=4.8.4 <6.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": {
|
|
||||||
"version": "4.0.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
|
|
||||||
"integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"engines": {
|
|
||||||
"node": "18 || 20 || >=22"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
|
|
||||||
"version": "5.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
|
|
||||||
"integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"balanced-match": "^4.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": "18 || 20 || >=22"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
|
|
||||||
"version": "10.2.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz",
|
|
||||||
"integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==",
|
|
||||||
"dev": true,
|
|
||||||
"license": "BlueOak-1.0.0",
|
|
||||||
"dependencies": {
|
|
||||||
"brace-expansion": "^5.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": "18 || 20 || >=22"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/isaacs"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@typescript-eslint/utils": {
|
"node_modules/@typescript-eslint/utils": {
|
||||||
"version": "8.56.1",
|
"version": "8.57.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.0.tgz",
|
||||||
"integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==",
|
"integrity": "sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@eslint-community/eslint-utils": "^4.9.1",
|
"@eslint-community/eslint-utils": "^4.9.1",
|
||||||
"@typescript-eslint/scope-manager": "8.56.1",
|
"@typescript-eslint/scope-manager": "8.57.0",
|
||||||
"@typescript-eslint/types": "8.56.1",
|
"@typescript-eslint/types": "8.57.0",
|
||||||
"@typescript-eslint/typescript-estree": "8.56.1"
|
"@typescript-eslint/typescript-estree": "8.57.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||||
@@ -4069,13 +4043,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/visitor-keys": {
|
"node_modules/@typescript-eslint/visitor-keys": {
|
||||||
"version": "8.56.1",
|
"version": "8.57.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.0.tgz",
|
||||||
"integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==",
|
"integrity": "sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "8.56.1",
|
"@typescript-eslint/types": "8.57.0",
|
||||||
"eslint-visitor-keys": "^5.0.0"
|
"eslint-visitor-keys": "^5.0.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -4205,9 +4179,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@wxt-dev/module-react": {
|
"node_modules/@wxt-dev/module-react": {
|
||||||
"version": "1.1.5",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/@wxt-dev/module-react/-/module-react-1.1.5.tgz",
|
"resolved": "https://registry.npmjs.org/@wxt-dev/module-react/-/module-react-1.2.1.tgz",
|
||||||
"integrity": "sha512-KgsUrsgH5rBT8MwiipnDEOHBXmLvTIdFICrI7KjngqSf9DpVRn92HsKmToxY0AYpkP19hHWta2oNYFTzmmm++g==",
|
"integrity": "sha512-NkXhXP1KqbTmKuQ7LwESFUnQDxQRiHw98ZQ6cXKuulRvyxtyCfc6gOqbKMHPP9bp497UVHaozr3ZQj1lvcPPTQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -4217,6 +4191,7 @@
|
|||||||
"url": "https://github.com/sponsors/wxt-dev"
|
"url": "https://github.com/sponsors/wxt-dev"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
|
"vite": "^5.4.19 || ^6.3.4 || ^7.0.0 || ^8.0.0-0",
|
||||||
"wxt": ">=0.19.16"
|
"wxt": ">=0.19.16"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -5249,9 +5224,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/conventional-changelog-angular": {
|
"node_modules/conventional-changelog-angular": {
|
||||||
"version": "8.1.0",
|
"version": "8.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.0.tgz",
|
||||||
"integrity": "sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w==",
|
"integrity": "sha512-DOuBwYSqWzfwuRByY9O4oOIvDlkUCTDzfbOgcSbkY+imXXj+4tmrEFao3K+FxemClYfYnZzsvudbwrhje9VHDA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -5262,9 +5237,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/conventional-changelog-conventionalcommits": {
|
"node_modules/conventional-changelog-conventionalcommits": {
|
||||||
"version": "9.1.0",
|
"version": "9.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-9.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-9.3.0.tgz",
|
||||||
"integrity": "sha512-MnbEysR8wWa8dAEvbj5xcBgJKQlX/m0lhS8DsyAAWDHdfs2faDJxTgzRYlRYpXSe7UiKrIIlB4TrBKU9q9DgkA==",
|
"integrity": "sha512-kYFx6gAyjSIMwNtASkI3ZE99U1fuVDJr0yTYgVy+I2QG46zNZfl2her+0+eoviG82c5WQvW1jMt1eOQTeJLodA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -5275,12 +5250,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/conventional-commits-parser": {
|
"node_modules/conventional-commits-parser": {
|
||||||
"version": "6.2.1",
|
"version": "6.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.3.0.tgz",
|
||||||
"integrity": "sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==",
|
"integrity": "sha512-RfOq/Cqy9xV9bOA8N+ZH6DlrDR+5S3Mi0B5kACEjESpE+AviIpAptx9a9cFpWCCvgRtWT+0BbUw+e1BZfts9jg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@simple-libs/stream-utils": "^1.2.0",
|
||||||
"meow": "^13.0.0"
|
"meow": "^13.0.0"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
@@ -5305,9 +5281,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/cosmiconfig": {
|
"node_modules/cosmiconfig": {
|
||||||
"version": "9.0.0",
|
"version": "9.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz",
|
||||||
"integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
|
"integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -6402,13 +6378,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/framer-motion": {
|
"node_modules/framer-motion": {
|
||||||
"version": "12.34.5",
|
"version": "12.35.2",
|
||||||
"resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.34.5.tgz",
|
"resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.35.2.tgz",
|
||||||
"integrity": "sha512-Z2dQ+o7BsfpJI3+u0SQUNCrN+ajCKJen1blC4rCHx1Ta2EOHs+xKJegLT2aaD9iSMbU3OoX+WabQXkloUbZmJQ==",
|
"integrity": "sha512-dhfuEMaNo0hc+AEqyHiIfiJRNb9U9UQutE9FoKm5pjf7CMitp9xPEF1iWZihR1q86LBmo6EJ7S8cN8QXEy49AA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"motion-dom": "^12.34.5",
|
"motion-dom": "^12.35.2",
|
||||||
"motion-utils": "^12.29.2",
|
"motion-utils": "^12.29.2",
|
||||||
"tslib": "^2.4.0"
|
"tslib": "^2.4.0"
|
||||||
},
|
},
|
||||||
@@ -6590,6 +6566,7 @@
|
|||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz",
|
||||||
"integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==",
|
"integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==",
|
||||||
|
"deprecated": "This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead.",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -7741,9 +7718,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/lint-staged": {
|
"node_modules/lint-staged": {
|
||||||
"version": "16.3.1",
|
"version": "16.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.3.2.tgz",
|
||||||
"integrity": "sha512-bqvvquXzFBAlSbluugR4KXAe4XnO/QZcKVszpkBtqLWa2KEiVy8n6Xp38OeUbv/gOJOX4Vo9u5pFt/ADvbm42Q==",
|
"integrity": "sha512-xKqhC2AeXLwiAHXguxBjuChoTTWFC6Pees0SHPwOpwlvI3BH7ZADFPddAdN3pgo3aiKgPUx/bxE78JfUnxQnlg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -7927,9 +7904,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/lucide-react": {
|
"node_modules/lucide-react": {
|
||||||
"version": "0.576.0",
|
"version": "0.577.0",
|
||||||
"resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.576.0.tgz",
|
"resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.577.0.tgz",
|
||||||
"integrity": "sha512-koNxU14BXrxUfZQ9cUaP0ES1uyPZKYDjk31FQZB6dQ/x+tXk979sVAn9ppZ/pVeJJyOxVM8j1E+8QEuSc02Vug==",
|
"integrity": "sha512-4LjoFv2eEPwYDPg/CUdBJQSDfPyzXCRrVW1X7jrx/trgxnxkHFjnVZINbzvzxjN70dxychOfg+FTYwBiS3pQ5A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
@@ -8033,16 +8010,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/minimatch": {
|
"node_modules/minimatch": {
|
||||||
"version": "10.2.1",
|
"version": "10.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz",
|
||||||
"integrity": "sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==",
|
"integrity": "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "BlueOak-1.0.0",
|
"license": "BlueOak-1.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"brace-expansion": "^5.0.2"
|
"brace-expansion": "^5.0.2"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "20 || >=22"
|
"node": "18 || 20 || >=22"
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/isaacs"
|
"url": "https://github.com/sponsors/isaacs"
|
||||||
@@ -8121,13 +8098,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/motion": {
|
"node_modules/motion": {
|
||||||
"version": "12.34.5",
|
"version": "12.35.2",
|
||||||
"resolved": "https://registry.npmjs.org/motion/-/motion-12.34.5.tgz",
|
"resolved": "https://registry.npmjs.org/motion/-/motion-12.35.2.tgz",
|
||||||
"integrity": "sha512-N06NLJ9IeBHeielRqIvYvjPfXuRdyTxa+9++BgpGa+hY2D7TcMkI6QzV3jaRuv0aZRXgMa7cPy9YcBUBisPzAQ==",
|
"integrity": "sha512-8zCi1DkNyU6a/tgEHn/GnnXZDcaMpDHbDOGORY1Rg/6lcNMSOuvwDB3i4hMSOvxqMWArc/vrGaw/Xek1OP69/A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"framer-motion": "^12.34.5",
|
"framer-motion": "^12.35.2",
|
||||||
"tslib": "^2.4.0"
|
"tslib": "^2.4.0"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
@@ -8148,9 +8125,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/motion-dom": {
|
"node_modules/motion-dom": {
|
||||||
"version": "12.34.5",
|
"version": "12.35.2",
|
||||||
"resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.34.5.tgz",
|
"resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.35.2.tgz",
|
||||||
"integrity": "sha512-k33CsnxO2K3gBRMUZT+vPmc4Utlb5menKdG0RyVNLtlqRaaJPRWlE9fXl8NTtfZ5z3G8TDvqSu0MENLqSTaHZA==",
|
"integrity": "sha512-pWXFMTwvGDbx1Fe9YL5HZebv2NhvGBzRtiNUv58aoK7+XrsuaydQ0JGRKK2r+bTKlwgSWwWxHbP5249Qr/BNpg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -9512,9 +9489,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/simple-icons": {
|
"node_modules/simple-icons": {
|
||||||
"version": "16.10.0",
|
"version": "16.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/simple-icons/-/simple-icons-16.10.0.tgz",
|
"resolved": "https://registry.npmjs.org/simple-icons/-/simple-icons-16.11.0.tgz",
|
||||||
"integrity": "sha512-62kuxaG3pE+cFNerudUtwb9BLmudzayHrlHkvU9gf8Nxcj7VYOm9dh3WNbGaFk60aQtfnRyzViZaouFG2B45kg==",
|
"integrity": "sha512-6vqbcdaT6PsgUXud9rrP9w+nrmRzzStMEvyDavMeGwDgZSYM4uJ3tH7zurgTLHJO0RnMqU3Q09Vgo7WdTXV1eA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -10075,16 +10052,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/typescript-eslint": {
|
"node_modules/typescript-eslint": {
|
||||||
"version": "8.56.1",
|
"version": "8.57.0",
|
||||||
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.1.tgz",
|
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.57.0.tgz",
|
||||||
"integrity": "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==",
|
"integrity": "sha512-W8GcigEMEeB07xEZol8oJ26rigm3+bfPHxHvwbYUlu1fUDsGuQ7Hiskx5xGW/xM4USc9Ephe3jtv7ZYPQntHeA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/eslint-plugin": "8.56.1",
|
"@typescript-eslint/eslint-plugin": "8.57.0",
|
||||||
"@typescript-eslint/parser": "8.56.1",
|
"@typescript-eslint/parser": "8.57.0",
|
||||||
"@typescript-eslint/typescript-estree": "8.56.1",
|
"@typescript-eslint/typescript-estree": "8.57.0",
|
||||||
"@typescript-eslint/utils": "8.56.1"
|
"@typescript-eslint/utils": "8.57.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||||
@@ -11113,11 +11090,11 @@
|
|||||||
},
|
},
|
||||||
"packages/core": {
|
"packages/core": {
|
||||||
"name": "@page-agent/core",
|
"name": "@page-agent/core",
|
||||||
"version": "1.5.3",
|
"version": "1.5.8",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@page-agent/llms": "1.5.3",
|
"@page-agent/llms": "1.5.8",
|
||||||
"@page-agent/page-controller": "1.5.3",
|
"@page-agent/page-controller": "1.5.8",
|
||||||
"chalk": "^5.6.2"
|
"chalk": "^5.6.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -11129,13 +11106,13 @@
|
|||||||
},
|
},
|
||||||
"packages/extension": {
|
"packages/extension": {
|
||||||
"name": "@page-agent/ext",
|
"name": "@page-agent/ext",
|
||||||
"version": "0.1.15",
|
"version": "1.5.8",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@page-agent/core": "1.5.3",
|
"@page-agent/core": "1.5.8",
|
||||||
"@page-agent/llms": "1.5.3",
|
"@page-agent/llms": "1.5.8",
|
||||||
"@page-agent/page-controller": "1.5.3",
|
"@page-agent/page-controller": "1.5.8",
|
||||||
"@page-agent/ui": "1.5.3",
|
"@page-agent/ui": "1.5.8",
|
||||||
"ai-motion": "^0.4.8",
|
"ai-motion": "^0.4.8",
|
||||||
"chalk": "^5.6.2"
|
"chalk": "^5.6.2"
|
||||||
},
|
},
|
||||||
@@ -11150,17 +11127,17 @@
|
|||||||
"@types/chrome": "^0.1.37",
|
"@types/chrome": "^0.1.37",
|
||||||
"@types/react": "^19.2.14",
|
"@types/react": "^19.2.14",
|
||||||
"@types/react-dom": "^19.2.1",
|
"@types/react-dom": "^19.2.1",
|
||||||
"@wxt-dev/module-react": "^1.1.5",
|
"@wxt-dev/module-react": "^1.2.1",
|
||||||
"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": "^0.576.0",
|
"lucide-react": "^0.577.0",
|
||||||
"motion": "^12.34.5",
|
"motion": "^12.35.2",
|
||||||
"next-themes": "^0.4.6",
|
"next-themes": "^0.4.6",
|
||||||
"react": "^19.2.4",
|
"react": "^19.2.4",
|
||||||
"react-dom": "^19.2.4",
|
"react-dom": "^19.2.4",
|
||||||
"rough-notation": "^0.5.1",
|
"rough-notation": "^0.5.1",
|
||||||
"simple-icons": "^16.10.0",
|
"simple-icons": "^16.11.0",
|
||||||
"sonner": "^2.0.7",
|
"sonner": "^2.0.7",
|
||||||
"tailwind-merge": "^3.5.0",
|
"tailwind-merge": "^3.5.0",
|
||||||
"tailwindcss": "^4.1.14",
|
"tailwindcss": "^4.1.14",
|
||||||
@@ -11173,7 +11150,7 @@
|
|||||||
},
|
},
|
||||||
"packages/llms": {
|
"packages/llms": {
|
||||||
"name": "@page-agent/llms",
|
"name": "@page-agent/llms",
|
||||||
"version": "1.5.3",
|
"version": "1.5.8",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chalk": "^5.6.2"
|
"chalk": "^5.6.2"
|
||||||
@@ -11186,13 +11163,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"packages/page-agent": {
|
"packages/page-agent": {
|
||||||
"version": "1.5.3",
|
"version": "1.5.8",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@page-agent/core": "1.5.3",
|
"@page-agent/core": "1.5.8",
|
||||||
"@page-agent/llms": "1.5.3",
|
"@page-agent/llms": "1.5.8",
|
||||||
"@page-agent/page-controller": "1.5.3",
|
"@page-agent/page-controller": "1.5.8",
|
||||||
"@page-agent/ui": "1.5.3",
|
"@page-agent/ui": "1.5.8",
|
||||||
"chalk": "^5.6.2"
|
"chalk": "^5.6.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -11204,7 +11181,7 @@
|
|||||||
},
|
},
|
||||||
"packages/page-controller": {
|
"packages/page-controller": {
|
||||||
"name": "@page-agent/page-controller",
|
"name": "@page-agent/page-controller",
|
||||||
"version": "1.5.3",
|
"version": "1.5.8",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ai-motion": "^0.4.8"
|
"ai-motion": "^0.4.8"
|
||||||
@@ -11212,12 +11189,12 @@
|
|||||||
},
|
},
|
||||||
"packages/ui": {
|
"packages/ui": {
|
||||||
"name": "@page-agent/ui",
|
"name": "@page-agent/ui",
|
||||||
"version": "1.5.3",
|
"version": "1.5.8",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"packages/website": {
|
"packages/website": {
|
||||||
"name": "@page-agent/website",
|
"name": "@page-agent/website",
|
||||||
"version": "1.5.3",
|
"version": "1.5.8",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@radix-ui/react-icons": "^1.3.2",
|
"@radix-ui/react-icons": "^1.3.2",
|
||||||
"@radix-ui/react-separator": "^1.1.8",
|
"@radix-ui/react-separator": "^1.1.8",
|
||||||
@@ -11228,13 +11205,13 @@
|
|||||||
"@types/react-dom": "^19.2.1",
|
"@types/react-dom": "^19.2.1",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"lucide-react": "^0.576.0",
|
"lucide-react": "^0.577.0",
|
||||||
"motion": "^12.34.5",
|
"motion": "^12.35.2",
|
||||||
"next-themes": "^0.4.6",
|
"next-themes": "^0.4.6",
|
||||||
"react": "^19.2.4",
|
"react": "^19.2.4",
|
||||||
"react-dom": "^19.2.4",
|
"react-dom": "^19.2.4",
|
||||||
"rough-notation": "^0.5.1",
|
"rough-notation": "^0.5.1",
|
||||||
"simple-icons": "^16.10.0",
|
"simple-icons": "^16.11.0",
|
||||||
"sonner": "^2.0.7",
|
"sonner": "^2.0.7",
|
||||||
"tailwind-merge": "^3.5.0",
|
"tailwind-merge": "^3.5.0",
|
||||||
"tailwindcss": "^4.1.14",
|
"tailwindcss": "^4.1.14",
|
||||||
|
|||||||
+13
-11
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "root",
|
"name": "root",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.5.3",
|
"version": "1.5.8",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"packages/page-controller",
|
"packages/page-controller",
|
||||||
@@ -24,24 +24,26 @@
|
|||||||
"node": "^20.19.0 || ^22.13.0 || >=24"
|
"node": "^20.19.0 || ^22.13.0 || >=24"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"cleanup": "rm -rf packages/*/dist",
|
|
||||||
"start": "npm run dev --workspace=@page-agent/website",
|
"start": "npm run dev --workspace=@page-agent/website",
|
||||||
"build:website": "npm run build:website --workspace=@page-agent/website",
|
"dev:ext": "npm run dev -w @page-agent/ext",
|
||||||
"build:libs": "npm run build --workspaces --if-present",
|
|
||||||
"build": "npm run build:libs && npm run build:website",
|
|
||||||
"dev:demo": "npm run dev:demo --workspace=page-agent",
|
"dev:demo": "npm run dev:demo --workspace=page-agent",
|
||||||
|
"build": "npm run build:libs && npm run build:website",
|
||||||
|
"build:libs": "npm run build --workspaces --if-present",
|
||||||
|
"build:website": "npm run build:website --workspace=@page-agent/website",
|
||||||
|
"build:ext": "npm run build:libs && npm run zip -w @page-agent/ext",
|
||||||
"version": "node scripts/sync-version.js",
|
"version": "node scripts/sync-version.js",
|
||||||
"lint": "eslint .",
|
"lint": "eslint .",
|
||||||
|
"cleanup": "rm -rf packages/*/dist",
|
||||||
"prepare": "husky"
|
"prepare": "husky"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@commitlint/cli": "^20.4.2",
|
"@commitlint/cli": "^20.4.3",
|
||||||
"@commitlint/config-conventional": "^20.4.2",
|
"@commitlint/config-conventional": "^20.4.3",
|
||||||
"@eslint/js": "^9.39.2",
|
"@eslint/js": "^9.39.2",
|
||||||
"@microsoft/api-extractor": "^7.57.6",
|
"@microsoft/api-extractor": "^7.57.7",
|
||||||
"@tailwindcss/vite": "^4.2.1",
|
"@tailwindcss/vite": "^4.2.1",
|
||||||
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
||||||
"@types/node": "^25.3.3",
|
"@types/node": "^25.4.0",
|
||||||
"@vitejs/plugin-react-swc": "^4.1.0",
|
"@vitejs/plugin-react-swc": "^4.1.0",
|
||||||
"chalk": "^5.6.2",
|
"chalk": "^5.6.2",
|
||||||
"concurrently": "^9.2.1",
|
"concurrently": "^9.2.1",
|
||||||
@@ -54,10 +56,10 @@
|
|||||||
"eslint-plugin-react-x": "^2.13.0",
|
"eslint-plugin-react-x": "^2.13.0",
|
||||||
"globals": "^17.4.0",
|
"globals": "^17.4.0",
|
||||||
"husky": "^9.1.7",
|
"husky": "^9.1.7",
|
||||||
"lint-staged": "^16.3.1",
|
"lint-staged": "^16.3.2",
|
||||||
"prettier": "^3.8.0",
|
"prettier": "^3.8.0",
|
||||||
"typescript": "^5.9.3",
|
"typescript": "^5.9.3",
|
||||||
"typescript-eslint": "^8.56.1",
|
"typescript-eslint": "^8.57.0",
|
||||||
"unplugin-dts": "^1.0.0-beta.6",
|
"unplugin-dts": "^1.0.0-beta.6",
|
||||||
"vite": "^7.3.1",
|
"vite": "^7.3.1",
|
||||||
"vite-plugin-css-injected-by-js": "^4.0.1",
|
"vite-plugin-css-injected-by-js": "^4.0.1",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@page-agent/core",
|
"name": "@page-agent/core",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.5.3",
|
"version": "1.5.8",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/esm/page-agent-core.js",
|
"main": "./dist/esm/page-agent-core.js",
|
||||||
"module": "./dist/esm/page-agent-core.js",
|
"module": "./dist/esm/page-agent-core.js",
|
||||||
@@ -44,8 +44,8 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chalk": "^5.6.2",
|
"chalk": "^5.6.2",
|
||||||
"@page-agent/llms": "1.5.3",
|
"@page-agent/llms": "1.5.8",
|
||||||
"@page-agent/page-controller": "1.5.3"
|
"@page-agent/page-controller": "1.5.8"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"zod": "^3.25.0 || ^4.0.0"
|
"zod": "^3.25.0 || ^4.0.0"
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright (C) 2025 Alibaba Group Holding Limited
|
* Copyright (C) 2025 Alibaba Group Holding Limited
|
||||||
|
* Copyright (C) 2026 SimonLuvRamen
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*/
|
*/
|
||||||
import { InvokeError, LLM, type Tool } from '@page-agent/llms'
|
import { InvokeError, LLM, type Tool } from '@page-agent/llms'
|
||||||
@@ -176,7 +177,7 @@ export class PageAgentCore extends EventTarget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Push a observation message to the history event stream.
|
* Push an observation message to the history event stream.
|
||||||
* This will be visible in <agent_history> and remain persistent in memory across steps.
|
* This will be visible in <agent_history> and remain persistent in memory across steps.
|
||||||
* @experimental @internal
|
* @experimental @internal
|
||||||
* @note history change will be emitted before next step starts
|
* @note history change will be emitted before next step starts
|
||||||
@@ -343,7 +344,7 @@ export class PageAgentCore extends EventTarget {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
await waitFor(0.4) // @TODO: configurable
|
await waitFor(this.config.stepDelay ?? 0.4)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -511,7 +512,8 @@ export class PageAgentCore extends EventTarget {
|
|||||||
// Accumulated wait time warning
|
// Accumulated wait time warning
|
||||||
if (this.#states.totalWaitTime >= 3) {
|
if (this.#states.totalWaitTime >= 3) {
|
||||||
this.pushObservation(
|
this.pushObservation(
|
||||||
`You have waited ${this.#states.totalWaitTime} seconds accumulatively. DO NOT wait any longer unless you have a good reason.`
|
`You have waited ${this.#states.totalWaitTime} seconds accumulatively. ` +
|
||||||
|
`DO NOT wait any longer unless you have a good reason.`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -527,7 +529,8 @@ export class PageAgentCore extends EventTarget {
|
|||||||
const remaining = this.config.maxSteps - step
|
const remaining = this.config.maxSteps - step
|
||||||
if (remaining === 5) {
|
if (remaining === 5) {
|
||||||
this.pushObservation(
|
this.pushObservation(
|
||||||
`⚠️ Only ${remaining} steps remaining. Consider wrapping up or calling done with partial results.`
|
`⚠️ Only ${remaining} steps remaining. ` +
|
||||||
|
`Consider wrapping up or calling done with partial results.`
|
||||||
)
|
)
|
||||||
} else if (remaining === 2) {
|
} else if (remaining === 2) {
|
||||||
this.pushObservation(
|
this.pushObservation(
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ Strictly follow these rules while using the browser and navigating the web:
|
|||||||
- By default, only elements in the visible viewport are listed. Use scrolling actions if you suspect relevant content is offscreen which you need to interact with. Scroll ONLY if there are more pixels below or above the page.
|
- By default, only elements in the visible viewport are listed. Use scrolling actions if you suspect relevant content is offscreen which you need to interact with. Scroll ONLY if there are more pixels below or above the page.
|
||||||
- You can scroll by a specific number of pages using the num_pages parameter (e.g., 0.5 for half page, 2.0 for two pages).
|
- You can scroll by a specific number of pages using the num_pages parameter (e.g., 0.5 for half page, 2.0 for two pages).
|
||||||
- All the elements that are scrollable are marked with `data-scrollable` attribute. Including the scrollable distance in every directions. You can scroll *the element* in case some area are overflowed.
|
- All the elements that are scrollable are marked with `data-scrollable` attribute. Including the scrollable distance in every directions. You can scroll *the element* in case some area are overflowed.
|
||||||
- If a captcha appears, tell user you can not solve captcha. finished the task and ask user to solve it.
|
- If a captcha appears, tell user you can not solve captcha. Finish the task and ask user to solve it.
|
||||||
- If expected elements are missing, try scrolling, or navigating back.
|
- If expected elements are missing, try scrolling, or navigating back.
|
||||||
- If the page is not fully loaded, use the `wait` action.
|
- If the page is not fully loaded, use the `wait` action.
|
||||||
- Do not repeat one action for more than 3 times unless some conditions changed.
|
- Do not repeat one action for more than 3 times unless some conditions changed.
|
||||||
@@ -87,11 +87,11 @@ Strictly follow these rules while using the browser and navigating the web:
|
|||||||
|
|
||||||
<capability>
|
<capability>
|
||||||
- You can only handle single page app. Do not jump out of current page.
|
- You can only handle single page app. Do not jump out of current page.
|
||||||
- Do not click on link if it will open in a new page (etc. <a target="_blank">)
|
- Do not click on link if it will open in a new page (e.g., <a target="_blank">)
|
||||||
- It is ok to fail the task.
|
- It is ok to fail the task.
|
||||||
- User can be wrong. If the request of user is not achievable, inappropriate or you do not have enough information or tools to achieve it. Tell user to make a better request.
|
- User can be wrong. If the request of user is not achievable, inappropriate or you do not have enough information or tools to achieve it. Tell user to make a better request.
|
||||||
- Webpage can be broken. All webpages or apps have bugs. Some bug will make it hard for your job. It's encouraged to tell user the problem of current page. Your feedbacks (including failing) are valuable for user.
|
- Webpage can be broken. All webpages or apps have bugs. Some bug will make it hard for your job. It's encouraged to tell user the problem of current page. Your feedbacks (including failing) are valuable for user.
|
||||||
- Trying to hard can be harmful. Repeating some action back and forth or pushing for a complex procedure with little knowledge can cause unwanted result and harmful side-effects. User would rather you to complete the task with a fail.
|
- Trying too hard can be harmful. Repeating some action back and forth or pushing for a complex procedure with little knowledge can cause unwanted results and harmful side-effects. User would rather you complete the task with a fail.
|
||||||
- If you do not have knowledge for the current webpage or task. You must require user to give specific instructions and detailed steps.
|
- If you do not have knowledge for the current webpage or task. You must require user to give specific instructions and detailed steps.
|
||||||
</capability>
|
</capability>
|
||||||
|
|
||||||
|
|||||||
@@ -152,6 +152,12 @@ export interface AgentConfig extends LLMConfig {
|
|||||||
* @experimental Use with caution - incorrect prompts may break agent behavior.
|
* @experimental Use with caution - incorrect prompts may break agent behavior.
|
||||||
*/
|
*/
|
||||||
customSystemPrompt?: string
|
customSystemPrompt?: string
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delay between steps in seconds.
|
||||||
|
* @default 0.4
|
||||||
|
*/
|
||||||
|
stepDelay?: number
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ export function randomID(existingIDs?: string[]): string {
|
|||||||
id = Math.random().toString(36).substring(2, 11)
|
id = Math.random().toString(36).substring(2, 11)
|
||||||
tryCount++
|
tryCount++
|
||||||
if (tryCount > MAX_TRY) {
|
if (tryCount > MAX_TRY) {
|
||||||
throw new Error('randomID: too many try')
|
throw new Error('randomID: too many tries')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,7 +61,15 @@ const llmsTxtCache = new Map<string, string | null>()
|
|||||||
|
|
||||||
/** Fetch /llms.txt for a URL's origin. Cached per origin, `null` = tried and not found. */
|
/** Fetch /llms.txt for a URL's origin. Cached per origin, `null` = tried and not found. */
|
||||||
export async function fetchLlmsTxt(url: string): Promise<string | null> {
|
export async function fetchLlmsTxt(url: string): Promise<string | null> {
|
||||||
const origin = new URL(url).origin
|
let origin: string
|
||||||
|
try {
|
||||||
|
origin = new URL(url).origin
|
||||||
|
} catch {
|
||||||
|
return null // Invalid URL
|
||||||
|
}
|
||||||
|
// about:blank, data:, file:
|
||||||
|
if (origin === 'null') return null
|
||||||
|
|
||||||
if (llmsTxtCache.has(origin)) return llmsTxtCache.get(origin)!
|
if (llmsTxtCache.has(origin)) return llmsTxtCache.get(origin)!
|
||||||
|
|
||||||
const endpoint = `${origin}/llms.txt`
|
const endpoint = `${origin}/llms.txt`
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@page-agent/ext",
|
"name": "@page-agent/ext",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.1.15",
|
"version": "1.5.8",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "wxt",
|
"dev": "wxt",
|
||||||
@@ -20,17 +20,17 @@
|
|||||||
"@types/chrome": "^0.1.37",
|
"@types/chrome": "^0.1.37",
|
||||||
"@types/react": "^19.2.14",
|
"@types/react": "^19.2.14",
|
||||||
"@types/react-dom": "^19.2.1",
|
"@types/react-dom": "^19.2.1",
|
||||||
"@wxt-dev/module-react": "^1.1.5",
|
"@wxt-dev/module-react": "^1.2.1",
|
||||||
"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": "^0.576.0",
|
"lucide-react": "^0.577.0",
|
||||||
"motion": "^12.34.5",
|
"motion": "^12.35.2",
|
||||||
"next-themes": "^0.4.6",
|
"next-themes": "^0.4.6",
|
||||||
"react": "^19.2.4",
|
"react": "^19.2.4",
|
||||||
"react-dom": "^19.2.4",
|
"react-dom": "^19.2.4",
|
||||||
"rough-notation": "^0.5.1",
|
"rough-notation": "^0.5.1",
|
||||||
"simple-icons": "^16.10.0",
|
"simple-icons": "^16.11.0",
|
||||||
"sonner": "^2.0.7",
|
"sonner": "^2.0.7",
|
||||||
"tailwind-merge": "^3.5.0",
|
"tailwind-merge": "^3.5.0",
|
||||||
"tailwindcss": "^4.1.14",
|
"tailwindcss": "^4.1.14",
|
||||||
@@ -38,10 +38,10 @@
|
|||||||
"wxt": "^0.20.18"
|
"wxt": "^0.20.18"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@page-agent/core": "1.5.3",
|
"@page-agent/core": "1.5.8",
|
||||||
"@page-agent/llms": "1.5.3",
|
"@page-agent/llms": "1.5.8",
|
||||||
"@page-agent/page-controller": "1.5.3",
|
"@page-agent/page-controller": "1.5.8",
|
||||||
"@page-agent/ui": "1.5.3",
|
"@page-agent/ui": "1.5.8",
|
||||||
"ai-motion": "^0.4.8",
|
"ai-motion": "^0.4.8",
|
||||||
"chalk": "^5.6.2"
|
"chalk": "^5.6.2"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ export function handleTabControlMessage(
|
|||||||
.create({ url: payload.url, active: false })
|
.create({ url: payload.url, active: false })
|
||||||
.then((newTab) => {
|
.then((newTab) => {
|
||||||
debug('open_new_tab: success', newTab)
|
debug('open_new_tab: success', newTab)
|
||||||
sendResponse({ success: true, tabId: newTab.id, windowId: newTab.windowId })
|
sendResponse({ success: true, tabId: newTab.id })
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
sendResponse({ error: error instanceof Error ? error.message : String(error) })
|
sendResponse({ error: error instanceof Error ? error.message : String(error) })
|
||||||
@@ -63,7 +63,7 @@ export function handleTabControlMessage(
|
|||||||
case 'create_tab_group': {
|
case 'create_tab_group': {
|
||||||
debug('create_tab_group', payload)
|
debug('create_tab_group', payload)
|
||||||
chrome.tabs
|
chrome.tabs
|
||||||
.group({ tabIds: payload.tabIds, createProperties: { windowId: payload.windowId } })
|
.group({ tabIds: payload.tabIds })
|
||||||
.then((groupId) => {
|
.then((groupId) => {
|
||||||
debug('create_tab_group: success', groupId)
|
debug('create_tab_group: success', groupId)
|
||||||
sendResponse({ success: true, groupId })
|
sendResponse({ success: true, groupId })
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ export class TabsController extends EventTarget {
|
|||||||
private initialTabId: number | null = null
|
private initialTabId: number | null = null
|
||||||
private tabGroupId: number | null = null
|
private tabGroupId: number | null = null
|
||||||
private task: string = ''
|
private task: string = ''
|
||||||
private windowId: number | null = null
|
|
||||||
|
|
||||||
async init(task: string, includeInitialTab: boolean = true) {
|
async init(task: string, includeInitialTab: boolean = true) {
|
||||||
debug('init', task, includeInitialTab)
|
debug('init', task, includeInitialTab)
|
||||||
@@ -37,7 +36,6 @@ export class TabsController extends EventTarget {
|
|||||||
this.currentTabId = null
|
this.currentTabId = null
|
||||||
this.tabGroupId = null
|
this.tabGroupId = null
|
||||||
this.initialTabId = null
|
this.initialTabId = null
|
||||||
this.windowId = null
|
|
||||||
|
|
||||||
const result = await sendMessage({
|
const result = await sendMessage({
|
||||||
type: 'TAB_CONTROL',
|
type: 'TAB_CONTROL',
|
||||||
@@ -53,7 +51,6 @@ export class TabsController extends EventTarget {
|
|||||||
if (includeInitialTab) {
|
if (includeInitialTab) {
|
||||||
this.currentTabId = this.initialTabId
|
this.currentTabId = this.initialTabId
|
||||||
|
|
||||||
// update tab status immediately
|
|
||||||
const info = await sendMessage({
|
const info = await sendMessage({
|
||||||
type: 'TAB_CONTROL',
|
type: 'TAB_CONTROL',
|
||||||
action: 'get_tab_info',
|
action: 'get_tab_info',
|
||||||
@@ -67,6 +64,8 @@ export class TabsController extends EventTarget {
|
|||||||
title: info.title,
|
title: info.title,
|
||||||
status: info.status,
|
status: info.status,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
await this.createTabGroup([this.initialTabId])
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.updateCurrentTabId(this.currentTabId)
|
await this.updateCurrentTabId(this.currentTabId)
|
||||||
@@ -132,9 +131,6 @@ export class TabsController extends EventTarget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const tabId = result.tabId as number
|
const tabId = result.tabId as number
|
||||||
const windowId = result.windowId as number
|
|
||||||
|
|
||||||
this.windowId = windowId
|
|
||||||
|
|
||||||
this.tabs.push({
|
this.tabs.push({
|
||||||
id: tabId,
|
id: tabId,
|
||||||
@@ -144,32 +140,7 @@ export class TabsController extends EventTarget {
|
|||||||
await this.switchToTab(tabId)
|
await this.switchToTab(tabId)
|
||||||
|
|
||||||
if (!this.tabGroupId) {
|
if (!this.tabGroupId) {
|
||||||
const result = await sendMessage({
|
await this.createTabGroup([tabId])
|
||||||
type: 'TAB_CONTROL',
|
|
||||||
action: 'create_tab_group',
|
|
||||||
payload: { tabIds: [tabId], windowId: this.windowId },
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!result.success) {
|
|
||||||
throw new Error(`Failed to create tab group: ${result.error}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
const groupId = result.groupId as number
|
|
||||||
|
|
||||||
this.tabGroupId = groupId
|
|
||||||
|
|
||||||
await sendMessage({
|
|
||||||
type: 'TAB_CONTROL',
|
|
||||||
action: 'update_tab_group',
|
|
||||||
payload: {
|
|
||||||
groupId: this.tabGroupId,
|
|
||||||
properties: {
|
|
||||||
title: `PageAgent(${this.task})`,
|
|
||||||
color: randomColor(),
|
|
||||||
collapsed: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
} else {
|
} else {
|
||||||
await sendMessage({
|
await sendMessage({
|
||||||
type: 'TAB_CONTROL',
|
type: 'TAB_CONTROL',
|
||||||
@@ -230,6 +201,33 @@ export class TabsController extends EventTarget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async createTabGroup(tabIds: number[]) {
|
||||||
|
const result = await sendMessage({
|
||||||
|
type: 'TAB_CONTROL',
|
||||||
|
action: 'create_tab_group',
|
||||||
|
payload: { tabIds },
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!result?.success) {
|
||||||
|
throw new Error(`Failed to create tab group: ${result?.error}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.tabGroupId = result.groupId as number
|
||||||
|
|
||||||
|
await sendMessage({
|
||||||
|
type: 'TAB_CONTROL',
|
||||||
|
action: 'update_tab_group',
|
||||||
|
payload: {
|
||||||
|
groupId: this.tabGroupId,
|
||||||
|
properties: {
|
||||||
|
title: `PageAgent(${this.task})`,
|
||||||
|
color: randomColor(),
|
||||||
|
collapsed: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
async updateCurrentTabId(tabId: number | null) {
|
async updateCurrentTabId(tabId: number | null) {
|
||||||
debug('updateCurrentTabId', tabId)
|
debug('updateCurrentTabId', tabId)
|
||||||
|
|
||||||
@@ -309,16 +307,7 @@ interface TabMeta {
|
|||||||
status?: 'loading' | 'unloaded' | 'complete'
|
status?: 'loading' | 'unloaded' | 'complete'
|
||||||
}
|
}
|
||||||
|
|
||||||
const TAB_GROUP_COLORS = [
|
const TAB_GROUP_COLORS = ['blue', 'red', 'yellow', 'green', 'pink', 'purple', 'cyan'] as const
|
||||||
'grey',
|
|
||||||
'blue',
|
|
||||||
'red',
|
|
||||||
'yellow',
|
|
||||||
'green',
|
|
||||||
'pink',
|
|
||||||
'purple',
|
|
||||||
'cyan',
|
|
||||||
] as const
|
|
||||||
|
|
||||||
type TabGroupColor = (typeof TAB_GROUP_COLORS)[number]
|
type TabGroupColor = (typeof TAB_GROUP_COLORS)[number]
|
||||||
|
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ Strictly follow these rules while using the browser and navigating the web:
|
|||||||
- By default, only elements in the visible viewport are listed. Use scrolling actions if you suspect relevant content is offscreen which you need to interact with. Scroll ONLY if there are more pixels below or above the page.
|
- By default, only elements in the visible viewport are listed. Use scrolling actions if you suspect relevant content is offscreen which you need to interact with. Scroll ONLY if there are more pixels below or above the page.
|
||||||
- You can scroll by a specific number of pages using the num_pages parameter (e.g., 0.5 for half page, 2.0 for two pages).
|
- You can scroll by a specific number of pages using the num_pages parameter (e.g., 0.5 for half page, 2.0 for two pages).
|
||||||
- All the elements that are scrollable are marked with `data-scrollable` attribute. Including the scrollable distance in every directions. You can scroll *the element* in case some area are overflowed.
|
- All the elements that are scrollable are marked with `data-scrollable` attribute. Including the scrollable distance in every directions. You can scroll *the element* in case some area are overflowed.
|
||||||
- If a captcha appears, tell user you can not solve captcha. finished the task and ask user to solve it.
|
- If a captcha appears, tell user you can not solve captcha. Finish the task and ask user to solve it.
|
||||||
- If expected elements are missing, try scrolling, or navigating back.
|
- If expected elements are missing, try scrolling, or navigating back.
|
||||||
- If the page is not fully loaded, use the `wait` action.
|
- If the page is not fully loaded, use the `wait` action.
|
||||||
- Do not repeat one action for more than 3 times unless some conditions changed.
|
- Do not repeat one action for more than 3 times unless some conditions changed.
|
||||||
|
|||||||
@@ -110,9 +110,9 @@ export default defineUnlistedScript(() => {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
;(window as any).PAGE_AGENT_EXT_VERSION = __EXT_VERSION__
|
;(window as any).PAGE_AGENT_EXT_VERSION = __VERSION__
|
||||||
;(window as any).PAGE_AGENT_EXT = {
|
;(window as any).PAGE_AGENT_EXT = {
|
||||||
version: __EXT_VERSION__,
|
version: __VERSION__,
|
||||||
execute,
|
execute,
|
||||||
stop,
|
stop,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -286,6 +286,10 @@ export function ConfigPanel({ config, onSave, onClose }: ConfigPanelProps) {
|
|||||||
{/* Footer */}
|
{/* Footer */}
|
||||||
<div className="mt-4 mb-4 pt-4 border-t border-border/50 flex gap-2 justify-between text-[10px] text-muted-foreground">
|
<div className="mt-4 mb-4 pt-4 border-t border-border/50 flex gap-2 justify-between text-[10px] text-muted-foreground">
|
||||||
<div className="flex flex-col justify-between">
|
<div className="flex flex-col justify-between">
|
||||||
|
<span>
|
||||||
|
Version <span className="font-mono">v{__VERSION__}</span>
|
||||||
|
</span>
|
||||||
|
|
||||||
<a
|
<a
|
||||||
href="https://github.com/alibaba/page-agent"
|
href="https://github.com/alibaba/page-agent"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
@@ -297,7 +301,9 @@ export function ConfigPanel({ config, onSave, onClose }: ConfigPanelProps) {
|
|||||||
</svg>
|
</svg>
|
||||||
<span>Source Code</span>
|
<span>Source Code</span>
|
||||||
</a>
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex flex-col items-end">
|
||||||
<a
|
<a
|
||||||
href="https://alibaba.github.io/page-agent/"
|
href="https://alibaba.github.io/page-agent/"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
@@ -315,18 +321,9 @@ export function ConfigPanel({ config, onSave, onClose }: ConfigPanelProps) {
|
|||||||
className="flex items-center gap-1 hover:text-foreground"
|
className="flex items-center gap-1 hover:text-foreground"
|
||||||
>
|
>
|
||||||
<HatGlasses className="size-3" />
|
<HatGlasses className="size-3" />
|
||||||
<span>Privacy Policy</span>
|
<span>Privacy</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex flex-col items-end">
|
|
||||||
<span>
|
|
||||||
Extension <span className="font-mono">v{__EXT_VERSION__}</span>
|
|
||||||
</span>
|
|
||||||
<span>
|
|
||||||
PageAgent <span className="font-mono">v{__CORE_VERSION__}</span>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* attribute */}
|
{/* attribute */}
|
||||||
|
|||||||
+1
-2
@@ -1,2 +1 @@
|
|||||||
declare const __EXT_VERSION__: string
|
declare const __VERSION__: string
|
||||||
declare const __CORE_VERSION__: string
|
|
||||||
|
|||||||
@@ -19,8 +19,7 @@ export default defineConfig({
|
|||||||
vite: () => ({
|
vite: () => ({
|
||||||
plugins: [tailwindcss()],
|
plugins: [tailwindcss()],
|
||||||
define: {
|
define: {
|
||||||
__EXT_VERSION__: JSON.stringify(pkg.version),
|
__VERSION__: JSON.stringify(pkg.version),
|
||||||
__CORE_VERSION__: JSON.stringify(pkg.dependencies['@page-agent/core']),
|
|
||||||
},
|
},
|
||||||
optimizeDeps: {
|
optimizeDeps: {
|
||||||
force: true,
|
force: true,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@page-agent/llms",
|
"name": "@page-agent/llms",
|
||||||
"version": "1.5.3",
|
"version": "1.5.8",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/lib/page-agent-llms.js",
|
"main": "./dist/lib/page-agent-llms.js",
|
||||||
"module": "./dist/lib/page-agent-llms.js",
|
"module": "./dist/lib/page-agent-llms.js",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "page-agent",
|
"name": "page-agent",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.5.3",
|
"version": "1.5.8",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/esm/page-agent.js",
|
"main": "./dist/esm/page-agent.js",
|
||||||
"module": "./dist/esm/page-agent.js",
|
"module": "./dist/esm/page-agent.js",
|
||||||
@@ -44,10 +44,10 @@
|
|||||||
"postpublish": "node -e \"['README.md','LICENSE'].forEach(f=>{try{require('fs').unlinkSync(f)}catch{}})\""
|
"postpublish": "node -e \"['README.md','LICENSE'].forEach(f=>{try{require('fs').unlinkSync(f)}catch{}})\""
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@page-agent/core": "1.5.3",
|
"@page-agent/core": "1.5.8",
|
||||||
"@page-agent/llms": "1.5.3",
|
"@page-agent/llms": "1.5.8",
|
||||||
"@page-agent/page-controller": "1.5.3",
|
"@page-agent/page-controller": "1.5.8",
|
||||||
"@page-agent/ui": "1.5.3",
|
"@page-agent/ui": "1.5.8",
|
||||||
"chalk": "^5.6.2"
|
"chalk": "^5.6.2"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@page-agent/page-controller",
|
"name": "@page-agent/page-controller",
|
||||||
"version": "1.5.3",
|
"version": "1.5.8",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/lib/page-controller.js",
|
"main": "./dist/lib/page-controller.js",
|
||||||
"module": "./dist/lib/page-controller.js",
|
"module": "./dist/lib/page-controller.js",
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import {
|
|||||||
scrollVertically,
|
scrollVertically,
|
||||||
selectOptionElement,
|
selectOptionElement,
|
||||||
} from './actions'
|
} from './actions'
|
||||||
import { VIEWPORT_EXPANSION } from './constants'
|
|
||||||
import * as dom from './dom'
|
import * as dom from './dom'
|
||||||
import type { FlatDomTree, InteractiveElementDomNode } from './dom/dom_tree/type'
|
import type { FlatDomTree, InteractiveElementDomNode } from './dom/dom_tree/type'
|
||||||
import { getPageInfo } from './dom/getPageInfo'
|
import { getPageInfo } from './dom/getPageInfo'
|
||||||
@@ -24,7 +23,6 @@ import { patchReact } from './patches/react'
|
|||||||
* Configuration for PageController
|
* Configuration for PageController
|
||||||
*/
|
*/
|
||||||
export interface PageControllerConfig extends dom.DomConfig {
|
export interface PageControllerConfig extends dom.DomConfig {
|
||||||
viewportExpansion?: number
|
|
||||||
/** Enable visual mask overlay during operations (default: false) */
|
/** Enable visual mask overlay during operations (default: false) */
|
||||||
enableMask?: boolean
|
enableMask?: boolean
|
||||||
}
|
}
|
||||||
@@ -131,7 +129,7 @@ export class PageController extends EventTarget {
|
|||||||
const url = window.location.href
|
const url = window.location.href
|
||||||
const title = document.title
|
const title = document.title
|
||||||
const pi = getPageInfo()
|
const pi = getPageInfo()
|
||||||
const viewportExpansion = this.config.viewportExpansion ?? VIEWPORT_EXPANSION
|
const viewportExpansion = dom.resolveViewportExpansion(this.config.viewportExpansion)
|
||||||
|
|
||||||
await this.updateTree()
|
await this.updateTree()
|
||||||
|
|
||||||
|
|||||||
@@ -101,41 +101,93 @@ const nativeTextAreaValueSetter = Object.getOwnPropertyDescriptor(
|
|||||||
'value'
|
'value'
|
||||||
)!.set!
|
)!.set!
|
||||||
|
|
||||||
/**
|
|
||||||
* create a synthetic keyboard event
|
|
||||||
* with key keycode code
|
|
||||||
*/
|
|
||||||
export async function createSyntheticInputEvent(elem: HTMLElement, key: string) {
|
|
||||||
elem.dispatchEvent(new KeyboardEvent('keydown', { bubbles: true, cancelable: true, key }))
|
|
||||||
await waitFor(0.01)
|
|
||||||
|
|
||||||
if (elem instanceof HTMLInputElement || elem instanceof HTMLTextAreaElement) {
|
|
||||||
elem.dispatchEvent(new Event('beforeinput', { bubbles: true }))
|
|
||||||
await waitFor(0.01)
|
|
||||||
elem.dispatchEvent(new Event('input', { bubbles: true }))
|
|
||||||
await waitFor(0.01)
|
|
||||||
}
|
|
||||||
|
|
||||||
elem.dispatchEvent(new KeyboardEvent('keyup', { bubbles: true, cancelable: true, key }))
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function inputTextElement(element: HTMLElement, text: string) {
|
export async function inputTextElement(element: HTMLElement, text: string) {
|
||||||
if (!(element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement)) {
|
const isContentEditable = element.isContentEditable
|
||||||
throw new Error('Element is not an input or textarea')
|
if (
|
||||||
|
!(element instanceof HTMLInputElement) &&
|
||||||
|
!(element instanceof HTMLTextAreaElement) &&
|
||||||
|
!isContentEditable
|
||||||
|
) {
|
||||||
|
throw new Error('Element is not an input, textarea, or contenteditable')
|
||||||
}
|
}
|
||||||
|
|
||||||
await clickElement(element)
|
await clickElement(element)
|
||||||
|
|
||||||
if (element instanceof HTMLTextAreaElement) {
|
if (isContentEditable) {
|
||||||
|
// Contenteditable support (partial)
|
||||||
|
// Not supported:
|
||||||
|
// - Monaco/CodeMirror: Require direct JS instance access. No universal way to obtain.
|
||||||
|
// - Draft.js: Not responsive to synthetic/execCommand/Range/DataTransfer. Unmaintained.
|
||||||
|
//
|
||||||
|
// Plan A: Dispatch synthetic events
|
||||||
|
// Works: LinkedIn, React contenteditable, Quill.
|
||||||
|
// Fails: Slate.js
|
||||||
|
// Sequence: beforeinput -> mutation -> input -> change -> blur
|
||||||
|
|
||||||
|
// Dispatch beforeinput + mutation + input for clearing
|
||||||
|
if (
|
||||||
|
element.dispatchEvent(
|
||||||
|
new InputEvent('beforeinput', {
|
||||||
|
bubbles: true,
|
||||||
|
cancelable: true,
|
||||||
|
inputType: 'deleteContent',
|
||||||
|
})
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
element.innerText = ''
|
||||||
|
element.dispatchEvent(
|
||||||
|
new InputEvent('input', {
|
||||||
|
bubbles: true,
|
||||||
|
inputType: 'deleteContent',
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dispatch beforeinput + mutation + input for insertion (important for React apps)
|
||||||
|
if (
|
||||||
|
element.dispatchEvent(
|
||||||
|
new InputEvent('beforeinput', {
|
||||||
|
bubbles: true,
|
||||||
|
cancelable: true,
|
||||||
|
inputType: 'insertText',
|
||||||
|
data: text,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
element.innerText = text
|
||||||
|
element.dispatchEvent(
|
||||||
|
new InputEvent('input', {
|
||||||
|
bubbles: true,
|
||||||
|
inputType: 'insertText',
|
||||||
|
data: text,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dispatch change event (for good measure)
|
||||||
|
element.dispatchEvent(new Event('change', { bubbles: true }))
|
||||||
|
|
||||||
|
// Trigger blur for validation
|
||||||
|
element.blur()
|
||||||
|
|
||||||
|
// Plan B: execCommand (deprecated but works better for some editors)
|
||||||
|
// Works: LinkedIn, Quill, Slate.js, react contenteditable components
|
||||||
|
//
|
||||||
|
// document.execCommand('selectAll')
|
||||||
|
// document.execCommand('delete')
|
||||||
|
// document.execCommand('insertText', false, text)
|
||||||
|
} else if (element instanceof HTMLTextAreaElement) {
|
||||||
nativeTextAreaValueSetter.call(element, text)
|
nativeTextAreaValueSetter.call(element, text)
|
||||||
} else {
|
} else {
|
||||||
nativeInputValueSetter.call(element, text)
|
nativeInputValueSetter.call(element, text)
|
||||||
}
|
}
|
||||||
|
|
||||||
const inputEvent = new Event('input', { bubbles: true })
|
// Only dispatch shared input event for non-contenteditable (contenteditable has its own)
|
||||||
element.dispatchEvent(inputEvent)
|
if (!isContentEditable) {
|
||||||
|
element.dispatchEvent(new Event('input', { bubbles: true }))
|
||||||
|
}
|
||||||
|
|
||||||
await waitFor(0.1) // Wait to ensure input event processing completes
|
await waitFor(0.1)
|
||||||
|
|
||||||
blurLastClickedElement()
|
blurLastClickedElement()
|
||||||
}
|
}
|
||||||
@@ -161,14 +213,18 @@ export async function selectOptionElement(selectElement: HTMLSelectElement, opti
|
|||||||
await waitFor(0.1) // Wait to ensure change event processing completes
|
await waitFor(0.1) // Wait to ensure change event processing completes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface ScrollableElement extends HTMLElement {
|
||||||
|
scrollIntoViewIfNeeded?: (centerIfNeeded?: boolean) => void
|
||||||
|
}
|
||||||
|
|
||||||
export async function scrollIntoViewIfNeeded(element: HTMLElement) {
|
export async function scrollIntoViewIfNeeded(element: HTMLElement) {
|
||||||
const el = element as any
|
const el = element as ScrollableElement
|
||||||
if (el.scrollIntoViewIfNeeded) {
|
if (typeof el.scrollIntoViewIfNeeded === 'function') {
|
||||||
el.scrollIntoViewIfNeeded()
|
el.scrollIntoViewIfNeeded()
|
||||||
// await waitFor(0.5) // Animation playback
|
// await waitFor(0.5) // Animation playback
|
||||||
} else {
|
} else {
|
||||||
// @todo visibility check
|
// @todo visibility check
|
||||||
el.scrollIntoView({ behavior: 'auto', block: 'center', inline: 'nearest' })
|
element.scrollIntoView({ behavior: 'auto', block: 'center', inline: 'nearest' })
|
||||||
// await waitFor(0.5) // Animation playback
|
// await waitFor(0.5) // Animation playback
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (C) 2025 Alibaba Group Holding Limited
|
|
||||||
* All rights reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Viewport expansion for DOM tree extraction.
|
|
||||||
* -1 means full page (no viewport restriction)
|
|
||||||
* 0 means viewport only
|
|
||||||
* positive values expand the viewport by that many pixels
|
|
||||||
*
|
|
||||||
* @note Since isTopElement depends on elementFromPoint,
|
|
||||||
* it returns null when out of viewport, this feature has no practical use, only differ between -1 and 0
|
|
||||||
*/
|
|
||||||
// export const VIEWPORT_EXPANSION = 100
|
|
||||||
export const VIEWPORT_EXPANSION = -1
|
|
||||||
@@ -17,6 +17,7 @@
|
|||||||
* @edit add `data-browser-use-ignore` attribute
|
* @edit add `data-browser-use-ignore` attribute
|
||||||
* @edit improve `sampleRect`, filter out rects with 0 area
|
* @edit improve `sampleRect`, filter out rects with 0 area
|
||||||
* @edit exclude aria-hidden elements
|
* @edit exclude aria-hidden elements
|
||||||
|
* @edit make sure attributes exist for interactive candidates.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export default (
|
export default (
|
||||||
@@ -1608,6 +1609,18 @@ export default (
|
|||||||
* @edit direct dom ref
|
* @edit direct dom ref
|
||||||
*/
|
*/
|
||||||
nodeData.ref = node
|
nodeData.ref = node
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @edit make sure attributes exist for interactive candidates.
|
||||||
|
* @note if the element failed the isInteractiveCandidate, attributes would be empty.
|
||||||
|
*/
|
||||||
|
if (nodeData.isInteractive && Object.keys(nodeData.attributes).length === 0) {
|
||||||
|
const attributeNames = node.getAttributeNames?.() || []
|
||||||
|
for (const name of attributeNames) {
|
||||||
|
const value = node.getAttribute(name)
|
||||||
|
nodeData.attributes[name] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import { VIEWPORT_EXPANSION } from '../constants'
|
|
||||||
import domTree from './dom_tree/index.js'
|
import domTree from './dom_tree/index.js'
|
||||||
import {
|
import {
|
||||||
ElementDomNode,
|
ElementDomNode,
|
||||||
@@ -7,7 +6,23 @@ import {
|
|||||||
TextDomNode,
|
TextDomNode,
|
||||||
} from './dom_tree/type'
|
} from './dom_tree/type'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Viewport expansion for DOM tree extraction.
|
||||||
|
* -1 means full page (no viewport restriction)
|
||||||
|
* 0 means viewport only
|
||||||
|
* positive values expand the viewport by that many pixels
|
||||||
|
*
|
||||||
|
* @note Since isTopElement depends on elementFromPoint,
|
||||||
|
* it returns null when out of viewport, this feature has no practical use, only differ between -1 and 0
|
||||||
|
*/
|
||||||
|
const DEFAULT_VIEWPORT_EXPANSION = -1
|
||||||
|
|
||||||
|
export function resolveViewportExpansion(viewportExpansion?: number): number {
|
||||||
|
return viewportExpansion ?? DEFAULT_VIEWPORT_EXPANSION
|
||||||
|
}
|
||||||
|
|
||||||
export interface DomConfig {
|
export interface DomConfig {
|
||||||
|
viewportExpansion?: number
|
||||||
interactiveBlacklist?: (Element | (() => Element))[]
|
interactiveBlacklist?: (Element | (() => Element))[]
|
||||||
interactiveWhitelist?: (Element | (() => Element))[]
|
interactiveWhitelist?: (Element | (() => Element))[]
|
||||||
includeAttributes?: string[]
|
includeAttributes?: string[]
|
||||||
@@ -21,6 +36,8 @@ export interface DomConfig {
|
|||||||
const newElementsCache = new WeakMap<HTMLElement, string>()
|
const newElementsCache = new WeakMap<HTMLElement, string>()
|
||||||
|
|
||||||
export function getFlatTree(config: DomConfig): FlatDomTree {
|
export function getFlatTree(config: DomConfig): FlatDomTree {
|
||||||
|
const viewportExpansion = resolveViewportExpansion(config.viewportExpansion)
|
||||||
|
|
||||||
const interactiveBlacklist = [] as Element[]
|
const interactiveBlacklist = [] as Element[]
|
||||||
for (const item of config.interactiveBlacklist || []) {
|
for (const item of config.interactiveBlacklist || []) {
|
||||||
if (typeof item === 'function') {
|
if (typeof item === 'function') {
|
||||||
@@ -43,7 +60,7 @@ export function getFlatTree(config: DomConfig): FlatDomTree {
|
|||||||
doHighlightElements: true,
|
doHighlightElements: true,
|
||||||
debugMode: true,
|
debugMode: true,
|
||||||
focusHighlightIndex: -1,
|
focusHighlightIndex: -1,
|
||||||
viewportExpansion: VIEWPORT_EXPANSION,
|
viewportExpansion,
|
||||||
interactiveBlacklist,
|
interactiveBlacklist,
|
||||||
interactiveWhitelist,
|
interactiveWhitelist,
|
||||||
highlightOpacity: config.highlightOpacity ?? 0.0,
|
highlightOpacity: config.highlightOpacity ?? 0.0,
|
||||||
@@ -74,6 +91,43 @@ export function getFlatTree(config: DomConfig): FlatDomTree {
|
|||||||
return elements
|
return elements
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const globRegexCache = new Map<string, RegExp>()
|
||||||
|
|
||||||
|
function globToRegex(pattern: string): RegExp {
|
||||||
|
let regex = globRegexCache.get(pattern)
|
||||||
|
if (!regex) {
|
||||||
|
const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&')
|
||||||
|
regex = new RegExp(`^${escaped.replace(/\*/g, '.*')}$`)
|
||||||
|
globRegexCache.set(pattern, regex)
|
||||||
|
}
|
||||||
|
return regex
|
||||||
|
}
|
||||||
|
|
||||||
|
function matchAttributes(
|
||||||
|
attrs: Record<string, string>,
|
||||||
|
patterns: string[]
|
||||||
|
): Record<string, string> {
|
||||||
|
const result: Record<string, string> = {}
|
||||||
|
|
||||||
|
for (const pattern of patterns) {
|
||||||
|
if (pattern.includes('*')) {
|
||||||
|
const regex = globToRegex(pattern)
|
||||||
|
for (const key of Object.keys(attrs)) {
|
||||||
|
if (regex.test(key) && attrs[key].trim()) {
|
||||||
|
result[key] = attrs[key].trim()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const value = attrs[pattern]
|
||||||
|
if (value && value.trim()) {
|
||||||
|
result[pattern] = value.trim()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* elementsToString 内部使用的类型
|
* elementsToString 内部使用的类型
|
||||||
*/
|
*/
|
||||||
@@ -140,10 +194,13 @@ export function flatTreeToString(flatTree: FlatDomTree, includeAttributes?: stri
|
|||||||
// for jump check
|
// for jump check
|
||||||
'target',
|
'target',
|
||||||
|
|
||||||
// absolute 定位的下拉菜单
|
// absolute position dropdown menu
|
||||||
'aria-haspopup',
|
'aria-haspopup',
|
||||||
'aria-controls',
|
'aria-controls',
|
||||||
'aria-owns',
|
'aria-owns',
|
||||||
|
|
||||||
|
// content editable
|
||||||
|
'contenteditable',
|
||||||
]
|
]
|
||||||
|
|
||||||
const includeAttrs = [...(includeAttributes || []), ...DEFAULT_INCLUDE_ATTRIBUTES]
|
const includeAttrs = [...(includeAttributes || []), ...DEFAULT_INCLUDE_ATTRIBUTES]
|
||||||
@@ -245,23 +302,15 @@ export function flatTreeToString(flatTree: FlatDomTree, includeAttributes?: stri
|
|||||||
let attributesHtmlStr = ''
|
let attributesHtmlStr = ''
|
||||||
|
|
||||||
if (includeAttrs.length > 0 && node.attributes) {
|
if (includeAttrs.length > 0 && node.attributes) {
|
||||||
const attributesToInclude: Record<string, string> = {}
|
const attributesToInclude = matchAttributes(node.attributes, includeAttrs)
|
||||||
|
|
||||||
// Filter attributes
|
|
||||||
for (const key of includeAttrs) {
|
|
||||||
const value = node.attributes[key]
|
|
||||||
if (value && value.trim() !== '') {
|
|
||||||
attributesToInclude[key] = value.trim()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove duplicate values (for attributes longer than 5 chars)
|
// Remove duplicate values (for attributes longer than 5 chars)
|
||||||
const orderedKeys = includeAttrs.filter((key) => key in attributesToInclude)
|
const keys = Object.keys(attributesToInclude)
|
||||||
if (orderedKeys.length > 1) {
|
if (keys.length > 1) {
|
||||||
const keysToRemove = new Set<string>()
|
const keysToRemove = new Set<string>()
|
||||||
const seenValues: Record<string, string> = {}
|
const seenValues: Record<string, string> = {}
|
||||||
|
|
||||||
for (const key of orderedKeys) {
|
for (const key of keys) {
|
||||||
const value = attributesToInclude[key]
|
const value = attributesToInclude[key]
|
||||||
if (value.length > 5) {
|
if (value.length > 5) {
|
||||||
if (value in seenValues) {
|
if (value in seenValues) {
|
||||||
|
|||||||
@@ -7,3 +7,7 @@
|
|||||||
|
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.wrapper.visible {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ export class SimulatorMask {
|
|||||||
this.motion?.start()
|
this.motion?.start()
|
||||||
this.motion?.fadeIn()
|
this.motion?.fadeIn()
|
||||||
|
|
||||||
this.wrapper.style.display = 'block'
|
this.wrapper.classList.add(styles.visible)
|
||||||
|
|
||||||
// Initialize cursor position
|
// Initialize cursor position
|
||||||
this.#currentCursorX = window.innerWidth / 2
|
this.#currentCursorX = window.innerWidth / 2
|
||||||
@@ -172,7 +172,7 @@ export class SimulatorMask {
|
|||||||
this.#cursor.classList.remove(cursorStyles.clicking)
|
this.#cursor.classList.remove(cursorStyles.clicking)
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.wrapper.style.display = 'none'
|
this.wrapper.classList.remove(styles.visible)
|
||||||
}, 800) // Match the animation duration
|
}, 800) // Match the animation duration
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@page-agent/ui",
|
"name": "@page-agent/ui",
|
||||||
"version": "1.5.3",
|
"version": "1.5.8",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/lib/page-agent-ui.js",
|
"main": "./dist/lib/page-agent-ui.js",
|
||||||
"module": "./dist/lib/page-agent-ui.js",
|
"module": "./dist/lib/page-agent-ui.js",
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ interface CardOptions {
|
|||||||
export function createCard({ icon, content, meta, type }: CardOptions): string {
|
export function createCard({ icon, content, meta, type }: CardOptions): string {
|
||||||
const typeClass = type ? styles[type] : ''
|
const typeClass = type ? styles[type] : ''
|
||||||
const contentHtml = Array.isArray(content)
|
const contentHtml = Array.isArray(content)
|
||||||
? `<div class="${styles.reflectionLines}">${content.join('')}</div>`
|
? `<div class="${styles.reflectionLines}">${content.map((line) => `<span>${escapeHtml(line)}</span>`).join('')}</div>`
|
||||||
: `<span>${escapeHtml(content)}</span>`
|
: `<span>${escapeHtml(content)}</span>`
|
||||||
|
|
||||||
return `
|
return `
|
||||||
@@ -40,13 +40,13 @@ export function createReflectionLines(reflection: {
|
|||||||
}): string[] {
|
}): string[] {
|
||||||
const lines: string[] = []
|
const lines: string[] = []
|
||||||
if (reflection.evaluation_previous_goal) {
|
if (reflection.evaluation_previous_goal) {
|
||||||
lines.push(`<div>🔍 ${escapeHtml(reflection.evaluation_previous_goal)}</div>`)
|
lines.push(`🔍 ${reflection.evaluation_previous_goal}`)
|
||||||
}
|
}
|
||||||
if (reflection.memory) {
|
if (reflection.memory) {
|
||||||
lines.push(`<div>💾 ${escapeHtml(reflection.memory)}</div>`)
|
lines.push(`💾 ${reflection.memory}`)
|
||||||
}
|
}
|
||||||
if (reflection.next_goal) {
|
if (reflection.next_goal) {
|
||||||
lines.push(`<div>🎯 ${escapeHtml(reflection.next_goal)}</div>`)
|
lines.push(`🎯 ${reflection.next_goal}`)
|
||||||
}
|
}
|
||||||
return lines
|
return lines
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@page-agent/website",
|
"name": "@page-agent/website",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.5.3",
|
"version": "1.5.8",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite --host 0.0.0.0",
|
"dev": "vite --host 0.0.0.0",
|
||||||
@@ -19,13 +19,13 @@
|
|||||||
"@types/react-dom": "^19.2.1",
|
"@types/react-dom": "^19.2.1",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"lucide-react": "^0.576.0",
|
"lucide-react": "^0.577.0",
|
||||||
"motion": "^12.34.5",
|
"motion": "^12.35.2",
|
||||||
"next-themes": "^0.4.6",
|
"next-themes": "^0.4.6",
|
||||||
"react": "^19.2.4",
|
"react": "^19.2.4",
|
||||||
"react-dom": "^19.2.4",
|
"react-dom": "^19.2.4",
|
||||||
"rough-notation": "^0.5.1",
|
"rough-notation": "^0.5.1",
|
||||||
"simple-icons": "^16.10.0",
|
"simple-icons": "^16.11.0",
|
||||||
"sonner": "^2.0.7",
|
"sonner": "^2.0.7",
|
||||||
"tailwind-merge": "^3.5.0",
|
"tailwind-merge": "^3.5.0",
|
||||||
"tailwindcss": "^4.1.14",
|
"tailwindcss": "^4.1.14",
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
User-agent: *
|
||||||
|
Allow: /
|
||||||
|
|
||||||
|
Sitemap: https://alibaba.github.io/page-agent/sitemap.xml
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import { siGithub } from 'simple-icons'
|
import { siGithub, siX } from 'simple-icons'
|
||||||
|
|
||||||
import { useLanguage } from '@/i18n/context'
|
import { useLanguage } from '@/i18n/context'
|
||||||
|
|
||||||
@@ -12,9 +12,21 @@ export default function Footer() {
|
|||||||
>
|
>
|
||||||
<div className="max-w-7xl mx-auto px-6 py-6">
|
<div className="max-w-7xl mx-auto px-6 py-6">
|
||||||
<div className="flex flex-col md:flex-row justify-between items-center space-y-4 md:space-y-0">
|
<div className="flex flex-col md:flex-row justify-between items-center space-y-4 md:space-y-0">
|
||||||
<p className="text-gray-600 dark:text-gray-300 text-sm">
|
<div className="text-gray-600 dark:text-gray-300 text-sm text-center md:text-left">
|
||||||
© 2026 page-agent. All rights reserved.
|
<p>© 2026 page-agent. All rights reserved.</p>
|
||||||
</p>
|
<p>
|
||||||
|
Built with ♥️ by{' '}
|
||||||
|
<a
|
||||||
|
href="https://x.com/simonluvramen"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="hover:text-gray-900 dark:hover:text-white transition-colors duration-200"
|
||||||
|
>
|
||||||
|
Simon
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="flex items-center space-x-6">
|
<div className="flex items-center space-x-6">
|
||||||
<a
|
<a
|
||||||
href="https://github.com/alibaba/page-agent/blob/main/docs/terms-and-privacy.md"
|
href="https://github.com/alibaba/page-agent/blob/main/docs/terms-and-privacy.md"
|
||||||
@@ -24,6 +36,22 @@ export default function Footer() {
|
|||||||
>
|
>
|
||||||
{isZh ? '使用条款与隐私' : 'Terms & Privacy'}
|
{isZh ? '使用条款与隐私' : 'Terms & Privacy'}
|
||||||
</a>
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://x.com/simonluvramen"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white transition-colors duration-200"
|
||||||
|
aria-label="X (Twitter)"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
role="img"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
className="w-4 h-4 fill-current"
|
||||||
|
aria-hidden="true"
|
||||||
|
>
|
||||||
|
<path d={siX.path} />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
<a
|
<a
|
||||||
href="https://github.com/alibaba/page-agent"
|
href="https://github.com/alibaba/page-agent"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { useState } from 'react'
|
|||||||
import { siGithub } from 'simple-icons'
|
import { siGithub } from 'simple-icons'
|
||||||
import { Link } from 'wouter'
|
import { Link } from 'wouter'
|
||||||
|
|
||||||
|
import { formatStars, useGitHubStars } from '@/hooks/useGitHubStars'
|
||||||
import { useLanguage } from '@/i18n/context'
|
import { useLanguage } from '@/i18n/context'
|
||||||
|
|
||||||
import LanguageSwitcher from './LanguageSwitcher'
|
import LanguageSwitcher from './LanguageSwitcher'
|
||||||
@@ -12,6 +13,7 @@ import { HyperText } from './ui/hyper-text'
|
|||||||
export default function Header() {
|
export default function Header() {
|
||||||
const { isZh } = useLanguage()
|
const { isZh } = useLanguage()
|
||||||
const [mobileMenuOpen, setMobileMenuOpen] = useState(false)
|
const [mobileMenuOpen, setMobileMenuOpen] = useState(false)
|
||||||
|
const stars = useGitHubStars()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -34,8 +36,11 @@ export default function Header() {
|
|||||||
className="w-10 h-10 rounded-xl group-hover:scale-110 transition-transform duration-200"
|
className="w-10 h-10 rounded-xl group-hover:scale-110 transition-transform duration-200"
|
||||||
/>
|
/>
|
||||||
<div>
|
<div>
|
||||||
<span className="text-base sm:text-xl font-bold text-gray-900 dark:text-white block leading-tight">
|
<span className="text-base sm:text-xl font-bold text-gray-900 dark:text-white leading-tight flex items-baseline gap-1.5">
|
||||||
page-agent
|
page-agent
|
||||||
|
<span className="hidden sm:inline text-[10px] font-mono font-normal text-gray-400 dark:text-gray-500 tabular-nums before:content-['v']">
|
||||||
|
{import.meta.env.VERSION}
|
||||||
|
</span>
|
||||||
</span>
|
</span>
|
||||||
<HyperText
|
<HyperText
|
||||||
as="p"
|
as="p"
|
||||||
@@ -66,7 +71,7 @@ export default function Header() {
|
|||||||
href="https://github.com/alibaba/page-agent"
|
href="https://github.com/alibaba/page-agent"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
className="p-2 rounded-lg text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 hover:text-blue-600 dark:hover:text-blue-400 transition-colors duration-200 shrink-0"
|
className="flex items-center gap-1 p-2 rounded-lg text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 hover:text-blue-600 dark:hover:text-blue-400 transition-colors duration-200 shrink-0"
|
||||||
aria-label="GitHub"
|
aria-label="GitHub"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
@@ -77,6 +82,9 @@ export default function Header() {
|
|||||||
>
|
>
|
||||||
<path d={siGithub.path} />
|
<path d={siGithub.path} />
|
||||||
</svg>
|
</svg>
|
||||||
|
{stars !== null && (
|
||||||
|
<span className="text-sm tabular-nums">★ {formatStars(stars)}</span>
|
||||||
|
)}
|
||||||
</a>
|
</a>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
@@ -86,9 +94,6 @@ export default function Header() {
|
|||||||
role="navigation"
|
role="navigation"
|
||||||
aria-label={isZh ? '文档' : 'Docs'}
|
aria-label={isZh ? '文档' : 'Docs'}
|
||||||
>
|
>
|
||||||
<span className="text-xs font-mono text-gray-400 dark:text-gray-500 tabular-nums before:content-['v']">
|
|
||||||
{import.meta.env.VERSION}
|
|
||||||
</span>
|
|
||||||
<Link
|
<Link
|
||||||
href="/docs/introduction/overview"
|
href="/docs/introduction/overview"
|
||||||
className="flex items-center gap-1.5 text-gray-600 dark:text-gray-300 hover:text-blue-600 dark:hover:text-blue-400 transition-colors duration-200"
|
className="flex items-center gap-1.5 text-gray-600 dark:text-gray-300 hover:text-blue-600 dark:hover:text-blue-400 transition-colors duration-200"
|
||||||
@@ -112,6 +117,9 @@ export default function Header() {
|
|||||||
<path d={siGithub.path} />
|
<path d={siGithub.path} />
|
||||||
</svg>
|
</svg>
|
||||||
GitHub
|
GitHub
|
||||||
|
{stars !== null && (
|
||||||
|
<span className="text-sm font-medium tabular-nums ">★ {formatStars(stars)}</span>
|
||||||
|
)}
|
||||||
</a>
|
</a>
|
||||||
<ThemeSwitcher />
|
<ThemeSwitcher />
|
||||||
<LanguageSwitcher />
|
<LanguageSwitcher />
|
||||||
@@ -161,6 +169,11 @@ export default function Header() {
|
|||||||
<path d={siGithub.path} />
|
<path d={siGithub.path} />
|
||||||
</svg>
|
</svg>
|
||||||
GitHub
|
GitHub
|
||||||
|
{stars !== null && (
|
||||||
|
<span className="text-xs tabular-nums text-gray-400 dark:text-gray-500">
|
||||||
|
★ {formatStars(stars)}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
</a>
|
</a>
|
||||||
<div className="flex items-center gap-3 px-3 py-2">
|
<div className="flex items-center gap-3 px-3 py-2">
|
||||||
<ThemeSwitcher />
|
<ThemeSwitcher />
|
||||||
|
|||||||
@@ -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.5.3/dist/iife/page-agent.demo.js'
|
'https://cdn.jsdelivr.net/npm/page-agent@1.5.8/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.5.3/files/dist/iife/page-agent.demo.js'
|
'https://registry.npmmirror.com/page-agent/1.5.8/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'
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
import { useEffect, useState } from 'react'
|
||||||
|
|
||||||
|
const STATS_URL = 'https://page-agent.github.io/gh-stats/stats.json'
|
||||||
|
|
||||||
|
let cached: number | null = null
|
||||||
|
|
||||||
|
export function useGitHubStars() {
|
||||||
|
const [stars, setStars] = useState(cached)
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (cached !== null) return
|
||||||
|
fetch(STATS_URL)
|
||||||
|
.then((r) => r.json())
|
||||||
|
.then((data) => {
|
||||||
|
cached = data.stargazers_count ?? null
|
||||||
|
setStars(cached)
|
||||||
|
})
|
||||||
|
.catch(() => {})
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
return stars
|
||||||
|
}
|
||||||
|
|
||||||
|
export function formatStars(n: number): string {
|
||||||
|
if (n >= 1000) return `${(n / 1000).toFixed(1).replace(/\.0$/, '')}k`
|
||||||
|
return String(n)
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
@import 'tailwindcss';
|
@import 'tailwindcss' important;
|
||||||
@import 'tw-animate-css';
|
@import 'tw-animate-css';
|
||||||
|
|
||||||
@custom-variant dark (&:is(.dark *));
|
@custom-variant dark (&:is(.dark *));
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import { useEffect } from 'react'
|
||||||
|
|
||||||
|
const DEFAULT_TITLE = 'PageAgent - The GUI Agent Living in Your Webpage'
|
||||||
|
|
||||||
|
export function useDocumentTitle(title?: string) {
|
||||||
|
useEffect(() => {
|
||||||
|
document.title = title ? `${title} - PageAgent` : DEFAULT_TITLE
|
||||||
|
}, [title])
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ import { Link, useLocation } from 'wouter'
|
|||||||
|
|
||||||
import { SparklesText } from '@/components/ui/sparkles-text'
|
import { SparklesText } from '@/components/ui/sparkles-text'
|
||||||
import { useLanguage } from '@/i18n/context'
|
import { useLanguage } from '@/i18n/context'
|
||||||
|
import { useDocumentTitle } from '@/lib/useDocumentTitle'
|
||||||
|
|
||||||
interface DocsLayoutProps {
|
interface DocsLayoutProps {
|
||||||
children: ReactNode
|
children: ReactNode
|
||||||
@@ -65,6 +66,12 @@ export default function DocsLayout({ children }: DocsLayoutProps) {
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
const activeTitle = navigationSections
|
||||||
|
.flatMap((s) => s.items)
|
||||||
|
.find((item) => item.path === location)?.title
|
||||||
|
|
||||||
|
useDocumentTitle(activeTitle)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="max-w-7xl mx-auto px-6 py-8 overflow-x-auto">
|
<div className="max-w-7xl mx-auto px-6 py-8 overflow-x-auto">
|
||||||
<div className="flex gap-8 min-w-225">
|
<div className="flex gap-8 min-w-225">
|
||||||
|
|||||||
@@ -105,8 +105,8 @@ const agent = new PageAgentCore({
|
|||||||
name: 'includeAttributes',
|
name: 'includeAttributes',
|
||||||
type: 'string[]',
|
type: 'string[]',
|
||||||
description: isZh
|
description: isZh
|
||||||
? '在 DOM 提取中包含的额外 HTML 属性(如 data-testid)。默认已包含常见属性如 role, aria-label 等。'
|
? '在 DOM 提取中包含的额外 HTML 属性。支持通配符 *(如 data-* 匹配所有 data- 开头的属性)。默认已包含常见属性如 role, aria-label 等。'
|
||||||
: 'Additional HTML attributes to include in DOM extraction (e.g. data-testid). Common attributes like role, aria-label are included by default.',
|
: 'Additional HTML attributes to include in DOM extraction. Supports wildcard * (e.g. data-* matches all data- prefixed attributes). Common attributes like role, aria-label are included by default.',
|
||||||
},
|
},
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ const MODEL_GROUPS: Record<string, string[]> = {
|
|||||||
'qwen-3-plus',
|
'qwen-3-plus',
|
||||||
'qwen3:14b (ollama)',
|
'qwen3:14b (ollama)',
|
||||||
],
|
],
|
||||||
OpenAI: ['gpt-5.2', 'gpt-5.1', 'gpt-5', 'gpt-5-mini', 'gpt-4.1', 'gpt-4.1-mini'],
|
OpenAI: ['gpt-5.4', 'gpt-5.2', 'gpt-5.1', 'gpt-5', 'gpt-5-mini', 'gpt-4.1', 'gpt-4.1-mini'],
|
||||||
DeepSeek: ['deepseek-3.2'],
|
DeepSeek: ['deepseek-3.2'],
|
||||||
Google: ['gemini-3-pro', 'gemini-3-flash', 'gemini-2.5'],
|
Google: ['gemini-3-pro', 'gemini-3-flash', 'gemini-2.5'],
|
||||||
Anthropic: [
|
Anthropic: [
|
||||||
@@ -68,11 +68,6 @@ export default function Models() {
|
|||||||
<Heading id="tested-models" className="text-2xl font-semibold mb-3">
|
<Heading id="tested-models" className="text-2xl font-semibold mb-3">
|
||||||
{isZh ? '已测试模型' : 'Tested Models'}
|
{isZh ? '已测试模型' : 'Tested Models'}
|
||||||
</Heading>
|
</Heading>
|
||||||
<p className="text-sm text-gray-600 dark:text-gray-400 mb-4">
|
|
||||||
{isZh
|
|
||||||
? '推荐使用 ToolCall 能力强的轻量级模型。'
|
|
||||||
: 'Recommended: Fast, lightweight models with strong ToolCall capabilities.'}
|
|
||||||
</p>
|
|
||||||
<div className="bg-linear-to-br from-emerald-50 to-cyan-50 dark:from-emerald-950/30 dark:to-cyan-950/30 rounded-xl p-6 border border-emerald-200/50 dark:border-emerald-800/50">
|
<div className="bg-linear-to-br from-emerald-50 to-cyan-50 dark:from-emerald-950/30 dark:to-cyan-950/30 rounded-xl p-6 border border-emerald-200/50 dark:border-emerald-800/50">
|
||||||
<div className="grid grid-cols-[5rem_1fr] gap-x-3 gap-y-3 items-start">
|
<div className="grid grid-cols-[5rem_1fr] gap-x-3 gap-y-3 items-start">
|
||||||
{Object.entries(MODEL_GROUPS).map(([brand, models]) => (
|
{Object.entries(MODEL_GROUPS).map(([brand, models]) => (
|
||||||
@@ -96,6 +91,11 @@ export default function Models() {
|
|||||||
<h2 className="text-2xl font-semibold mb-4">{isZh ? '提示' : 'Tips'}</h2>
|
<h2 className="text-2xl font-semibold mb-4">{isZh ? '提示' : 'Tips'}</h2>
|
||||||
<div className="p-4 bg-blue-50 dark:bg-blue-950/20 rounded-lg border border-blue-200 dark:border-blue-800">
|
<div className="p-4 bg-blue-50 dark:bg-blue-950/20 rounded-lg border border-blue-200 dark:border-blue-800">
|
||||||
<ul className="text-sm text-gray-700 dark:text-gray-300 space-y-2 list-disc pl-5">
|
<ul className="text-sm text-gray-700 dark:text-gray-300 space-y-2 list-disc pl-5">
|
||||||
|
<li>
|
||||||
|
{isZh
|
||||||
|
? '⭐ 推荐使用 ToolCall 能力强的轻量级模型'
|
||||||
|
: '⭐ Recommended: Fast, lightweight models with strong ToolCall capabilities'}
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
{isZh
|
{isZh
|
||||||
? 'ToolCall 能力较弱的模型可能返回错误的格式,常见错误能够自动恢复,建议设置较高的 temperature'
|
? 'ToolCall 能力较弱的模型可能返回错误的格式,常见错误能够自动恢复,建议设置较高的 temperature'
|
||||||
@@ -110,39 +110,6 @@ export default function Models() {
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
{/* Security Section */}
|
|
||||||
<section className="mb-10">
|
|
||||||
<h2 className="text-2xl font-semibold mb-4">
|
|
||||||
{isZh ? '🔐 生产环境鉴权建议' : '🔐 Production Authentication'}
|
|
||||||
</h2>
|
|
||||||
<div className="bg-yellow-50 dark:bg-yellow-950/20 border-l-4 border-yellow-500 p-5 rounded-r-lg mb-4">
|
|
||||||
<p className="text-sm font-semibold text-yellow-900 dark:text-yellow-200">
|
|
||||||
{isZh
|
|
||||||
? '⚠️ 永远不要把真实的 LLM API Key 发布到前端代码'
|
|
||||||
: '⚠️ Never commit real LLM API Keys to your frontend code'}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div className="bg-gray-50 dark:bg-gray-900/30 rounded-lg p-5 border border-gray-200 dark:border-gray-800">
|
|
||||||
<h3 className="font-semibold text-gray-900 dark:text-gray-100 mb-2">
|
|
||||||
{isZh ? '后端代理转发' : 'Backend Proxy Pattern'}
|
|
||||||
</h3>
|
|
||||||
<p className="text-sm text-gray-600 dark:text-gray-400 mb-3">
|
|
||||||
{isZh
|
|
||||||
? '在后端搭建一个 LLM 流量转发接口,该接口使用与你网站上其他接口相同的鉴权方式,例如:'
|
|
||||||
: 'Set up a backend LLM proxy endpoint that uses the same authentication method as other APIs in your website, such as:'}
|
|
||||||
</p>
|
|
||||||
<ul className="text-sm text-gray-600 dark:text-gray-400 space-y-1">
|
|
||||||
<li>{isZh ? '• Session/Cookie 会话认证' : '• Session/Cookie-based authentication'}</li>
|
|
||||||
<li>
|
|
||||||
{isZh ? '• OIDC (OpenID Connect) 单点登录' : '• OIDC (OpenID Connect) single sign-on'}
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
{isZh ? '• 临时 Access Key 或 JWT Token' : '• Temporary Access Key or JWT Token'}
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* Configuration Section */}
|
{/* Configuration Section */}
|
||||||
<section className="mb-10">
|
<section className="mb-10">
|
||||||
<Heading id="configuration">{isZh ? '配置方式' : 'Configuration'}</Heading>
|
<Heading id="configuration">{isZh ? '配置方式' : 'Configuration'}</Heading>
|
||||||
@@ -170,9 +137,24 @@ const pageAgent = new PageAgent({
|
|||||||
<Heading id="free-testing-api">{isZh ? '免费测试接口' : 'Free Testing API'}</Heading>
|
<Heading id="free-testing-api">{isZh ? '免费测试接口' : 'Free Testing API'}</Heading>
|
||||||
<p className="text-sm text-gray-600 dark:text-gray-400 mb-4">
|
<p className="text-sm text-gray-600 dark:text-gray-400 mb-4">
|
||||||
{isZh
|
{isZh
|
||||||
? '以下免费测试接口仅供 PageAgent.js 和 PageAgent Extension 的技术评估使用。有速率限制,可能随时变更。请勿用于生产环境。'
|
? '以下免费测试接口仅供 PageAgent.js 和 PageAgent Extension 的技术评估和测试使用。'
|
||||||
: 'The following free testing endpoints are provided for technical evaluation of PageAgent.js and PageAgent Extension only. Rate-limited, subject to change. Not for production use.'}
|
: 'The following free testing endpoint is provided for testing and technical evaluation.'}
|
||||||
</p>
|
</p>
|
||||||
|
<div className="my-4 p-4 bg-amber-50 dark:bg-amber-950/20 rounded-lg border border-amber-200 dark:border-amber-800">
|
||||||
|
<p className="text-xs text-gray-600 dark:text-gray-400">
|
||||||
|
{isZh
|
||||||
|
? '⚠️ 仅供技术评估和研发用途,禁止用于生产环境。数据通过中国大陆服务器处理。请勿输入任何个人身份信息或敏感数据。使用即表示您同意'
|
||||||
|
: '⚠️ Strictly for technical evaluation and R&D only. Data is processed via servers in Mainland China. Do not input any PII or sensitive data. By using this API you agree to the'}{' '}
|
||||||
|
<a
|
||||||
|
href="https://github.com/alibaba/page-agent/blob/main/docs/terms-and-privacy.md#2-testing-api-and-demo-disclaimer--terms-of-use"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="text-blue-500 hover:underline"
|
||||||
|
>
|
||||||
|
{isZh ? '使用条款' : 'Terms of Use'}
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
<div className="bg-gray-50 dark:bg-gray-900/30 rounded-lg p-5 border border-gray-200 dark:border-gray-800">
|
<div className="bg-gray-50 dark:bg-gray-900/30 rounded-lg p-5 border border-gray-200 dark:border-gray-800">
|
||||||
<h3 className="font-semibold text-gray-900 dark:text-gray-100 mb-2">
|
<h3 className="font-semibold text-gray-900 dark:text-gray-100 mb-2">
|
||||||
Qwen (Alibaba Cloud China)
|
Qwen (Alibaba Cloud China)
|
||||||
@@ -198,21 +180,6 @@ LLM_MODEL_NAME="qwen3.5-plus"
|
|||||||
LLM_API_KEY="NA"`}
|
LLM_API_KEY="NA"`}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-4 p-4 bg-amber-50 dark:bg-amber-950/20 rounded-lg border border-amber-200 dark:border-amber-800">
|
|
||||||
<p className="text-xs text-gray-600 dark:text-gray-400">
|
|
||||||
{isZh
|
|
||||||
? '⚠️ 仅供技术评估和研发用途,禁止用于生产环境。数据通过中国大陆服务器处理。请勿输入任何个人身份信息或敏感数据。使用即表示您同意'
|
|
||||||
: '⚠️ Strictly for technical evaluation and R&D only. Data is processed via servers in Mainland China. Do not input any PII or sensitive data. By using this API you agree to the'}{' '}
|
|
||||||
<a
|
|
||||||
href="https://github.com/alibaba/page-agent/blob/main/docs/terms-and-privacy.md#2-testing-api-and-demo-disclaimer--terms-of-use"
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
className="text-blue-500 hover:underline"
|
|
||||||
>
|
|
||||||
{isZh ? '使用条款' : 'Terms of Use'}
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
{/* Ollama Section */}
|
{/* Ollama Section */}
|
||||||
@@ -277,6 +244,48 @@ LLM_MODEL_NAME="qwen3:14b"`}
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
{/* Production Authentication */}
|
||||||
|
<section className="mb-10">
|
||||||
|
<Heading id="production-authentication" className="text-2xl font-semibold mb-4">
|
||||||
|
{isZh ? '🔐 生产环境鉴权' : '🔐 Production Authentication'}
|
||||||
|
</Heading>
|
||||||
|
<p className="text-sm text-gray-600 dark:text-gray-400 mb-3">
|
||||||
|
{isZh
|
||||||
|
? '如果你只是将它用作个人助手,可以直接连接你的 LLM 服务。'
|
||||||
|
: 'If you only use it as a personal assistant, you can connect to your LLM service directly.'}
|
||||||
|
</p>
|
||||||
|
<p className="text-sm text-gray-600 dark:text-gray-400 mb-3">
|
||||||
|
{isZh ? (
|
||||||
|
<>
|
||||||
|
如果你计划将它集成到你的 Web 应用中,建议搭建一个后端代理来转发 LLM 请求,并使用{' '}
|
||||||
|
<code>customFetch</code> 携带 Cookie 或其他鉴权信息:
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
If you plan to integrate it into your web app, it's better to have a backend proxy for
|
||||||
|
the LLM and use <code>customFetch</code> to authenticate the request with cookies or
|
||||||
|
other methods:
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</p>
|
||||||
|
<CodeEditor
|
||||||
|
code={`const agent = new PageAgent({
|
||||||
|
baseURL: '/api/llm-proxy',
|
||||||
|
apiKey: 'NA',
|
||||||
|
model: 'gpt-5.1',
|
||||||
|
customFetch: (url, init) =>
|
||||||
|
fetch(url, { ...init, credentials: 'include' }),
|
||||||
|
});`}
|
||||||
|
/>
|
||||||
|
<div className="mt-4 bg-yellow-50 dark:bg-yellow-950/20 border-l-4 border-yellow-500 p-4 rounded-r-lg">
|
||||||
|
<p className="text-sm font-semibold text-yellow-900 dark:text-yellow-200">
|
||||||
|
{isZh
|
||||||
|
? '⚠️ 永远不要把真实的 LLM API Key 提交到前端代码中'
|
||||||
|
: '⚠️ NEVER commit real LLM API keys to your frontend code'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,6 +116,9 @@ export default function LimitationsPage() {
|
|||||||
isZh ? '键盘快捷键' : 'Keyboard shortcuts',
|
isZh ? '键盘快捷键' : 'Keyboard shortcuts',
|
||||||
isZh ? '坐标定位操作' : 'Position-based control',
|
isZh ? '坐标定位操作' : 'Position-based control',
|
||||||
isZh ? '绘图操作' : 'Drawing',
|
isZh ? '绘图操作' : 'Drawing',
|
||||||
|
isZh
|
||||||
|
? 'Monaco、CodeMirror 等需要通过 JS 实例控制的编辑器'
|
||||||
|
: 'Monaco, CodeMirror and other editors that require JS instance access',
|
||||||
].map((text) => (
|
].map((text) => (
|
||||||
<li key={text} className="flex items-center text-gray-700 dark:text-gray-300">
|
<li key={text} className="flex items-center text-gray-700 dark:text-gray-300">
|
||||||
<span className="mr-2 text-red-600 dark:text-red-400">✗</span>
|
<span className="mr-2 text-red-600 dark:text-red-400">✗</span>
|
||||||
@@ -128,8 +131,8 @@ export default function LimitationsPage() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Understanding Limitations */}
|
{/* Understanding Limitations */}
|
||||||
<Heading id="understanding" className="text-2xl font-bold mb-3 mt-6">
|
<Heading id="text-based-approach" className="text-2xl font-bold mb-3 mt-6">
|
||||||
{isZh ? '理解能力' : 'Understanding'}
|
{isZh ? '基于文本的方案' : 'Text-Based Approach'}
|
||||||
</Heading>
|
</Heading>
|
||||||
|
|
||||||
<p className="mb-2 font-medium">
|
<p className="mb-2 font-medium">
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import { Suspense, lazy } from 'react'
|
import { Suspense, lazy } from 'react'
|
||||||
|
|
||||||
|
import { useDocumentTitle } from '@/lib/useDocumentTitle'
|
||||||
|
|
||||||
import HeroSection from './HeroSection'
|
import HeroSection from './HeroSection'
|
||||||
|
|
||||||
const FeaturesSection = lazy(() => import('./FeaturesSection'))
|
const FeaturesSection = lazy(() => import('./FeaturesSection'))
|
||||||
@@ -7,6 +9,8 @@ const ScenariosSection = lazy(() => import('./ScenariosSection'))
|
|||||||
const OneMoreThingSection = lazy(() => import('./OneMoreThingSection'))
|
const OneMoreThingSection = lazy(() => import('./OneMoreThingSection'))
|
||||||
|
|
||||||
export default function HomePage() {
|
export default function HomePage() {
|
||||||
|
useDocumentTitle()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<HeroSection />
|
<HeroSection />
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import tailwindcss from '@tailwindcss/vite'
|
import tailwindcss from '@tailwindcss/vite'
|
||||||
import react from '@vitejs/plugin-react-swc'
|
import react from '@vitejs/plugin-react-swc'
|
||||||
import { config as dotenvConfig } from 'dotenv'
|
import { config as dotenvConfig } from 'dotenv'
|
||||||
import { copyFileSync, mkdirSync, readFileSync } from 'node:fs'
|
import { copyFileSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'
|
||||||
import process from 'node:process'
|
import process from 'node:process'
|
||||||
import { dirname, join, resolve } from 'path'
|
import { dirname, join, resolve } from 'path'
|
||||||
import { fileURLToPath } from 'url'
|
import { fileURLToPath } from 'url'
|
||||||
@@ -35,6 +35,8 @@ const SPA_ROUTES = [
|
|||||||
'docs/advanced/security-permissions',
|
'docs/advanced/security-permissions',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
const SITE_URL = 'https://alibaba.github.io/page-agent'
|
||||||
|
|
||||||
function spaRoutes() {
|
function spaRoutes() {
|
||||||
return {
|
return {
|
||||||
name: 'spa-routes',
|
name: 'spa-routes',
|
||||||
@@ -47,6 +49,19 @@ function spaRoutes() {
|
|||||||
copyFileSync(src, join(dir, 'index.html'))
|
copyFileSync(src, join(dir, 'index.html'))
|
||||||
}
|
}
|
||||||
console.log(` ✓ Copied index.html to ${SPA_ROUTES.length} SPA routes`)
|
console.log(` ✓ Copied index.html to ${SPA_ROUTES.length} SPA routes`)
|
||||||
|
|
||||||
|
const today = new Date().toISOString().split('T')[0]
|
||||||
|
const urls = ['', ...SPA_ROUTES]
|
||||||
|
.map(
|
||||||
|
(route) =>
|
||||||
|
` <url>\n <loc>${SITE_URL}/${route}</loc>\n <lastmod>${today}</lastmod>\n </url>`
|
||||||
|
)
|
||||||
|
.join('\n')
|
||||||
|
writeFileSync(
|
||||||
|
join(dist, 'sitemap.xml'),
|
||||||
|
`<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${urls}\n</urlset>\n`
|
||||||
|
)
|
||||||
|
console.log(` ✓ Generated sitemap.xml with ${SPA_ROUTES.length + 1} URLs`)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-14
@@ -4,7 +4,7 @@
|
|||||||
*
|
*
|
||||||
* Usage:
|
* Usage:
|
||||||
* node scripts/sync-version.js # Sync current version from root
|
* node scripts/sync-version.js # Sync current version from root
|
||||||
* node scripts/sync-version.js 0.1.0 # Set and sync new version
|
* node scripts/sync-version.js 0.1.0 # Set root version, then sync all packages
|
||||||
*/
|
*/
|
||||||
import chalk from 'chalk'
|
import chalk from 'chalk'
|
||||||
import { existsSync, readFileSync, readdirSync, writeFileSync } from 'fs'
|
import { existsSync, readFileSync, readdirSync, writeFileSync } from 'fs'
|
||||||
@@ -15,19 +15,18 @@ import { fileURLToPath } from 'url'
|
|||||||
const __dirname = dirname(fileURLToPath(import.meta.url))
|
const __dirname = dirname(fileURLToPath(import.meta.url))
|
||||||
const rootDir = join(__dirname, '..')
|
const rootDir = join(__dirname, '..')
|
||||||
|
|
||||||
// Parse arguments
|
|
||||||
const versionArg = process.argv[2]
|
const versionArg = process.argv[2]
|
||||||
|
|
||||||
if (!versionArg) {
|
|
||||||
console.log(chalk.yellow('⚠️ No version specified.\n'))
|
|
||||||
exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read root package.json
|
// Read root package.json
|
||||||
const rootPkgPath = join(rootDir, 'package.json')
|
const rootPkgPath = join(rootDir, 'package.json')
|
||||||
const rootPkg = JSON.parse(readFileSync(rootPkgPath, 'utf-8'))
|
const rootPkg = JSON.parse(readFileSync(rootPkgPath, 'utf-8'))
|
||||||
const oldVersion = rootPkg.version
|
const oldVersion = rootPkg.version
|
||||||
const newVersion = versionArg
|
const newVersion = versionArg ?? rootPkg.version
|
||||||
|
|
||||||
|
if (!newVersion) {
|
||||||
|
console.log(chalk.yellow('⚠️ No version found in root package.json.\n'))
|
||||||
|
exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
console.log(chalk.cyan.bold('\n📦 Syncing version\n'))
|
console.log(chalk.cyan.bold('\n📦 Syncing version\n'))
|
||||||
|
|
||||||
@@ -35,7 +34,10 @@ console.log(chalk.cyan.bold('\n📦 Syncing version\n'))
|
|||||||
if (versionArg) {
|
if (versionArg) {
|
||||||
rootPkg.version = newVersion
|
rootPkg.version = newVersion
|
||||||
writeFileSync(rootPkgPath, JSON.stringify(rootPkg, null, ' ') + '\n')
|
writeFileSync(rootPkgPath, JSON.stringify(rootPkg, null, ' ') + '\n')
|
||||||
console.log(chalk.green('✓') + ` ${chalk.bold('root')} → ${chalk.yellow(newVersion)}`)
|
console.log(
|
||||||
|
chalk.green('✓') +
|
||||||
|
` ${chalk.bold('root')}: ${chalk.dim(oldVersion)} → ${chalk.yellow(newVersion)}`
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
console.log(chalk.dim(' root:') + ` ${chalk.yellow(newVersion)} ${chalk.dim('(source)')}`)
|
console.log(chalk.dim(' root:') + ` ${chalk.yellow(newVersion)} ${chalk.dim('(source)')}`)
|
||||||
}
|
}
|
||||||
@@ -78,11 +80,8 @@ for (const pkg of packages) {
|
|||||||
const pkgJson = JSON.parse(readFileSync(pkgPath, 'utf-8'))
|
const pkgJson = JSON.parse(readFileSync(pkgPath, 'utf-8'))
|
||||||
let pkgChanged = false
|
let pkgChanged = false
|
||||||
|
|
||||||
// Skip extension package version (it has its own versioning)
|
// Update package version
|
||||||
const isExtension = pkg === 'extension'
|
if (pkgJson.version !== newVersion) {
|
||||||
|
|
||||||
// Update package version (skip extension)
|
|
||||||
if (!isExtension && pkgJson.version !== newVersion) {
|
|
||||||
pkgJson.version = newVersion
|
pkgJson.version = newVersion
|
||||||
pkgChanged = true
|
pkgChanged = true
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user