page-agent-sdk 3.47.0 → 4.1.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 +7 -8
- package/README.zh-CN.md +8 -9
- package/dist/page-agent-sdk.headless.js +3244 -3226
- package/dist/page-agent-sdk.iife.js +141 -140
- package/dist/page-agent-sdk.js +5231 -5264
- package/dist/page-agent-sdk.legacy.js +13781 -13824
- package/dist/page-agent-sdk.umd.cjs +111 -110
- package/dist/style.css +1 -1
- package/package.json +1 -2
- package/skills/page-agent-sdk-integrate/SKILL.md +1 -1
- package/skills/page-agent-sdk-integrate/references/api.md +13 -17
- package/style.css +1 -1
- package/types/headless.d.ts +99 -62
- package/types/index.d.ts +100 -144
package/types/headless.d.ts
CHANGED
|
@@ -141,7 +141,6 @@ export type SdkEvent =
|
|
|
141
141
|
| { type: 'session_restored'; sessionId: string; rounds: number }
|
|
142
142
|
| { type: 'usage'; round: number; usage: TokenUsage; cumulative: TokenUsage }
|
|
143
143
|
| { type: 'error'; message: string; severity?: 'recoverable' | 'fatal' | 'observable'; code?: string; context?: unknown }
|
|
144
|
-
| { type: 'trace'; spans: TraceSpan[]; metrics: TraceMetrics }
|
|
145
144
|
| { type: 'context_trimmed'; dropped: { round: number; user: unknown; assistant: unknown[]; steps: unknown[] }[]; vfsResults: Record<string, string>; summary: string; reason: string }
|
|
146
145
|
| { type: 'focus_chip_click'; path: string; label?: string }
|
|
147
146
|
| { type: 'focus_change'; focuses: Focus[] };
|
|
@@ -269,6 +268,8 @@ export interface SubagentInfo {
|
|
|
269
268
|
enabled: boolean;
|
|
270
269
|
maxDepth: number;
|
|
271
270
|
maxParallel: number;
|
|
271
|
+
/** 单次委派总时长毫秒(flow-robustness P1#4 反射:undefined → 默认 600000;0 = 关) */
|
|
272
|
+
timeoutMs: number;
|
|
272
273
|
allowedTools: string[];
|
|
273
274
|
/** 预声明子 agent 列表(动态:反映 setSubagents/addSubagent/removeSubagent 后的最新) */
|
|
274
275
|
subagents?: { id: string; description: string }[];
|
|
@@ -347,8 +348,6 @@ export interface AgentInfo {
|
|
|
347
348
|
};
|
|
348
349
|
/** 会话级 checkpoint 装载状态(未开启 → undefined) */
|
|
349
350
|
checkpoints?: { enabled: boolean; auto: boolean; list: CheckpointMeta[] };
|
|
350
|
-
/** 结构化追踪(revive-observability-tracing;capabilities.tracing 开时填充,否则 undefined) */
|
|
351
|
-
trace?: { spans: TraceSpan[]; metrics: TraceMetrics };
|
|
352
351
|
/** 上下文构成快照(context-inspector;每轮 wrapModelCall 覆盖;capabilities.contextInspector:false → undefined) */
|
|
353
352
|
context?: ContextSnapshot;
|
|
354
353
|
}
|
|
@@ -503,6 +502,10 @@ export interface DataOpsOptions {
|
|
|
503
502
|
onConflict?: (conflict: ConflictInfo) => Promise<ConflictResolution>;
|
|
504
503
|
/** 冲突监听字段白名单(任意深度字段名):声明后仅这些字段的值变动触发自动冲突检测(位置不敏感);未声明 = 不开自动检测(仅显式 expectedHash 校验);['*'] = 全字段检测(旧 autoLock 行为) */
|
|
505
504
|
conflictWatchFields?: string[];
|
|
505
|
+
/**
|
|
506
|
+
* 同轮工具并发上限(createAgent 透传):>1 且 conflictWatchFields 武装时启用 dataOps 闭包级并发写互锁(async mutex,单锁 bind 域)—— 同轮并发双写不再「双双过旧基线、后者静默覆盖前者」;串行/未武装直通 no-op 零行为变化
|
|
507
|
+
*/
|
|
508
|
+
maxParallelTools?: number;
|
|
506
509
|
}
|
|
507
510
|
|
|
508
511
|
/** 数据操作控制器(运行时替换配置;createDataOps 返回的工具数组上以不可枚举属性 `controller` 挂载) */
|
|
@@ -568,11 +571,11 @@ export interface SkillRefSpec {
|
|
|
568
571
|
doc?: string;
|
|
569
572
|
getContent?: () => string | Promise<string>;
|
|
570
573
|
}
|
|
571
|
-
/** skill 执行钩子:code(内联 JS)/url(远程,仅 sandbox)二选一;context 默认 sandbox
|
|
574
|
+
/** skill 执行钩子:code(内联 JS)/url(远程,仅 sandbox)二选一;context 默认 sandbox(host 已随 4.1.0 移除,残值落 sandbox 执行) */
|
|
572
575
|
export interface SkillExecSpec {
|
|
573
576
|
code?: string;
|
|
574
577
|
url?: string;
|
|
575
|
-
context?: 'sandbox'
|
|
578
|
+
context?: 'sandbox';
|
|
576
579
|
inject?: 'append' | 'prepend';
|
|
577
580
|
}
|
|
578
581
|
/** skill 附带工具工厂(返回单个/数组工具,可异步;ctx.signal 运行时中止信号) */
|
|
@@ -583,6 +586,8 @@ export type SkillToolFactory = () => any | any[] | Promise<any | any[]>;
|
|
|
583
586
|
export interface VerifyCheckContext {
|
|
584
587
|
messages: any[];
|
|
585
588
|
state: any;
|
|
589
|
+
/** 结构化日志(debugLogs;render-check 类环境降级留痕用,可缺省) */
|
|
590
|
+
log?: (type: string, data: unknown) => void;
|
|
586
591
|
}
|
|
587
592
|
export interface VerifyCheckResult {
|
|
588
593
|
ok: boolean;
|
|
@@ -617,8 +622,10 @@ export interface ApprovalOptions {
|
|
|
617
622
|
tools?: string[];
|
|
618
623
|
/** 自定义判定(优先于 tools);返回 true 需确认 */
|
|
619
624
|
confirm?: (name: string, args: any) => boolean;
|
|
620
|
-
/** 超时毫秒(
|
|
625
|
+
/** 超时毫秒(无响应自动拒绝);SDK 装配层默认 30000(响应方调事件的 hold() 接管后不限时);显式 Infinity/负数 = 不超时 */
|
|
621
626
|
timeoutMs?: number;
|
|
627
|
+
/** 超时自动拒的留痕回调(abort/用户先收口不触发) */
|
|
628
|
+
onAutoReject?: (info: { toolName: string; waitedMs: number }) => void;
|
|
622
629
|
/** 是否装载 request_human_confirmation 主动确认工具(传 approval 时默认 true;false 关闭) */
|
|
623
630
|
humanConfirmTool?: boolean;
|
|
624
631
|
}
|
|
@@ -631,14 +638,14 @@ export interface PlanConfirmationRecord {
|
|
|
631
638
|
choice: string;
|
|
632
639
|
viaOptions: true;
|
|
633
640
|
}
|
|
634
|
-
|
|
635
|
-
export
|
|
636
|
-
/** 大批量变更门禁(bulk-change-guard):量纲 = 现有组件节点数;默认关,须配 approval 才装配 */
|
|
637
|
-
export interface BulkGuardOptions {
|
|
638
|
-
threshold?: number;
|
|
641
|
+
/** humanConfirm 中间件可选项:timeoutMs 无响应自动拒(超时视同拒绝);onAutoReject 超时留痕回调 */
|
|
642
|
+
export interface HumanConfirmOptions {
|
|
639
643
|
timeoutMs?: number;
|
|
640
|
-
|
|
644
|
+
onAutoReject?: (info: { toolName: string; waitedMs: number }) => void;
|
|
641
645
|
}
|
|
646
|
+
export declare function createHumanConfirmMiddleware(onResolved?: (record: PlanConfirmationRecord) => void, opts?: HumanConfirmOptions): any;
|
|
647
|
+
export declare const HUMAN_CONFIRM_TOOL_NAME: string;
|
|
648
|
+
/** 写触达量纲结果(原 bulk-change-guard 量纲;bulkGuard 已于 4.1.0 移除,函数为 delegateNudge 依赖保留) */
|
|
642
649
|
export interface WriteScaleResult {
|
|
643
650
|
count: number;
|
|
644
651
|
scopes: string[];
|
|
@@ -646,19 +653,6 @@ export interface WriteScaleResult {
|
|
|
646
653
|
}
|
|
647
654
|
/** 度量单次写调用触达的现有组件节点数(纯函数:同组件多 patch=1;新增路径不计) */
|
|
648
655
|
export declare function measureWriteScale(args: unknown, getBind: () => unknown): WriteScaleResult;
|
|
649
|
-
/** 中间件工厂参数(getBind/tools/getPlanConfirmation/onEvent;挂起经 ctx.emit approval_request) */
|
|
650
|
-
export interface BulkGuardMiddlewareOptions extends BulkGuardOptions {
|
|
651
|
-
getBind: () => unknown;
|
|
652
|
-
tools?: unknown[];
|
|
653
|
-
getPlanConfirmation?: () => { at: number; summary: string } | undefined;
|
|
654
|
-
onEvent?: (info: { stage: 'bulk_guard'; decision: 'confirm' | 'observe' | 'exempt-plan' | 'exempt-once' | 'pass' | 'timeout' | 'rejected'; kind: string; count: number }) => void;
|
|
655
|
-
}
|
|
656
|
-
/** 会话级豁免态(每形态确认过一次本会话放行;reset 钩子接 switch/resetSession) */
|
|
657
|
-
export interface BulkGuardState {
|
|
658
|
-
confirmedKinds: Set<string>;
|
|
659
|
-
reset(): void;
|
|
660
|
-
}
|
|
661
|
-
export declare function createBulkGuardMiddleware(opts: BulkGuardMiddlewareOptions): any;
|
|
662
656
|
export interface CheckpointMeta {
|
|
663
657
|
id: number;
|
|
664
658
|
label?: string;
|
|
@@ -694,6 +688,8 @@ export interface StorageConfig {
|
|
|
694
688
|
maxBytesPerSession?: number;
|
|
695
689
|
evictionWatermark?: number;
|
|
696
690
|
debounceMs?: number;
|
|
691
|
+
/** flush 单项落盘超时 ms(默认 5000):IDB 事务卡死不拖死 flush 调用方,超时项留待后续 flush/pagehide 重试 */
|
|
692
|
+
flushTimeoutMs?: number;
|
|
697
693
|
}
|
|
698
694
|
/** Skill 独立持久化存储配置(与 storage 选项分离) */
|
|
699
695
|
export interface SkillStoreConfig {
|
|
@@ -840,6 +836,10 @@ export interface ChatSdkOptions {
|
|
|
840
836
|
maxRetries?: number;
|
|
841
837
|
/** LLM 流停滞看门狗(fix-hang-and-feedback P1-7):chunk 间隔(含等首个)超此 ms → 中断抛错防 loading 永转。默认 90s;0 = 关闭 */
|
|
842
838
|
streamStallMs?: number;
|
|
839
|
+
/**
|
|
840
|
+
* per-tool 看门狗:单工具执行超此 ms → 放弃等待,recoverable 错误结果回灌自纠(防集成方工具永不 settle 拖死整轮:loading 永转 + stop 无效)。只对集成方注入工具生效(defineTool / actions / skill 工具工厂 / rag retriever);内置/MCP/委派与 conflict ask 挂起是设计内等待,豁免。默认 120s;0 = 关闭
|
|
841
|
+
*/
|
|
842
|
+
toolTimeoutMs?: number;
|
|
843
843
|
/** token 预算上限(累计 total_tokens 超过 → 停止 agent + emit BUDGET_EXCEEDED;需 capabilities.automation:true) */
|
|
844
844
|
tokenBudget?: number;
|
|
845
845
|
/** 单次 invoke 的 token 预算上限(opt-in,默认关):本次 agent 调用累计 total_tokens 超限 → 中断收口(observable emit + 友好文本,已完成部分保留);与 automation 全局 tokenBudget 正交 */
|
|
@@ -857,16 +857,14 @@ export interface ChatSdkOptions {
|
|
|
857
857
|
/** 模型最大输出(token);顶层声明对 llm 实例场景也生效,缺省按 model 名查表 */
|
|
858
858
|
maxOutputTokens?: number;
|
|
859
859
|
/** 子 agent 委派(默认开启;{ enabled: false } 关闭) */
|
|
860
|
-
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;
|
|
861
|
-
subagent?: { enabled?: boolean; allowedTools?: string[]; systemPrompt?: string; temperature?: number; maxTokens?: number; skills?: SkillSpec[]; llm?: LLMConfig | ChatModelLike; maxDepth?: number; maxParallel?: number; timeoutMs?: number; thinkingMode?: 'simple' | 'deep' };
|
|
860
|
+
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; automation?: boolean; workingMemory?: boolean; focus?: boolean; contextInspector?: boolean; agentCompression?: boolean };/** tracing/skillHostScript/preferences/bulkGuard 已于 4.1.0 移除;残键静默忽略 */
|
|
861
|
+
subagent?: { enabled?: boolean; allowedTools?: string[]; systemPrompt?: string; temperature?: number; maxTokens?: number; skills?: SkillSpec[]; llm?: LLMConfig | ChatModelLike; maxDepth?: number; maxParallel?: number; /** 单次委派总时长毫秒(默认 600000=10min;超时 abort 子流 + recoverable 回灌;0 = 不限制) */ timeoutMs?: number; thinkingMode?: 'simple' | 'deep' };
|
|
862
862
|
/** 预声明子 agent 列表:每个用同主配置方式声明,自动生成 use_<id> 委派工具(与 spawn_agent 共存) */
|
|
863
863
|
subagents?: SubagentConfig[];
|
|
864
864
|
/** 自检:agent 返回前跑 check,不通过则 feedback 回灌自纠(默认关闭;需 capabilities.verify:true)。check 省略时默认 createWriteBackCheck 写后读回验证 */
|
|
865
865
|
verify?: { enabled?: boolean; check?: VerifyCheck; maxAttempts?: number; adversarial?: boolean };
|
|
866
866
|
/** 人工确认:工具调用前弹确认框,用户「允许/拒绝」后才执行(默认关闭,不传 = 不装) */
|
|
867
867
|
approval?: ApprovalOptions;
|
|
868
|
-
/** 大批量变更门禁(默认关;capabilities.bulkGuard:true 开启,须同时配置 approval 否则 no-op)。量纲 = 现有组件节点数(同组件多 patch 不拦,新增内容不计);超阈挂 approval(自带 timeoutMs 超时自动拒);mode:'observe' 无人值守只留痕 */
|
|
869
|
-
bulkGuard?: { threshold?: number; timeoutMs?: number; mode?: 'confirm' | 'observe' };
|
|
870
868
|
/** 主动征询(默认开启):装载 request_human_confirmation 工具,LLM 在不确定/多方案/高风险时主动征询;false 关闭(types-alignment 补漏) */
|
|
871
869
|
humanConfirm?: boolean;
|
|
872
870
|
/** 会话级 checkpoint 回滚(回到上次正常时)。默认关闭;传 true 或 { maxCheckpoints?, auto? } 开启 */
|
|
@@ -1140,7 +1138,7 @@ export declare function defineTool(opts: {
|
|
|
1140
1138
|
writeCapable?: boolean | ((args: Record<string, unknown>) => boolean);
|
|
1141
1139
|
}): any;
|
|
1142
1140
|
export declare function createDataOps(config: DataConfig, opts?: DataOpsOptions): any[];
|
|
1143
|
-
/** 整体 set 写入纯函数:schema 校验 + 快照 + merge/替换 + audit。
|
|
1141
|
+
/** 整体 set 写入纯函数:schema 校验 + 快照 + merge/替换 + audit。write(set) / draft_commit 共用。返回 {ok,hash,data} 或 {ok:false,error} */
|
|
1144
1142
|
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'; snapshotLabel?: string }): { ok: true; hash: string; data: unknown; notices: string[] } | { ok: false; error: string };
|
|
1145
1143
|
export interface LocalWriteBack {
|
|
1146
1144
|
op: 'set' | 'remove' | 'move' | 'mergeKeys' | 'appendElems';
|
|
@@ -1159,34 +1157,6 @@ export interface LocalValidationPlan {
|
|
|
1159
1157
|
export declare function validateRootValueLocally(args: { schema: any; allowKeys: string[] | null; value: unknown; bindRef: unknown }): { ok: true; assembly: unknown; wholeParsed: Record<string, unknown> | null; notices: string[] } | { ok: false; error: string; notices: string[] };
|
|
1160
1158
|
export declare function validateWriteLocally(args: { schema: any; bindRef: unknown; clone: unknown; patches: { op?: string; jsonPath?: string; value?: unknown }[]; schemaErrorMode?: 'zod' | 'schema_invalid'; appendCaptures: { jp: string; elems: unknown[] }[]; moveCaptures: { jp: string; toPath: string; elem: unknown }[]; valueAt?: (jp: string) => unknown }): LocalValidationPlan;
|
|
1161
1159
|
export declare function applyPatchesToBind(args: { bindRef: unknown; patches: { op?: string; jsonPath?: string; value?: unknown }[]; schema: any; allowKeys: string[] | null; snapshots: any[]; maxSnapshots: number; markDataDirty?: () => void; schemaErrorMode?: 'zod' | 'schema_invalid'; snapshotLabel?: string; dryRun?: boolean; internalAfterWrite?: (bind: any, before: any) => void; protectedCtx?: unknown }): { ok: true; applied: { op: string; jp: string; value: unknown }[]; clone: unknown; notices: string[] } | { ok: false; error: string };
|
|
1162
|
-
/** 结构化追踪 span(revive-observability-tracing Phase 3) */
|
|
1163
|
-
export type SpanType = 'round' | 'model' | 'tool' | 'compression';
|
|
1164
|
-
export type SpanStatus = 'ok' | 'error' | 'timeout';
|
|
1165
|
-
export interface TraceSpan {
|
|
1166
|
-
id: string;
|
|
1167
|
-
parentId?: string;
|
|
1168
|
-
name: string;
|
|
1169
|
-
type: SpanType;
|
|
1170
|
-
startTs: number;
|
|
1171
|
-
endTs?: number;
|
|
1172
|
-
durationMs?: number;
|
|
1173
|
-
status: SpanStatus;
|
|
1174
|
-
attributes: Record<string, unknown>;
|
|
1175
|
-
}
|
|
1176
|
-
export interface TraceMetrics {
|
|
1177
|
-
rounds: number;
|
|
1178
|
-
totalDurationMs: number;
|
|
1179
|
-
avgRoundMs: number;
|
|
1180
|
-
toolCalls: number;
|
|
1181
|
-
toolFailures: number;
|
|
1182
|
-
toolSuccessRate: number;
|
|
1183
|
-
modelCalls: number;
|
|
1184
|
-
retries: number;
|
|
1185
|
-
compressions: number;
|
|
1186
|
-
totalTokens?: { prompt: number; completion: number; total: number };
|
|
1187
|
-
}
|
|
1188
|
-
/** 从 TraceSpan[] 聚合 metrics(纯函数:轮次/延迟/工具成功率/重试/压缩/token) */
|
|
1189
|
-
export declare function getTraceMetrics(spans: TraceSpan[]): TraceMetrics;
|
|
1190
1160
|
// ============ 通用 JSON 操作纯函数(jsonUtils,refactor-module-extraction 从 dataOps 抽离;零依赖,经 ./query subpath 按需引入)============
|
|
1191
1161
|
export type EditOp = 'set' | 'remove' | 'merge' | 'append';
|
|
1192
1162
|
export declare const UNSAFE_KEYS: Set<string>;
|
|
@@ -1322,7 +1292,6 @@ export type CapabilityFlags = Partial<Record<string, boolean>>;
|
|
|
1322
1292
|
export type ResolvedCapabilities = Record<string, boolean>;
|
|
1323
1293
|
export declare const CAPABILITIES: readonly Capability[];
|
|
1324
1294
|
/** 已列入移除计划的配置键(config-surface-pruning;warn 一版后移除) */
|
|
1325
|
-
export declare const DEPRECATED_CAPABILITIES: Readonly<Record<string, string>>;
|
|
1326
1295
|
/** 单一解析:集成方原始 caps(Partial)→ 全量 boolean(opt-out 默认开 !==false / opt-in 默认关 ===true;requires 依赖未满足强制关)。参数宽松 Record<string,unknown>(兼容含 subagents 等非 boolean 字段的 caps 对象;只读已知 capability 的 boolean) */
|
|
1327
1296
|
export declare function resolveCapabilities(caps?: Record<string, unknown>): ResolvedCapabilities;
|
|
1328
1297
|
export declare function resolveStorage(storage: any): any | null;
|
|
@@ -1455,7 +1424,7 @@ export interface JpNode {
|
|
|
1455
1424
|
path: string;
|
|
1456
1425
|
/** 匹配元素值 */
|
|
1457
1426
|
value: unknown;
|
|
1458
|
-
/** 父为数组时的索引(便于后续
|
|
1427
|
+
/** 父为数组时的索引(便于后续 write patch 的 jsonPath 定位) */
|
|
1459
1428
|
index?: number;
|
|
1460
1429
|
}
|
|
1461
1430
|
export interface SearchHit {
|
|
@@ -1494,8 +1463,6 @@ export interface SandboxResult {
|
|
|
1494
1463
|
* 无 input 传 undefined(skill exec);有 input 作 data 入参(eval_script)。
|
|
1495
1464
|
*/
|
|
1496
1465
|
export declare function createSandboxRunner(script: string, timeoutMs?: number): (input?: unknown) => Promise<SandboxResult>;
|
|
1497
|
-
/** 宿主脚本执行(skill exec context:'host';AsyncFunction 主线程全权,不经静态扫描,需 capabilities.skillHostScript:true) */
|
|
1498
|
-
export declare function runHostScript(code: string, timeoutMs?: number): Promise<SandboxResult>;
|
|
1499
1466
|
|
|
1500
1467
|
// ============ 工具报错(结构化 ERROR:{json},供 LLM 排查)============
|
|
1501
1468
|
export interface ToolErrorInput {
|
|
@@ -1640,6 +1607,76 @@ export interface HtmlFormatCheckOptions {
|
|
|
1640
1607
|
}
|
|
1641
1608
|
/** HTML 格式 verify check(beforeReturn 门禁):扫 state.files 代码文件,不通过回灌 feedback 自纠 */
|
|
1642
1609
|
export declare function createHtmlFormatCheck(opts?: HtmlFormatCheckOptions): VerifyCheck;
|
|
1610
|
+
/** 沙箱采集到的原始渲染信号(console.error / js-error / unhandledrejection / 资源失败 / CSP 违规 / console.warn) */
|
|
1611
|
+
export interface RenderSignal {
|
|
1612
|
+
type: 'console-error' | 'console-warn' | 'js-error' | 'unhandledrejection' | 'resource-error' | 'csp-violation';
|
|
1613
|
+
message: string;
|
|
1614
|
+
source?: string;
|
|
1615
|
+
lineno?: number;
|
|
1616
|
+
}
|
|
1617
|
+
/** 渲染指标(收集窗结束时采集;白屏判定口径 = 内容级:body 子节点数 / scrollHeight / 图片数) */
|
|
1618
|
+
export interface RenderMetrics {
|
|
1619
|
+
bodyChildren: number;
|
|
1620
|
+
scrollHeight: number;
|
|
1621
|
+
imgCount: number;
|
|
1622
|
+
}
|
|
1623
|
+
/** 单组件沙箱渲染的原始结果(未归一;noDom = node/无 DOM 环境标记) */
|
|
1624
|
+
export interface RawRenderResult {
|
|
1625
|
+
handshake: boolean;
|
|
1626
|
+
signals: RenderSignal[];
|
|
1627
|
+
metrics?: RenderMetrics;
|
|
1628
|
+
timedOut?: boolean;
|
|
1629
|
+
noDom?: boolean;
|
|
1630
|
+
}
|
|
1631
|
+
/** 归一后的单组件判定:pass / fail(带 problems)/ unavailable(握手缺失或超时,不算通过防假绿) */
|
|
1632
|
+
export interface RenderVerdict {
|
|
1633
|
+
verdict: 'pass' | 'fail' | 'unavailable';
|
|
1634
|
+
problems: string[];
|
|
1635
|
+
warnings: string[];
|
|
1636
|
+
metrics?: RenderMetrics;
|
|
1637
|
+
reason?: 'handshake-missing' | 'timeout';
|
|
1638
|
+
}
|
|
1639
|
+
/** 渲染自检 VerifyCheck 工厂选项(runner 注入供测试桩用) */
|
|
1640
|
+
export interface HtmlRenderCheckOptions {
|
|
1641
|
+
vfsPrefix?: string;
|
|
1642
|
+
codeField?: string;
|
|
1643
|
+
writablePaths?: string[];
|
|
1644
|
+
runner?: (html: string) => Promise<RawRenderResult>;
|
|
1645
|
+
maxTargets?: number;
|
|
1646
|
+
}
|
|
1647
|
+
/** 渲染自检对象:check 组合进 createHtmlSubagent 的 formatCheck 链;两个注入槽由装配期回填 */
|
|
1648
|
+
export interface HtmlRenderCheck {
|
|
1649
|
+
check: VerifyCheck;
|
|
1650
|
+
setGetController: (g: () => {
|
|
1651
|
+
get?: () => { bind?: unknown } | null | undefined;
|
|
1652
|
+
} | null | undefined) => void;
|
|
1653
|
+
setWritablePaths: (paths: string[]) => void;
|
|
1654
|
+
}
|
|
1655
|
+
/** 沙箱运行参数(活动静默窗/硬上限/指标应答宽限;默认 900ms / 4000ms / 500ms) */
|
|
1656
|
+
export interface SandboxRunOptions {
|
|
1657
|
+
silenceMs?: number;
|
|
1658
|
+
hardCapMs?: number;
|
|
1659
|
+
metricsGraceMs?: number;
|
|
1660
|
+
}
|
|
1661
|
+
/**
|
|
1662
|
+
* 渲染级自检(render-check):本轮触达的 code 资产放沙箱 iframe(srcdoc + sandbox="allow-scripts")独立渲染,
|
|
1663
|
+
* 采集 console.error / window.onerror / unhandledrejection / 资源失败 / 白屏指标 → 归一回灌自纠。
|
|
1664
|
+
* 仅门禁形态(组合进 createHtmlSubagent 的 formatCheck 链);node/无 DOM 自动跳过渲染段保留结构段;
|
|
1665
|
+
* 握手缺失(宿主 CSP 拦沙箱内联脚本)/ 超时 → unavailable 不算通过(零信号 ≠ 通过)。
|
|
1666
|
+
*/
|
|
1667
|
+
export declare function createHtmlRenderCheck(opts?: HtmlRenderCheckOptions): HtmlRenderCheck;
|
|
1668
|
+
/** 组合「结构 → 渲染」为单一 VerifyCheck(结构不过短路渲染;runBeforeReturn 不短路,两段必须单 check 内早返回) */
|
|
1669
|
+
export declare function composeStructureThenRender(structure: VerifyCheck, render: VerifyCheck): VerifyCheck;
|
|
1670
|
+
/** 信号归一纯函数:storage 类 SecurityError 降 warn(沙箱假阳性);无失败信号但 body 空 + scrollHeight<10 → 疑似白屏 fail */
|
|
1671
|
+
export declare function normalizeRenderResult(raw: RawRenderResult): RenderVerdict;
|
|
1672
|
+
/** 单组件沙箱渲染(离屏 iframe;用后销毁;node/无 DOM 返回 noDom) */
|
|
1673
|
+
export declare function renderInSandbox(html: string, opts?: SandboxRunOptions): Promise<RawRenderResult>;
|
|
1674
|
+
/** 沙箱 srcdoc 构造(collector 注入文档最前,不改组件原文) */
|
|
1675
|
+
export declare function buildSandboxSrcdoc(html: string, nonce: string): string;
|
|
1676
|
+
/** collector 采集脚本源码(nonce 握手 + 信号上报 + 活动信号 + 指标应答) */
|
|
1677
|
+
export declare function buildCollectorJs(nonce: string): string;
|
|
1678
|
+
/** 累计/销毁的沙箱 iframe 数(测试观察「用后销毁」契约) */
|
|
1679
|
+
export declare function getSandboxLifecycle(): { created: number; destroyed: number };
|
|
1643
1680
|
|
|
1644
1681
|
// checkpoint / dataOps / permissions
|
|
1645
1682
|
export interface CheckpointDeps { [k: string]: any }
|