page-agent-sdk 2.5.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  [![npm](https://img.shields.io/npm/v/page-agent-sdk.svg)](https://www.npmjs.com/package/page-agent-sdk)
10
10
  [![license](https://img.shields.io/badge/license-ISC-blue.svg)](./LICENSE)
11
- [![tests](https://img.shields.io/badge/self%20tests-364%20asserts-brightgreen.svg)](#self-tests)
11
+ [![tests](https://img.shields.io/badge/self%20tests-434%20asserts-brightgreen.svg)](#self-tests)
12
12
 
13
13
  ---
14
14
 
@@ -24,7 +24,7 @@ At its core, it gives the AI a **standardized, safe JSON-operation channel**. AI
24
24
 
25
25
  | Constraint | Mechanism | Effect |
26
26
  |---|---|---|
27
- | **Scope control** | Property registry (`data`) — only declared paths are writable; schema shape auto-whitelist (top-level keys limit visible + writable; undeclared fields hidden/denied; whole-set becomes merge to prevent accidental deletion) | AI touching undeclared fields → `PATH_DENIED` |
27
+ | **Scope control** | Declared schema fields (`data`) — only declared top-level keys are writable; schema shape auto-whitelist (top-level keys limit visible + writable; undeclared fields hidden/denied; whole-set becomes merge to prevent accidental deletion) | AI touching undeclared fields → `PATH_DENIED` |
28
28
  | **Validity check** | zod schema — `write`/`set`/`edit` validated against schema | Invalid type/enum/structure → structured error, no write |
29
29
  | **Incremental op** | `write` with `patch`/`patches` (batch, atomic rollback) or advanced `edit_data` patches by `jsonPath` (set/remove/merge/append) | Avoid re-sending the whole large JSON; precise local edits; use `patches` to edit many at once |
30
30
  | **Large-object retrieval** | `read` supports `fields` (projection) + `depth` (truncation) to shrink payload; `query_data` (JSONPath)/`search_data` (text)/`eval_script` (sandboxed JS) | Efficient retrieval + pinpoint location in large JSON |
@@ -133,15 +133,15 @@ ChatDialog, MessageContent, CodePreview, useChat
133
133
  | | `ui` | `boolean \| 'default'` · default `true` | `false` = headless (build UI with `agent.messages`) |
134
134
  | | `llm` | `LLMConfig \| BaseChatModel` · **required** | `LLMConfig={apiKey,baseUrl?,model?,temperature?,maxTokens?}`; OpenAI-compatible (default DeepSeek) |
135
135
  | | `id` | `string` | Stable id (multi-agent isolation + persistence resume; random+warn if omitted) |
136
- | | `systemPrompt` | `string` | Agent identity (no hardcoded business; inject via this). Optional — built-in default (page assistant + `reliableWriteRules`) used if omitted; passing your own fully overrides it |
137
- | **Page data** | `data` | `{path,description,schema}[]` | Register data slots readable/writable by tools + zod schema |
136
+ | | `systemPrompt` | `string` | Agent identity (no hardcoded business; inject via this). Optional — built-in default (JSON operation assistant + `reliableWriteRules`) used if omitted; passing your own fully overrides it. `appendReliableWriteRules:true` auto-appends the rules (default `false`) |
137
+ | **Page data** | `data` | `{schema,bind,description?}` | Single main object: declare zod schema (validation + field descriptions auto-injected into prompt) + bind (reactive/plain object, tools read/write directly, no `window`) + description |
138
138
  | | `tools` / `skills` / `memory` | `Tool[]` / `SkillSpec[]` / `string` | Custom tools / skills / AGENTS.md-style directives |
139
139
  | **Capability toggles** | `capabilities` | `{planning?,dataOps?,fetch?,skills?,vfs?,summarization?,memory?,subagent?,verify?}` | Default all on (`verify` default off); `false` to turn off |
140
140
  | | `permissions` | `PermissionRule[]` | Scope whitelist (first-match-wins, default off) |
141
141
  | | `humanConfirm` | `boolean` · default `true` | Proactive inquiry (AI asks when uncertain/multi-plan) |
142
142
  | | `approval` | `{tools?,confirm?,timeoutMs?,humanConfirmTool?}` · default off | Passive confirm whitelist (pre-write allow/deny) |
143
143
  | | `checkpoint` | `boolean \| {maxCheckpoints?,auto?}` · default off | Session-level rollback (`auto` default `true`) |
144
- | | `verify` | `{check?,maxAttempts?,adversarial?}` | Needs `capabilities.verify:true`; `check` omitted → `createWriteBackCheck` |
144
+ | | `verify` | `{check?,maxAttempts?,adversarial?}` | Needs `capabilities.verify:true`; `check` omitted → `createWriteBackCheck` (read-back root auto-bound to `data.bind`, adapts to `sdk.setData` runtime swap) |
145
145
  | **Subagents** | `subagent` | `{allowedTools?,systemPrompt?,temperature?,llm?,maxDepth?·1,maxParallel?·4}` | Runtime ad-hoc delegation (`spawn_agent`/`spawn_agents`) |
146
146
  | | `subagents` | `SubagentConfig[]` | Pre-declared named subagents → each generates `use_<id>` tool |
147
147
  | **Context** | `contextPreset` | `'auto' \| 'conservative' \| 'aggressive'` · default `auto` | Compression preset |
@@ -181,7 +181,7 @@ createChatSdk({ subagents: [
181
181
 
182
182
  ### Built-in tools (Agent-callable)
183
183
 
184
- - **data slot ops** (default `toolMode:'simple'`): `read` (list/get/describe merged) / `write` (set/edit/delete merged + auto optimistic lock + auto snapshot) — recommended; `toolMode:'advanced'` also exposes low-level `describe_data` / `describe_data` / `get_data` / `get_data` / `set_data` / `edit_data` (jsonPath patch) / `delete_data` / `snapshot_data` / `list_data_snapshots` / `restore_data`
184
+ - **data ops** (default `toolMode:'simple'`): `read` (list/get/describe merged) / `write` (set/edit/delete merged + auto optimistic lock + auto snapshot) — recommended; `toolMode:'advanced'` also exposes low-level `describe_data` / `list_data_snapshots` / `get_data` / `set_data` / `edit_data` (jsonPath patch) / `delete_data` / `snapshot_data` / `restore_data`
185
185
  - **window query**: `query_data` (JSONPath) / `search_data` (fuzzy) / `eval_script` (sandboxed)
186
186
  - **fetch**: `fetch_document`
187
187
  - **vfs**: `vfs_read` / `vfs_write` / `vfs_edit` / `vfs_ls` / `vfs_glob` / `vfs_grep`
@@ -201,7 +201,7 @@ src/core/
201
201
  │ todos.ts skills.ts memory.ts summarization.ts retry.ts
202
202
  │ subagent.ts verify.ts approval.ts humanConfirm.ts checkpoint.ts
203
203
  │ permissions.ts usageHints.ts
204
- ├── tools/ # dataOps (registry + incremental edit + snapshot) / dataSlotQuery / fetchDoc
204
+ ├── tools/ # dataOps (schema validation + incremental edit + snapshot + whitelist) / dataSlotQuery / fetchDoc
205
205
  ├── backends/ # vfs (memory) / storage (IndexedDB + multi-backend + quota eviction)
206
206
  ├── mcp/client.ts # remote MCP tool integration
207
207
  ├── composables/ # useChat / useContextManager / useMarkdown
@@ -236,7 +236,7 @@ createChatSdk({ subagents: [
236
236
 
237
237
  ### Built-in tools (Agent-callable)
238
238
 
239
- - **data slot ops** (default `toolMode:'simple'`): `read` (list/get/describe merged) / `write` (set/edit/delete merged + auto optimistic lock + auto snapshot) — recommended; `toolMode:'advanced'` also exposes low-level `describe_data` / `describe_data` / `get_data` / `get_data` / `set_data` / `edit_data` (jsonPath patch) / `delete_data` / `snapshot_data` / `list_data_snapshots` / `restore_data`
239
+ - **data ops** (default `toolMode:'simple'`): `read` (list/get/describe merged) / `write` (set/edit/delete merged + auto optimistic lock + auto snapshot) — recommended; `toolMode:'advanced'` also exposes low-level `describe_data` / `list_data_snapshots` / `get_data` / `set_data` / `edit_data` (jsonPath patch) / `delete_data` / `snapshot_data` / `restore_data`
240
240
  - **window query**: `query_data` (JSONPath) / `search_data` (fuzzy) / `eval_script` (sandboxed)
241
241
  - **fetch**: `fetch_document`
242
242
  - **vfs**: `vfs_read` / `vfs_write` / `vfs_edit` / `vfs_ls` / `vfs_glob` / `vfs_grep`
@@ -256,7 +256,7 @@ src/core/
256
256
  │ todos.ts skills.ts memory.ts summarization.ts retry.ts
257
257
  │ subagent.ts verify.ts approval.ts humanConfirm.ts checkpoint.ts
258
258
  │ permissions.ts usageHints.ts
259
- ├── tools/ # dataOps (registry + incremental edit + snapshot) / dataSlotQuery / fetchDoc
259
+ ├── tools/ # dataOps (schema validation + incremental edit + snapshot + whitelist) / dataSlotQuery / fetchDoc
260
260
  ├── backends/ # vfs (memory) / storage (IndexedDB + multi-backend + quota eviction)
261
261
  ├── mcp/client.ts # remote MCP tool integration
262
262
  ├── composables/ # useChat / useContextManager / useMarkdown
@@ -300,12 +300,12 @@ flowchart TD
300
300
  CORE --> AGENT[createAgent<br/>ReAct loop + middleware stack]
301
301
  AGENT --> MW[Middleware stack<br/>usageHints→todos→skills→vfs→summarization<br/>→memory→permissions→checkpoint→approval<br/>→humanConfirm→verify→subagent→user]
302
302
  AGENT --> TOOLS[Tools<br/>dataOps / fetchDoc / vfs / MCP / user]
303
- TOOLS -->|zero-bridge| WIN[Host page window<br/>read/write registered props directly]
303
+ TOOLS -->|direct read/write| DATA[Main data bind<br/>reactive/plain object<br/>schema validation + whitelist]
304
304
  AGENT --> LLM[LLM<br/>OpenAI-compatible / any ChatModel]
305
305
  SDK --> UI[ChatDialog UI<br/>Vue bundled in / or headless]
306
306
  ```
307
307
 
308
- - **Framework-agnostic**: Vue bundled in the lib (not a peer); host can be React/vanilla. Also supports `ui:false` headless — and runs in **Node.js** as a backend Agent (custom tools / subagents / verify; disable `dataOps`+`fetch`, use `storage:'memory'`)
308
+ - **Framework-agnostic**: Vue bundled in the lib (not a peer); host can be React/vanilla. Also supports `ui:false` headless — and runs in **Node.js** as a backend Agent (custom tools / subagents / verify; disable `fetch`+`eval_script` (dataOps body works in Node with any `bind`), use `storage:'memory'`)
309
309
  - **Provider-agnostic**: `llm` accepts any LangChain `BaseChatModel`, or `LLMConfig` (builds `ChatOpenAI` internally, OpenAI-compatible, default DeepSeek)
310
310
  - **In-house harness**: no LangGraph/langchain full bundle; avoids browser bundling blockers
311
311
 
@@ -381,8 +381,8 @@ Framework-agnostic integration: `demo/plain.html` (importmap + esm.sh).
381
381
  ## Self-tests
382
382
 
383
383
  ```bash
384
- npm test # 364 assertions (tsx, source-level; no LLM dependency)
385
- npm run test:e2e # 120 integration assertions (node, built dist; covers APIs/options/modules/simple&complex scenes: default systemPrompt(capability overview) / dynamic register + inspect sync / inspect(tools/middleware/subagent/verify/mcp/todos/lastCompression/checkpoints reflect config) / custom tools/middleware/skills/memory injection / switchSession(on/off) / shareContext on/off sharing/independent / storage backends + object config / presets(3) / checkpoint / exports complete(39+ fns/components) / util fns usable(isQuotaError/estimateTokens/jpEval/searchJson) / source=builtin / mount boundary / hook multi-listener / llm config / error scenes)
384
+ npm test # 434 assertions (tsx, source-level; no LLM dependency)
385
+ npm run test:e2e # 130 integration assertions (node, built dist; covers APIs/options/modules/simple&complex scenes: default systemPrompt(capability overview) / dynamic register + inspect sync / inspect(tools/middleware/subagent/verify/mcp/todos/lastCompression/checkpoints reflect config) / custom tools/middleware/skills/memory injection / switchSession(on/off) / shareContext on/off sharing/independent / storage backends + object config / presets(3) / checkpoint / exports complete(39+ fns/components) / util fns usable(isQuotaError/estimateTokens/jpEval/searchJson) / source=builtin / mount boundary / hook multi-listener / llm config / error scenes)
386
386
  ```
387
387
 
388
388
  ## Local npm package test
package/README.zh-CN.md CHANGED
@@ -133,15 +133,15 @@ ChatDialog, MessageContent, CodePreview, useChat
133
133
  | | `ui` | `boolean \| 'default'` · 默认 `true` | `false` = headless(用 `agent.messages` 自建 UI) |
134
134
  | | `llm` | `LLMConfig \| BaseChatModel` · **必传** | `LLMConfig={apiKey,baseUrl?,model?,temperature?,maxTokens?}`;兼容 OpenAI 协议(默认 DeepSeek) |
135
135
  | | `id` | `string` | 稳定 id(多 agent 隔离 + 持久化恢复;不传随机+warn) |
136
- | | `systemPrompt` | `string` | Agent 身份(不硬编码业务,靠这注入)。可选——不传用内置默认(页面操作助手 + `reliableWriteRules`);传了则完全覆盖 |
137
- | **页面数据** | `data` | `{path,description,schema}[]` | 注册可被工具读写的 数据槽 + zod schema 校验 |
136
+ | | `systemPrompt` | `string` | Agent 身份(不硬编码业务,靠这注入)。可选——不传用内置默认(JSON 操作助手 + `reliableWriteRules`);传了则完全覆盖。`appendReliableWriteRules:true` 可自动追加规则段(默认 false) |
137
+ | **页面数据** | `data` | `{schema,bind,description?}` | 单主对象:声明 zod schema(校验 + 字段描述自动注入提示词)+ bind(reactive/普通对象,工具直接读写,不挂 window)+ description |
138
138
  | | `tools` / `skills` / `memory` | `Tool[]` / `SkillSpec[]` / `string` | 自定义工具 / 技能 / AGENTS.md 风格持久指令 |
139
139
  | **能力开关** | `capabilities` | `{planning?,dataOps?,fetch?,skills?,vfs?,summarization?,memory?,subagent?,verify?}` | 默认全开(`verify` 默认关);`false` 关掉省 token |
140
140
  | | `permissions` | `PermissionRule[]` | scope 白名单(first-match-wins,默认不启用) |
141
141
  | | `humanConfirm` | `boolean` · 默认 `true` | 主动征询(AI 不确定/多方案主动问你,不猜测) |
142
142
  | | `approval` | `{tools?,confirm?,timeoutMs?,humanConfirmTool?}` · 默认关 | 被动确认白名单(写操作前弹允许/拒绝) |
143
143
  | | `checkpoint` | `boolean \| {maxCheckpoints?,auto?}` · 默认关 | 会话级回滚(`auto` 默认 `true` 每轮存档) |
144
- | | `verify` | `{check?,maxAttempts?,adversarial?}` | 需 `capabilities.verify:true`;`check` 省略用 `createWriteBackCheck` |
144
+ | | `verify` | `{check?,maxAttempts?,adversarial?}` | 需 `capabilities.verify:true`;`check` 省略用 `createWriteBackCheck`(读回根对象自动取 `data.bind`,适配 `sdk.setData` 运行时替换) |
145
145
  | **子 agent** | `subagent` | `{allowedTools?,systemPrompt?,temperature?,llm?,maxDepth?·1,maxParallel?·4}` | 运行时自由委派(`spawn_agent`/`spawn_agents`) |
146
146
  | | `subagents` | `SubagentConfig[]` | 预声明命名子 agent → 每个生成 `use_<id>` 委派工具 |
147
147
  | **上下文** | `contextPreset` | `'auto' \| 'conservative' \| 'aggressive'` · 默认 `auto` | 压缩预设档位 |
@@ -201,7 +201,7 @@ src/core/
201
201
  │ todos.ts skills.ts memory.ts summarization.ts retry.ts
202
202
  │ subagent.ts verify.ts approval.ts humanConfirm.ts checkpoint.ts
203
203
  │ permissions.ts usageHints.ts
204
- ├── tools/ # dataOps(注册表+增量编辑+快照)/ dataSlotQuery / fetchDoc
204
+ ├── tools/ # dataOps(单主对象+schema 白名单+增量编辑+快照)/ dataSlotQuery / fetchDoc
205
205
  ├── backends/ # vfs(内存) / storage(IndexedDB+多后端+配额淘汰)
206
206
  ├── mcp/client.ts # MCP 远程工具接入
207
207
  ├── composables/ # useChat / useContextManager / useMarkdown
@@ -245,12 +245,12 @@ flowchart TD
245
245
  CORE --> AGENT[createAgent<br/>ReAct 循环 + 中间件栈]
246
246
  AGENT --> MW[中间件栈<br/>usageHints→todos→skills→vfs→summarization<br/>→memory→permissions→checkpoint→approval<br/>→humanConfirm→verify→subagent→用户]
247
247
  AGENT --> TOOLS[工具集<br/>dataOps / fetchDoc / vfs / MCP / 用户]
248
- TOOLS -->|零桥接| WIN[宿主页面 window<br/>直接读写注册属性]
248
+ TOOLS -->|直接读写 bind| DATA[主数据 bind<br/>reactive/普通对象<br/>schema 校验 + 白名单]
249
249
  AGENT --> LLM[LLM<br/>OpenAI 协议 / 任意 ChatModel]
250
250
  SDK --> UI[ChatDialog UI<br/>Vue 打包进库 / 或 headless]
251
251
  ```
252
252
 
253
- - **框架无关**:Vue 打包进库(非 peer),宿主用 React/原生都行;也支持 `ui:false` headless 自建 UI —— 且可在 **Node.js 服务端**跑作后端 Agent(自定义工具/子 agent/自检;关 `dataOps`+`fetch`,用 `storage:'memory'`)
253
+ - **框架无关**:Vue 打包进库(非 peer),宿主用 React/原生都行;也支持 `ui:false` headless 自建 UI —— 且可在 **Node.js 服务端**跑作后端 Agent(自定义工具/子 agent/自检;关 `fetch`+`eval_script`,dataOps 主体传 `bind` 即可跑,用 `storage:'memory'`)
254
254
  - **provider 抽离**:`llm` 传任意 LangChain `BaseChatModel`,或 `LLMConfig`(内部构造 `ChatOpenAI`,兼容 OpenAI 协议,默认接 DeepSeek)
255
255
  - **自研 harness**:不引 LangGraph/langchain 整包,规避浏览器打包阻塞
256
256
 
@@ -326,8 +326,8 @@ createChatSdk({
326
326
  ## 自测
327
327
 
328
328
  ```bash
329
- npm test # 364 项断言(tsx 源码级,不依赖 LLM)
330
- npm run test:e2e # 120 项集成断言(node 跑构建产物 dist;覆盖各 API/配置项/功能模块/简单与复杂场景:默认 systemPrompt(含能力概述) / 动态注册与 inspect 同步 / inspect(tools/middleware/subagent/verify/mcp/todos/lastCompression/checkpoints 反映配置) / 自定义 tools/middleware/skills/memory 注入 / switchSession(开/未开) / shareContext 开/关共享独立 / storage 后端+对象配置 / presets 三预设 / checkpoint / 导出项完整(39+ 函数/组件) / 工具函数可用(isQuotaError/estimateTokens/jpEval/searchJson) / source=builtin / mount 边界 / hook 多监听器 / llm 配置 / 错误场景)
329
+ npm test # 434 项断言(tsx 源码级,不依赖 LLM)
330
+ npm run test:e2e # 130 项集成断言(node 跑构建产物 dist;覆盖各 API/配置项/功能模块/简单与复杂场景:默认 systemPrompt(含能力概述) / 动态注册与 inspect 同步 / inspect(tools/middleware/subagent/verify/mcp/todos/lastCompression/checkpoints 反映配置) / 自定义 tools/middleware/skills/memory 注入 / switchSession(开/未开) / shareContext 开/关共享独立 / storage 后端+对象配置 / presets 三预设 / checkpoint / 导出项完整(39+ 函数/组件) / 工具函数可用(isQuotaError/estimateTokens/jpEval/searchJson) / source=builtin / mount 边界 / hook 多监听器 / llm 配置 / 错误场景)
331
331
  ```
332
332
 
333
333
  ## 本地 npm 包测试