page-agent-sdk 4.10.0 → 4.11.1
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 +2 -0
- package/README.zh-CN.md +2 -0
- package/dist/page-agent-sdk.headless.js +2809 -2673
- package/dist/page-agent-sdk.iife.js +167 -167
- package/dist/page-agent-sdk.js +3812 -3676
- package/dist/page-agent-sdk.legacy.js +14667 -14508
- package/dist/page-agent-sdk.umd.cjs +106 -106
- package/package.json +2 -1
- package/types/headless.d.ts +69 -0
- package/types/index.d.ts +69 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "page-agent-sdk",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.11.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "AI agent SDK for web pages — embed a chat assistant that edits page data via schema-validated tools. A lighter, framework-agnostic alternative to CopilotKit/LangChain for in-page JSON-editing agents. Vue-bundled; works with DeepSeek, OpenAI, MCP.",
|
|
6
6
|
"main": "./dist/page-agent-sdk.umd.cjs",
|
|
@@ -69,6 +69,7 @@
|
|
|
69
69
|
"test:draft-real": "tsx tests/runtime/draft-real-llm.ts",
|
|
70
70
|
"test:maliang-real": "tsx tests/runtime/maliang-real-llm.ts",
|
|
71
71
|
"test:real": "node tests/runtime/real-llm.mjs",
|
|
72
|
+
"test:node-real": "node examples/node/headless-node.mjs",
|
|
72
73
|
"test:uispec-real": "node tests/runtime/uispec-real-llm.mjs"
|
|
73
74
|
},
|
|
74
75
|
"keywords": [
|
package/types/headless.d.ts
CHANGED
|
@@ -348,6 +348,10 @@ export interface AgentInfo {
|
|
|
348
348
|
workingMemory?: WorkingMemory;
|
|
349
349
|
/** 写驱动过期读失效会话累计(stale-read-invalidation;写后旧 read/query/search 结果被替换为占位的次数) */
|
|
350
350
|
staleReadsInvalidated?: number;
|
|
351
|
+
/** 模型调用重试会话累计(retry-visibility;启动/body 阶段自动重试次数 —— 环境故障 vs SDK 回归的第一判据) */
|
|
352
|
+
llmRetries?: number;
|
|
353
|
+
/** 模型调用最终失败会话累计(retry-visibility;重试耗尽/不可重试类终败次数) */
|
|
354
|
+
llmCallFailures?: number;
|
|
351
355
|
/** 当前上下文聚焦焦点(focus 中间件;兼容:首个;未聚焦/未开启 → undefined) */
|
|
352
356
|
focus?: Focus;
|
|
353
357
|
/** 全部聚焦焦点(multi-focus;空数组=未聚焦) */
|
|
@@ -1768,3 +1772,68 @@ export declare function copyText(text: string): Promise<boolean>;
|
|
|
1768
1772
|
* 返回的 runSerial(fn):fn 排队执行(前一个无论成败都继续),返回 fn 的 Promise(透传结果/错误)。
|
|
1769
1773
|
*/
|
|
1770
1774
|
export declare function createSerialRunner(): <T>(fn: () => Promise<T>) => Promise<T>;
|
|
1775
|
+
|
|
1776
|
+
// ===== eval-toolkit(真 LLM 回归判定核,4.10+;openspec/changes/2026-09-03-eval-toolkit)=====
|
|
1777
|
+
/** idle 采样(harness 从 sdk 读;自用套件从 page.evaluate 读 —— 同一判定核吃两种采样器) */
|
|
1778
|
+
export interface EvalSample {
|
|
1779
|
+
messageCount: number;
|
|
1780
|
+
/** 距最近一条 debugLog 的毫秒;日志为空时返回 epoch 级巨值(>1e12 = 被清空信号) */
|
|
1781
|
+
quietMs: number;
|
|
1782
|
+
/** 是否已有至少一条模型响应(debugLogs 含 llm_response) */
|
|
1783
|
+
hasResponse: boolean;
|
|
1784
|
+
/** 在飞子 agent 数(inspect().subagent.active.length;无子能力恒 0) */
|
|
1785
|
+
activeSubagents: number;
|
|
1786
|
+
/** debugLogs 当前长度(诊断用) */
|
|
1787
|
+
logCount: number;
|
|
1788
|
+
}
|
|
1789
|
+
export interface EvalIdleDetectorOptions {
|
|
1790
|
+
/** 日志静默阈值 ms(默认 90000 —— reasoning/长生成期间不打日志,阈值须盖过最长思考窗口) */
|
|
1791
|
+
quietMs?: number;
|
|
1792
|
+
/** 连续几次采样满足全条件才判 done(默认 3;单次采样可能恰逢间隙) */
|
|
1793
|
+
confirmSamples?: number;
|
|
1794
|
+
/** 基线消息数:判定「有新消息」的下界(默认 0) */
|
|
1795
|
+
baselineMessageCount?: number;
|
|
1796
|
+
}
|
|
1797
|
+
export type IdleVerdict = 'pending' | 'done' | 'reset';
|
|
1798
|
+
/** idle 状态机(纯函数):逐采样喂入返回判定;不碰定时器/DOM —— 自用套件与公开 harness 共用同一真相源 */
|
|
1799
|
+
export declare function createIdleDetector(opts?: EvalIdleDetectorOptions): { push: (sample: EvalSample) => IdleVerdict; reset: () => void };
|
|
1800
|
+
/** 回归报告快照(collectReport 产物;与自用 _real-llm-*.json 场景条目同构,可互相对 diff) */
|
|
1801
|
+
export interface EvalReport {
|
|
1802
|
+
at: string;
|
|
1803
|
+
messageCount: number;
|
|
1804
|
+
toolCount: number;
|
|
1805
|
+
usage: { prompt: number; completion: number; cacheRead?: number; cacheCreate?: number };
|
|
1806
|
+
}
|
|
1807
|
+
export interface EvalDiffOptions {
|
|
1808
|
+
tokenAbs?: number;
|
|
1809
|
+
tokenPct?: number;
|
|
1810
|
+
toolCountAbs?: number;
|
|
1811
|
+
}
|
|
1812
|
+
export interface EvalDiffField {
|
|
1813
|
+
key: string;
|
|
1814
|
+
prev: number;
|
|
1815
|
+
cur: number;
|
|
1816
|
+
delta: number;
|
|
1817
|
+
pct: number;
|
|
1818
|
+
flag: '' | 'up' | 'down';
|
|
1819
|
+
}
|
|
1820
|
+
export interface EvalDiffResult {
|
|
1821
|
+
status: 'ok' | 'worse' | 'better';
|
|
1822
|
+
regressions: number;
|
|
1823
|
+
fields: EvalDiffField[];
|
|
1824
|
+
}
|
|
1825
|
+
/** 单场景报告 vs 基线阈值判定(纯函数):token ±pct 且 ±abs 同时超才标 ▲▼,toolCount 超绝对差即标,elapsedSec 不判 */
|
|
1826
|
+
export declare function diffReport(current: Record<string, number>, baseline: Record<string, number> | null | undefined, opts?: EvalDiffOptions): EvalDiffResult;
|
|
1827
|
+
/** harness 依赖的最小 sdk 面(结构子集;ChatSdk 满足 —— 直接传 sdk 即可) */
|
|
1828
|
+
export interface EvalSdkLike {
|
|
1829
|
+
messages: unknown[];
|
|
1830
|
+
debugLogs: import('vue').Ref<DebugLog[]>;
|
|
1831
|
+
usage?: { prompt: number; completion: number; cacheRead?: number; cacheCreate?: number };
|
|
1832
|
+
inspect?: () => { subagent?: { active?: unknown[] } };
|
|
1833
|
+
}
|
|
1834
|
+
export interface EvalHarness {
|
|
1835
|
+
waitForIdle(opts?: EvalIdleDetectorOptions & { timeoutMs?: number; sampleMs?: number; onSample?: (s: EvalSample) => void }): Promise<EvalSample>;
|
|
1836
|
+
collectReport(): EvalReport;
|
|
1837
|
+
}
|
|
1838
|
+
/** 创建 eval harness:waitForIdle(idle 状态机驱动轮询)+ collectReport(报告快照)。纯判定/等待层 —— 发消息/断言业务结果归集成方 */
|
|
1839
|
+
export declare function createEvalHarness(opts: { sdk: EvalSdkLike }): EvalHarness;
|
package/types/index.d.ts
CHANGED
|
@@ -683,6 +683,10 @@ export interface AgentInfo {
|
|
|
683
683
|
workingMemory?: WorkingMemory;
|
|
684
684
|
/** 写驱动过期读失效会话累计(stale-read-invalidation;写后旧 read/query/search 结果被替换为占位的次数) */
|
|
685
685
|
staleReadsInvalidated?: number;
|
|
686
|
+
/** 模型调用重试会话累计(retry-visibility;启动/body 阶段自动重试次数 —— 环境故障 vs SDK 回归的第一判据) */
|
|
687
|
+
llmRetries?: number;
|
|
688
|
+
/** 模型调用最终失败会话累计(retry-visibility;重试耗尽/不可重试类终败次数) */
|
|
689
|
+
llmCallFailures?: number;
|
|
686
690
|
/** 当前上下文聚焦焦点(focus 中间件;兼容:首个;未聚焦/未开启 → undefined) */
|
|
687
691
|
focus?: Focus;
|
|
688
692
|
/** 全部聚焦焦点(multi-focus;空数组=未聚焦) */
|
|
@@ -2235,3 +2239,68 @@ export declare function copyText(text: string): Promise<boolean>;
|
|
|
2235
2239
|
* 返回的 runSerial(fn):fn 排队执行(前一个无论成败都继续),返回 fn 的 Promise(透传结果/错误)。
|
|
2236
2240
|
*/
|
|
2237
2241
|
export declare function createSerialRunner(): <T>(fn: () => Promise<T>) => Promise<T>;
|
|
2242
|
+
|
|
2243
|
+
// ===== eval-toolkit(真 LLM 回归判定核,4.10+;openspec/changes/2026-09-03-eval-toolkit)=====
|
|
2244
|
+
/** idle 采样(harness 从 sdk 读;自用套件从 page.evaluate 读 —— 同一判定核吃两种采样器) */
|
|
2245
|
+
export interface EvalSample {
|
|
2246
|
+
messageCount: number;
|
|
2247
|
+
/** 距最近一条 debugLog 的毫秒;日志为空时返回 epoch 级巨值(>1e12 = 被清空信号) */
|
|
2248
|
+
quietMs: number;
|
|
2249
|
+
/** 是否已有至少一条模型响应(debugLogs 含 llm_response) */
|
|
2250
|
+
hasResponse: boolean;
|
|
2251
|
+
/** 在飞子 agent 数(inspect().subagent.active.length;无子能力恒 0) */
|
|
2252
|
+
activeSubagents: number;
|
|
2253
|
+
/** debugLogs 当前长度(诊断用) */
|
|
2254
|
+
logCount: number;
|
|
2255
|
+
}
|
|
2256
|
+
export interface EvalIdleDetectorOptions {
|
|
2257
|
+
/** 日志静默阈值 ms(默认 90000 —— reasoning/长生成期间不打日志,阈值须盖过最长思考窗口) */
|
|
2258
|
+
quietMs?: number;
|
|
2259
|
+
/** 连续几次采样满足全条件才判 done(默认 3;单次采样可能恰逢间隙) */
|
|
2260
|
+
confirmSamples?: number;
|
|
2261
|
+
/** 基线消息数:判定「有新消息」的下界(默认 0) */
|
|
2262
|
+
baselineMessageCount?: number;
|
|
2263
|
+
}
|
|
2264
|
+
export type IdleVerdict = 'pending' | 'done' | 'reset';
|
|
2265
|
+
/** idle 状态机(纯函数):逐采样喂入返回判定;不碰定时器/DOM —— 自用套件与公开 harness 共用同一真相源 */
|
|
2266
|
+
export declare function createIdleDetector(opts?: EvalIdleDetectorOptions): { push: (sample: EvalSample) => IdleVerdict; reset: () => void };
|
|
2267
|
+
/** 回归报告快照(collectReport 产物;与自用 _real-llm-*.json 场景条目同构,可互相对 diff) */
|
|
2268
|
+
export interface EvalReport {
|
|
2269
|
+
at: string;
|
|
2270
|
+
messageCount: number;
|
|
2271
|
+
toolCount: number;
|
|
2272
|
+
usage: { prompt: number; completion: number; cacheRead?: number; cacheCreate?: number };
|
|
2273
|
+
}
|
|
2274
|
+
export interface EvalDiffOptions {
|
|
2275
|
+
tokenAbs?: number;
|
|
2276
|
+
tokenPct?: number;
|
|
2277
|
+
toolCountAbs?: number;
|
|
2278
|
+
}
|
|
2279
|
+
export interface EvalDiffField {
|
|
2280
|
+
key: string;
|
|
2281
|
+
prev: number;
|
|
2282
|
+
cur: number;
|
|
2283
|
+
delta: number;
|
|
2284
|
+
pct: number;
|
|
2285
|
+
flag: '' | 'up' | 'down';
|
|
2286
|
+
}
|
|
2287
|
+
export interface EvalDiffResult {
|
|
2288
|
+
status: 'ok' | 'worse' | 'better';
|
|
2289
|
+
regressions: number;
|
|
2290
|
+
fields: EvalDiffField[];
|
|
2291
|
+
}
|
|
2292
|
+
/** 单场景报告 vs 基线阈值判定(纯函数):token ±pct 且 ±abs 同时超才标 ▲▼,toolCount 超绝对差即标,elapsedSec 不判 */
|
|
2293
|
+
export declare function diffReport(current: Record<string, number>, baseline: Record<string, number> | null | undefined, opts?: EvalDiffOptions): EvalDiffResult;
|
|
2294
|
+
/** harness 依赖的最小 sdk 面(结构子集;ChatSdk 满足 —— 直接传 sdk 即可) */
|
|
2295
|
+
export interface EvalSdkLike {
|
|
2296
|
+
messages: unknown[];
|
|
2297
|
+
debugLogs: import('vue').Ref<DebugLog[]>;
|
|
2298
|
+
usage?: { prompt: number; completion: number; cacheRead?: number; cacheCreate?: number };
|
|
2299
|
+
inspect?: () => { subagent?: { active?: unknown[] } };
|
|
2300
|
+
}
|
|
2301
|
+
export interface EvalHarness {
|
|
2302
|
+
waitForIdle(opts?: EvalIdleDetectorOptions & { timeoutMs?: number; sampleMs?: number; onSample?: (s: EvalSample) => void }): Promise<EvalSample>;
|
|
2303
|
+
collectReport(): EvalReport;
|
|
2304
|
+
}
|
|
2305
|
+
/** 创建 eval harness:waitForIdle(idle 状态机驱动轮询)+ collectReport(报告快照)。纯判定/等待层 —— 发消息/断言业务结果归集成方 */
|
|
2306
|
+
export declare function createEvalHarness(opts: { sdk: EvalSdkLike }): EvalHarness;
|