page-agent-sdk 2.18.0 → 2.19.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "page-agent-sdk",
3
- "version": "2.18.0",
3
+ "version": "2.19.0",
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",
@@ -52,7 +52,9 @@
52
52
  "test:types": "tsc --noEmit -p tsconfig.test.json",
53
53
  "test:size": "node tests/size-check.mjs",
54
54
  "test:browser": "playwright test",
55
- "test:browser:ui": "playwright test --ui"
55
+ "test:browser:ui": "playwright test --ui",
56
+ "test:draft-real": "tsx tests/runtime/draft-real-llm.ts",
57
+ "test:trace-real": "tsx tests/runtime/trace-real-llm.ts"
56
58
  },
57
59
  "keywords": [
58
60
  "ai",
package/types/index.d.ts CHANGED
@@ -75,7 +75,8 @@ export type SdkEvent =
75
75
  | { type: 'conflict'; conflict: PendingConflict }
76
76
  | { type: 'session_restored'; sessionId: string; rounds: number }
77
77
  | { type: 'usage'; round: number; usage: TokenUsage; cumulative: TokenUsage }
78
- | { type: 'error'; message: string; severity?: 'recoverable' | 'fatal' | 'observable'; code?: string; context?: unknown };
78
+ | { type: 'error'; message: string; severity?: 'recoverable' | 'fatal' | 'observable'; code?: string; context?: unknown }
79
+ | { type: 'trace'; spans: TraceSpan[]; metrics: TraceMetrics };
79
80
 
80
81
  /** token 用量(OpenAI 协议字段名) */
81
82
  export interface TokenUsage {
@@ -158,6 +159,8 @@ export interface AgentInfo {
158
159
  };
159
160
  /** 会话级 checkpoint 装载状态(未开启 → undefined) */
160
161
  checkpoints?: { enabled: boolean; auto: boolean; list: CheckpointMeta[] };
162
+ /** 结构化追踪(revive-observability-tracing;capabilities.tracing 开时填充,否则 undefined) */
163
+ trace?: { spans: TraceSpan[]; metrics: TraceMetrics };
161
164
  }
162
165
  export interface McpServerConfig { transport: 'http' | 'sse' | 'websocket'; url: string; name?: string; requestInit?: any; }
163
166
 
@@ -477,7 +480,7 @@ export interface ChatSdkOptions {
477
480
  /** 模型最大输出(token);顶层声明对 llm 实例场景也生效,缺省按 model 名查表 */
478
481
  maxOutputTokens?: number;
479
482
  /** 子 agent 委派(默认开启;{ enabled: false } 关闭) */
480
- capabilities?: { dataOps?: boolean; fetch?: boolean; planning?: boolean; missionAnchor?: boolean; skills?: boolean; vfs?: boolean; summarization?: boolean; memory?: boolean; subagent?: boolean; verify?: boolean; domInspect?: boolean; workingMemory?: boolean };
483
+ capabilities?: { dataOps?: boolean; fetch?: boolean; planning?: boolean; missionAnchor?: boolean; skills?: boolean; vfs?: boolean; summarization?: boolean; memory?: boolean; subagent?: boolean; verify?: boolean; domInspect?: boolean; inspectEnv?: boolean; draftWrite?: boolean; tracing?: boolean; todoDeps?: boolean; workingMemory?: boolean };
481
484
  subagent?: { enabled?: boolean; allowedTools?: string[]; systemPrompt?: string; temperature?: number; maxTokens?: number; skills?: SkillSpec[]; llm?: LLMConfig | ChatModelLike; maxDepth?: number; maxParallel?: number };
482
485
  /** 预声明子 agent 列表:每个用同主配置方式声明,自动生成 use_<id> 委派工具(与 spawn_agent 共存) */
483
486
  subagents?: SubagentConfig[];
@@ -669,6 +672,36 @@ export declare function defineTool(opts: {
669
672
  }): any;
670
673
  export declare function createDataOps(config: DataConfig, opts?: DataOpsOptions): any[];
671
674
  export declare function filterByToolMode(tools: any[], mode?: 'simple' | 'advanced' | 'minimal'): any[];
675
+ /** 整体 set 写入纯函数:schema 校验 + 快照 + merge/替换 + audit。set_data / write(set) / draft_commit 共用。返回 {ok,hash,data} 或 {ok:false,error} */
676
+ export declare function commitSetToBind(args: { bindRef: unknown; value: unknown; schema: any; allowKeys: string[] | null; snapshots: any[]; maxSnapshots: number; audit: (e: any) => void; dryRun?: boolean; op?: 'set' | 'draft_commit' }): { ok: true; hash: string; data: unknown } | { ok: false; error: string };
677
+ /** 结构化追踪 span(revive-observability-tracing Phase 3) */
678
+ export type SpanType = 'round' | 'model' | 'tool' | 'compression';
679
+ export type SpanStatus = 'ok' | 'error' | 'timeout';
680
+ export interface TraceSpan {
681
+ id: string;
682
+ parentId?: string;
683
+ name: string;
684
+ type: SpanType;
685
+ startTs: number;
686
+ endTs?: number;
687
+ durationMs?: number;
688
+ status: SpanStatus;
689
+ attributes: Record<string, unknown>;
690
+ }
691
+ export interface TraceMetrics {
692
+ rounds: number;
693
+ totalDurationMs: number;
694
+ avgRoundMs: number;
695
+ toolCalls: number;
696
+ toolFailures: number;
697
+ toolSuccessRate: number;
698
+ modelCalls: number;
699
+ retries: number;
700
+ compressions: number;
701
+ totalTokens?: { prompt: number; completion: number; total: number };
702
+ }
703
+ /** 从 TraceSpan[] 聚合 metrics(纯函数:轮次/延迟/工具成功率/重试/压缩/token) */
704
+ export declare function getTraceMetrics(spans: TraceSpan[]): TraceMetrics;
672
705
  // ============ 通用 JSON 操作纯函数(jsonUtils,refactor-module-extraction 从 dataOps 抽离;零依赖,经 ./query subpath 按需引入)============
673
706
  export type EditOp = 'set' | 'remove' | 'merge' | 'append';
674
707
  export declare const UNSAFE_KEYS: Set<string>;
@@ -753,12 +786,20 @@ export interface SdkEvents {
753
786
  hook(handler: (e: any) => void): () => void;
754
787
  }
755
788
  export declare function createSdkEvents(onEvent?: (e: any) => void): SdkEvents;
756
- export declare function selectBuiltinTools(caps: { dataOps?: boolean; fetch?: boolean; domInspect?: boolean } | undefined, dataOps: any[], fetchDocs: any[], dom?: any[]): any[];
789
+ export declare function selectBuiltinTools(caps: { dataOps?: boolean; fetch?: boolean; domInspect?: boolean; inspectEnv?: boolean } | undefined, dataOps: any[], fetchDocs: any[], dom?: any[], inspect?: any[]): any[];
757
790
  export declare function createUsageHintsMiddleware(caps: { planning?: boolean; dataOps?: boolean; subagent?: boolean } | undefined, hasDataOps: boolean, toolMode?: 'simple' | 'advanced' | 'minimal'): any;
758
791
  export declare const fetchDocTools: any[];
759
792
  /** DOM 读取工具 get_dom(随 capabilities.domInspect 装配,opt-in) */
760
793
  export declare const domTools: any[];
761
794
  export declare const domToolsStatic: any[];
795
+ /** 环境探查工具 inspect_env(随 capabilities.inspectEnv 默认装配,默认开;排查 window/location/调试变量) */
796
+ export declare const inspectTools: any[];
797
+ /** 单个 inspect_env 工具(inspectTools 数组的元素) */
798
+ export declare const inspectEnvTool: any;
799
+ /** 纯函数:安全序列化任意值(跳过 function/DOM,防循环引用,截断)—— inspect_env 读 window[key] 时用 */
800
+ export declare function safeSerialize(value: unknown, depth?: number, maxLen?: number, seen?: WeakSet<object>): unknown;
801
+ /** 环境摘要(location/navigator/viewport/document);inspect_env 无参时返回,可传 win 注入测试 */
802
+ export declare function getEnvSummary(win?: Window & typeof globalThis): Record<string, unknown>;
762
803
  export declare const getDomTool: any;
763
804
  /** 纯函数:DOM Element → 结构化 DomNode(可单测,与浏览器解耦) */
764
805
  export declare function domToStructure(node: Element | null, opts: { depth: number; attrs?: string[]; includeText?: boolean }): DomNode | null;