@webskill/sdk 0.10.0 → 0.11.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.
Files changed (34) hide show
  1. package/dist/agent.d.ts +3 -2
  2. package/dist/agent.js +3 -1102
  3. package/dist/browser.d.ts +258 -11
  4. package/dist/browser.js +758 -46
  5. package/dist/{catalogComponents-DTcYfpLQ-CcoOaz-Z.js → catalogComponents-BFoqpT1v-CjUBZ3bc.js} +253 -14
  6. package/dist/{dist-BViUeszk.js → dist-B-cOu08W.js} +526 -76
  7. package/dist/{dist-1OFC-zax.js → dist-DTHZS2k1.js} +520 -28
  8. package/dist/dist-qnlI2Iup.js +1280 -0
  9. package/dist/{eventTypes-s2uwAcLG-Go3l_dUe.js → eventTypes-FllCrX-Z-DNDeHWoG.js} +6 -2
  10. package/dist/governance.d.ts +7 -3
  11. package/dist/governance.js +1 -1
  12. package/dist/{index-DtFdMKBX.d.ts → index-D3mONFHD.d.ts} +220 -7
  13. package/dist/{index-B0QPLWPZ.d.ts → index-DACk2_XZ.d.ts} +110 -7
  14. package/dist/{index-BF4E1a9j.d.ts → index-DWbs58LF.d.ts} +227 -14
  15. package/dist/index.d.ts +4 -4
  16. package/dist/index.js +3 -3
  17. package/dist/mcp.d.ts +35 -7
  18. package/dist/mcp.js +88 -21
  19. package/dist/node.d.ts +3 -3
  20. package/dist/node.js +52 -2
  21. package/dist/{openUiLibrary-CIrV--Ad-B8zG_91e.js → openUiLibrary-D5u8oIvx-BLOAQCho.js} +3 -3
  22. package/dist/processSandboxEntry.js +6 -0
  23. package/dist/sandboxWorkerEntry.js +6 -0
  24. package/dist/{skillVersionStore-D-qHk9ZE-DBsYYCWn.d.ts → skillVersionStore-D-qHk9ZE-BcmFLykd.d.ts} +1 -1
  25. package/dist/testing.d.ts +1 -1
  26. package/dist/{types-CrRcT-LM-DZAp8sWv.d.ts → types-C26b05fW-CdrRCRDb.d.ts} +20 -4
  27. package/dist/ui-react.d.ts +2 -2
  28. package/dist/ui-react.js +28 -10
  29. package/dist/ui-vue.d.ts +1 -1
  30. package/dist/ui-vue.js +2 -2
  31. package/dist/ui.d.ts +4 -4
  32. package/dist/ui.js +3 -3
  33. package/dist/{webskillLitCatalog-BJrphK0y-SGmRXaaO.js → webskillLitCatalog-DME6PBkV-CmYNLlIT.js} +135 -16
  34. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- //#region ../governance/dist/eventTypes-s2uwAcLG.js
1
+ //#region ../governance/dist/eventTypes-FllCrX-Z.js
2
2
  /**
3
3
  * 审计事件类型常量(FR-13.4)。
4
4
  *
@@ -39,7 +39,11 @@ const AUDIT_EVENT_TYPES = {
39
39
  candidateApproved: "candidate.approved",
40
40
  candidateRejected: "candidate.rejected",
41
41
  pagePerceived: "page.perceived",
42
- pageAction: "page.action"
42
+ pageAction: "page.action",
43
+ documentRead: "document.read",
44
+ documentSurfaceOpen: "document.surface.open",
45
+ /** 脚本按宿主声明的数据源取数(分册 16);被拒也记,否则反复试探看不见 */
46
+ dataFetched: "data.fetch"
43
47
  };
44
48
  /** 稳定展示序:筛选下拉与文档表格都从这里取,不各自维护一份顺序 */
45
49
  const AUDIT_EVENT_TYPE_LIST = Object.values(AUDIT_EVENT_TYPES);
@@ -1,6 +1,6 @@
1
- import { R as FileSystemProvider, S as UiBridge, U as Page, W as PageQuery, f as LlmMessage, it as SkillCatalogEntry, l as LlmClient, ot as SkillDocument, ut as SkillManagerPort } from "./types-CrRcT-LM-DZAp8sWv.js";
2
- import { H as IntegrityVerdict, Ht as SkillStateGuard, Lt as SkillIntegrityGuard, Rt as SkillOutcomeReporter, mn as WebSkillRuntime, xt as RuntimeRun } from "./index-DtFdMKBX.js";
3
- import { _ as SkillState, a as AuditLog, b as SkillVersionStore, c as CandidateFile, d as CandidateSkill, f as CandidateSource, g as SKILL_VERSION_PAGE_SIZE, h as CompositeApprovalPolicy, i as AuditEvent, l as CandidatePage, m as CandidateStore, n as ApprovalDecision, o as AuditQueryFilter, p as CandidateStatus, r as ApprovalPolicy, s as CANDIDATE_PAGE_SIZE, t as AlwaysHumanApprovalPolicy, u as CandidateRisk, v as SkillVersion, x as candidateToCatalogEntry, y as SkillVersionPage } from "./skillVersionStore-D-qHk9ZE-DBsYYCWn.js";
1
+ import { R as FileSystemProvider, S as UiBridge, U as Page, W as PageQuery, f as LlmMessage, it as SkillCatalogEntry, l as LlmClient, ot as SkillDocument, ut as SkillManagerPort } from "./types-C26b05fW-CdrRCRDb.js";
2
+ import { At as RuntimeRun, En as WebSkillRuntime, J as IntegrityVerdict, Jt as SkillOutcomeReporter, Qt as SkillStateGuard, qt as SkillIntegrityGuard } from "./index-D3mONFHD.js";
3
+ import { _ as SkillState, a as AuditLog, b as SkillVersionStore, c as CandidateFile, d as CandidateSkill, f as CandidateSource, g as SKILL_VERSION_PAGE_SIZE, h as CompositeApprovalPolicy, i as AuditEvent, l as CandidatePage, m as CandidateStore, n as ApprovalDecision, o as AuditQueryFilter, p as CandidateStatus, r as ApprovalPolicy, s as CANDIDATE_PAGE_SIZE, t as AlwaysHumanApprovalPolicy, u as CandidateRisk, v as SkillVersion, x as candidateToCatalogEntry, y as SkillVersionPage } from "./skillVersionStore-D-qHk9ZE-BcmFLykd.js";
4
4
  //#region ../governance/dist/index.d.ts
5
5
  //#region src/candidate/candidateNormalizer.d.ts
6
6
  /** 剥 markdown fence 与 <think> 块、截取首尾 {};非对象 → CANDIDATE_INVALID */
@@ -207,6 +207,10 @@ declare const AUDIT_EVENT_TYPES: {
207
207
  readonly candidateRejected: "candidate.rejected";
208
208
  readonly pagePerceived: "page.perceived";
209
209
  readonly pageAction: "page.action";
210
+ readonly documentRead: "document.read";
211
+ readonly documentSurfaceOpen: "document.surface.open";
212
+ /** 脚本按宿主声明的数据源取数(分册 16);被拒也记,否则反复试探看不见 */
213
+ readonly dataFetched: "data.fetch";
210
214
  };
211
215
  type AuditEventType = (typeof AUDIT_EVENT_TYPES)[keyof typeof AUDIT_EVENT_TYPES];
212
216
  /** 稳定展示序:筛选下拉与文档表格都从这里取,不各自维护一份顺序 */
@@ -1,6 +1,6 @@
1
1
  import { M as messageOf, _ as assertSafePathSegment, h as WebSkillError, k as isValidSkillName, v as atomicWriteText } from "./dist-Bev6i6Ip.js";
2
2
  import { a as textParts, n as partsToText } from "./memoryArtifactStore-52Zn9npI-LbCQaqyx.js";
3
- import { n as AUDIT_EVENT_TYPE_LIST, t as AUDIT_EVENT_TYPES } from "./eventTypes-s2uwAcLG-Go3l_dUe.js";
3
+ import { n as AUDIT_EVENT_TYPE_LIST, t as AUDIT_EVENT_TYPES } from "./eventTypes-FllCrX-Z-DNDeHWoG.js";
4
4
 
5
5
  //#region ../governance/dist/index.js
6
6
  const invalid = (message, details) => {
@@ -1,4 +1,4 @@
1
- import { B as JsonSchema, I as DiscoveryResult, O as UiSurfaceActionRequest, R as FileSystemProvider, S as UiBridge, St as ValidationReport, T as UiSpecEvent, Tt as WebSkillErrorCode, U as Page, W as PageQuery, _ as LlmToolSpec, at as SkillDiscovery, b as RenderResultRequest, bt as UiSpecNode, d as LlmContentPart, dt as SkillManifest, f as LlmMessage, g as LlmToolCall, h as LlmTokenUsage, i as FormField, it as SkillCatalogEntry, l as LlmClient, m as LlmStreamEvent, n as ArtifactStore, o as InteractionPolicy, ot as SkillDocument, p as LlmResponse, r as ChartSpec, rt as SkillCatalog, s as InteractionRequest, st as SkillInstallSource, t as Artifact, u as LlmCompleteInput, v as MemoryStore, w as UiSpecDrafts, y as RenderBlock } from "./types-CrRcT-LM-DZAp8sWv.js";
1
+ import { B as JsonSchema, G as RemoteUrlPolicy, I as DiscoveryResult, O as UiSurfaceActionRequest, R as FileSystemProvider, S as UiBridge, St as ValidationReport, T as UiSpecEvent, Tt as WebSkillErrorCode, U as Page, W as PageQuery, _ as LlmToolSpec, at as SkillDiscovery, b as RenderResultRequest, bt as UiSpecNode, d as LlmContentPart, dt as SkillManifest, f as LlmMessage, g as LlmToolCall, h as LlmTokenUsage, i as FormField, it as SkillCatalogEntry, l as LlmClient, m as LlmStreamEvent, n as ArtifactStore, o as InteractionPolicy, ot as SkillDocument, p as LlmResponse, r as ChartSpec, rt as SkillCatalog, s as InteractionRequest, st as SkillInstallSource, t as Artifact, u as LlmCompleteInput, v as MemoryStore, w as UiSpecDrafts, y as RenderBlock } from "./types-C26b05fW-CdrRCRDb.js";
2
2
  //#region ../runtime/dist/index.d.ts
3
3
  //#region src/llm/parts.d.ts
4
4
  /** 纯文本消息内容的构造快捷方式(引擎内部绝大多数消息仍是纯文本) */
@@ -22,6 +22,45 @@ type TextualToolContent = {
22
22
  text?: string;
23
23
  data?: unknown;
24
24
  };
25
+ /**
26
+ * 参与 `toolResultMaxBytes` 截断的分片类型(FR-23.3)。**判据的单一来源。**
27
+ *
28
+ * 白名单而不是黑名单:黑名单式下新加的分片默认「参与截断」,
29
+ * 漏改一处就会把一份 PDF 截成坏文件、把 docx 文本腰斩,而且没有任何报错。
30
+ * 白名单式下新分片默认**不参与**,要受文本预算约束必须显式加进来。
31
+ * @experimental
32
+ */
33
+ declare const TEXT_BUDGETED_CONTENT_TYPES: ReadonlySet<string>;
34
+ /**
35
+ * `file` 分片的上限(FR-23.4),量的是**实际上线的 base64 长度**而不是解码后的字节——
36
+ * provider 的限额算的是请求载荷。
37
+ *
38
+ * 2026-08-14 查证的三家上限:
39
+ * | provider | 上限 | 出处 |
40
+ * | --------- | --------------------------------------- | ----------------------- |
41
+ * | Anthropic | **32 MB**(**整个请求载荷**)、600 页 | PDF support / 请求大小 |
42
+ * | OpenAI | 单文件 50 MB,全部文件合计 50 MB | File inputs / 使用须知 |
43
+ * | Gemini | 50 MB 或 1000 页(内联与 Files API 同) | 文档理解 / 技术详情 |
44
+ *
45
+ * 取最小值 Anthropic 的 32 MB。它是**整个请求**的额度,不是文档单独的额度,
46
+ * 所以再留出余量给系统提示词、catalog(约 34 KB)、历史消息与其余分片。
47
+ * 25 000 KB base64 ≈ 18.75 MB 原始 PDF。取 1024 的整数倍:设置界面按 KB 展示,
48
+ * 十进制的 24 000 000 会显示成 23437.5 这种读不出来的数。
49
+ */
50
+ declare const DEFAULT_MAX_DOCUMENT_BYTES = 25600000;
51
+ /**
52
+ * `document-text` 分片的上限(FR-23.4)。
53
+ *
54
+ * 约束来自**上下文窗口**而不是请求大小:抽出来的文本要整段进上下文。
55
+ * 按英文约 4 字节/token 折算,500 KB ≈ 128K token,占 200K 窗口的多半,
56
+ * 给历史消息与模型的回答留下其余。
57
+ */
58
+ declare const DEFAULT_MAX_DOCUMENT_TEXT_BYTES = 512000;
59
+ /**
60
+ * 单次 fetchData 结果的字节上限(分册 16,FR-16.6):1000 KB。
61
+ * 结构化数据不是文档,量级差一个数量级;超出**只拒不截**——截断的 JSON 解不出来。
62
+ */
63
+ declare const DEFAULT_MAX_DATA_SOURCE_BYTES = 1024000;
25
64
  /**
26
65
  * 工具结果的内容分片(0.6.0 §1.1)。
27
66
  * `image` 分片不参与 `toolResultMaxBytes` 截断——那份预算是给文本的,
@@ -35,6 +74,27 @@ type ToolContent = TextualToolContent | {
35
74
  data: string;
36
75
  id: string;
37
76
  text?: undefined;
77
+ } |
78
+ /** 原样直通给模型的文档(PDF 等),受 `maxDocumentBytes` 约束 @experimental */
79
+ {
80
+ type: 'file';
81
+ mimeType: string;
82
+ data: string;
83
+ name?: string;
84
+ id: string;
85
+ text?: undefined;
86
+ } |
87
+ /**
88
+ * 从文档里抽出来的文本(docx 等),受 `maxDocumentTextBytes` 约束。
89
+ * 它**就是**文本,但与普通工具文本分开计预算:混算会出现
90
+ * 「PDF 读全了、Word 只读了一半」这种无法解释的差异。
91
+ * @experimental
92
+ */
93
+ {
94
+ type: 'document-text';
95
+ text: string;
96
+ name?: string;
97
+ id: string;
38
98
  };
39
99
  interface ToolResult {
40
100
  ok: boolean;
@@ -51,9 +111,19 @@ interface ScriptExecutionContext {
51
111
  skillName: string;
52
112
  runId: string;
53
113
  readReference(relativePath: string): Promise<string>;
114
+ /** 读技能自己的 `assets/`;与 readReference 共用路径断言,不得跨目录 @experimental */
115
+ readAsset?(relativePath: string): Promise<string>;
116
+ /** `assets/` 的典型内容是图片/字体/数据包,纯文本出口不够 @experimental */
117
+ readAssetBinary?(relativePath: string): Promise<Uint8Array>;
54
118
  writeArtifact(path: string, content: string | Uint8Array, options?: {
55
119
  mimeType?: string;
56
120
  }): Promise<Artifact>;
121
+ /**
122
+ * 按**宿主声明的 sourceId** 取数(FR-16.1)。脚本给不了 URL——
123
+ * 目标由宿主在 `DataSourceDef.target` 里写死,这就是「唯一授权面」。
124
+ * 宿主未装配即不存在(同 readAsset / confirm)。 @experimental
125
+ */
126
+ fetchData?(sourceId: string, params?: Record<string, unknown>): Promise<unknown>;
57
127
  /** 脚本主动请求人在环确认;策略见 InteractionPolicy.confirmations */
58
128
  confirm?(message: string): Promise<boolean>;
59
129
  /** 宿主侧降级 warning 出口(网络阻断等;引擎接线到 run.warning trace) */
@@ -329,14 +399,18 @@ declare const READ_SKILL_FILE_TOOL: ToolDefinition;
329
399
  //#endregion
330
400
  //#region src/tools/askUserTool.d.ts
331
401
  declare const ASK_USER_TOOL_NAME = "ask_user";
402
+ /** 一次 `ask_user` 能收的字段数上限(FR-11.3 裁决值),可由 `AgentLoopConfig` 覆盖 */
403
+ declare const ASK_USER_MAX_FIELDS = 20;
404
+ /** `fields[].type`:`FormField['type']` 的八种。`multi-select` 不在其中——它的值是数组(FR-11.1b) */
405
+ declare const ASK_USER_FIELD_TYPES: readonly ["text", "number", "boolean", "select", "textarea", "file", "password", "date"];
332
406
  declare const ASK_USER_INPUT_SCHEMA: JsonSchema;
333
407
  /** 内建工具:LLM 信息不足时主动向用户提问;仅当配置了 UiBridge 时注册 */
334
408
  declare const ASK_USER_TOOL: ToolDefinition;
335
409
  //#endregion
336
410
  //#region src/tools/scriptContext.d.ts
337
411
  /**
338
- * 脚本执行上下文:只暴露 readReference / writeArtifact 两个显式能力,
339
- * 不暴露 fs 本体(沙箱语义,对齐 deferred-items D1)。
412
+ * 脚本执行上下文:只暴露 readReference / readAsset / readAssetBinary / writeArtifact
413
+ * 四个显式能力,不暴露 fs 本体(沙箱语义,对齐 deferred-items D1)。
340
414
  */
341
415
  declare function createScriptContext(deps: {
342
416
  fs: FileSystemProvider;
@@ -346,6 +420,12 @@ declare function createScriptContext(deps: {
346
420
  runId: string;
347
421
  /** 提供时暴露 context.confirm(由引擎按交互策略实现) */
348
422
  confirm?: (message: string) => Promise<boolean>;
423
+ /**
424
+ * 提供时暴露 context.fetchData(引擎按 DataSourcePolicy 实现,FR-16.1)。
425
+ * 宿主没声明数据源就整个键不存在——脚本 `typeof context.fetchData` 即可探测,
426
+ * 不给「存在但永远失败」的假出口。
427
+ */
428
+ fetchData?: (sourceId: string, params?: Record<string, unknown>) => Promise<unknown>;
349
429
  /** 宿主侧降级 warning 出口(网络阻断等;引擎接线到 run.warning trace) */
350
430
  onWarning?: (message: string) => void;
351
431
  /** writeArtifact 创建产物后的回调(引擎记录新产物 ID,执行后单次 listArtifacts 过滤) */
@@ -416,6 +496,11 @@ type InteractLifecycleData = {
416
496
  /** complete / fail:终态原因 */
417
497
  interface TerminalLifecycleData {
418
498
  reason: RunTerminationReason;
499
+ /**
500
+ * 失败时的具体说明(`RuntimeRun.error.message`)。`reason` 只有七种取值,
501
+ * 说不出「哪个上限、哪个模型、本轮带了文档」这类唯一能指导下一步的信息。
502
+ */
503
+ detail?: string;
419
504
  }
420
505
  interface LifecycleEventBase {
421
506
  runId: string;
@@ -502,6 +587,23 @@ interface AgentLoopConfig {
502
587
  * 不设上限的话,模型会一路猜到 maxTurns 用完,用户等到最后拿到的还是一句失败。
503
588
  */
504
589
  maxUnknownToolRetries?: number;
590
+ /**
591
+ * 一次 `ask_user` 能收的字段数上限(默认 20,FR-11.3)。超出即拒绝整次调用,
592
+ * **不截断**——截断会让模型以为字段全收到了。
593
+ */
594
+ askUserMaxFields?: number;
595
+ /**
596
+ * `file` 分片的 base64 长度上限(默认 `DEFAULT_MAX_DOCUMENT_BYTES`,FR-23.4)。
597
+ * 超出即**拒绝并说明**:截断一份 PDF 等于给模型一份坏文件。
598
+ */
599
+ maxDocumentBytes?: number;
600
+ /**
601
+ * `document-text` 分片的字节上限(默认 `DEFAULT_MAX_DOCUMENT_TEXT_BYTES`,FR-23.4)。
602
+ * 同样拒绝而不截断:截半份内容给模型,而它不知道自己少看了什么。
603
+ */
604
+ maxDocumentTextBytes?: number;
605
+ /** `read_linked_document` 的出站准入策略;与脚本取数共用同一个判定(AC-G23) */
606
+ remoteUrl?: RemoteUrlPolicy;
505
607
  }
506
608
  /** 技能状态拦截 port(治理装配;无注入默认全放行) */
507
609
  interface SkillStateGuard {
@@ -999,6 +1101,16 @@ type BridgeRequest = {
999
1101
  kind: 'readReference';
1000
1102
  id: string;
1001
1103
  path: string;
1104
+ } | {
1105
+ kind: 'readAsset';
1106
+ id: string;
1107
+ path: string;
1108
+ } |
1109
+ /** 回值走 `number[]`:进程沙箱的桥是 JSON stdio,与 writeArtifact 同口径 */
1110
+ {
1111
+ kind: 'readAssetBinary';
1112
+ id: string;
1113
+ path: string;
1002
1114
  } | {
1003
1115
  kind: 'writeArtifact';
1004
1116
  id: string;
@@ -1009,6 +1121,13 @@ type BridgeRequest = {
1009
1121
  kind: 'confirm';
1010
1122
  id: string;
1011
1123
  message: string;
1124
+ } |
1125
+ /** 取数只传宿主声明的 sourceId;**脚本给不了 URL**(FR-16.2 的唯一授权面) */
1126
+ {
1127
+ kind: 'fetchData';
1128
+ id: string;
1129
+ sourceId: string;
1130
+ params?: Record<string, unknown>;
1012
1131
  };
1013
1132
  interface BridgeResponse {
1014
1133
  id: string;
@@ -1026,11 +1145,18 @@ interface BridgeResponse {
1026
1145
  type CapabilityMode = boolean | 'require-approval';
1027
1146
  /** 授权粒度:'once-per-run'(默认,run 内同类能力批准一次)/ 'every-call'(每次调用都问) */
1028
1147
  type ApprovalScope = 'once-per-run' | 'every-call';
1029
- /** 三能力独立开关;缺省全开,显式 false 即关闭(TOOL_UNSUPPORTED) */
1148
+ /** 能力独立开关;缺省全开,显式 false 即关闭(TOOL_UNSUPPORTED) */
1030
1149
  interface BridgeCapabilities {
1031
1150
  readReference?: CapabilityMode;
1151
+ /** 同时管 readAsset 与 readAssetBinary;与 readReference 分开是为了审计可区分 */
1152
+ readAsset?: CapabilityMode;
1032
1153
  writeArtifact?: CapabilityMode;
1033
1154
  confirm?: CapabilityMode;
1155
+ /**
1156
+ * 脚本取数(FR-16.1)。**缺省关**——与其余能力相反:
1157
+ * 它会出网,缺省开等于让任何技能默认拥有出站能力。
1158
+ */
1159
+ fetchData?: CapabilityMode;
1034
1160
  }
1035
1161
  /** 入站校验:非法 kind / 缺 id / 缺字段 → undefined(调用方忽略并记 warning) */
1036
1162
  declare function parseBridgeRequest(data: unknown): BridgeRequest | undefined;
@@ -1086,8 +1212,8 @@ declare function normalizeToolError(code: unknown, message: string): {
1086
1212
  };
1087
1213
  //#endregion
1088
1214
  //#region src/sandbox/approval.d.ts
1089
- /** 桥消息对应的三类能力 */
1090
- type BridgeCapability = 'readReference' | 'writeArtifact' | 'confirm';
1215
+ /** 桥消息对应的四类能力(readAsset 同时覆盖文本与二进制读取) */
1216
+ type BridgeCapability = 'readReference' | 'readAsset' | 'writeArtifact' | 'confirm' | 'fetchData';
1091
1217
  /** allowed 放行;denied 用户拒绝/无法询问;disabled 能力关闭(两者都回 TOOL_UNSUPPORTED,仅消息不同) */
1092
1218
  type ApprovalDecision = 'allowed' | 'denied' | 'disabled';
1093
1219
  /**
@@ -1143,6 +1269,52 @@ interface TodoTraceEvent {
1143
1269
  */
1144
1270
  declare function extractTodoTraceEvents(data: unknown): TodoTraceEvent[];
1145
1271
  //#endregion
1272
+ //#region src/tools/linkedDocument.d.ts
1273
+ /**
1274
+ * 读取页面上链接指向的文档(分册 22)。
1275
+ *
1276
+ * 与脚本侧的 `fetchData` **分工明确**,两者不得互相蚕食:
1277
+ * - `fetchData`:技能脚本按宿主声明的 sourceId 取**业务数据**,目标宿主写死;
1278
+ * - 本工具:模型读**页面上出现的链接**指向的文档,目标来自感知结果。
1279
+ *
1280
+ * 共同点是准入判定必须共用 `assertRemoteUrlAllowed`(AC-G23),不得各写一套。
1281
+ */
1282
+ /** 宿主提供的文档取数实现;不注入即整个工具不注册 @experimental */
1283
+ interface LinkedDocumentReader {
1284
+ /**
1285
+ * 宿主页面的 origin,用于同源判定。
1286
+ *
1287
+ * **缺省即一律按跨源处理**(DV-10):拿不到 origin 时保守到「每次都问」,
1288
+ * 而不是保守到「都不问」。Node 宿主没有页面 origin,因此总是要确认。
1289
+ */
1290
+ readonly origin?: string;
1291
+ read(url: string): Promise<{
1292
+ mimeType: string;
1293
+ bytes: Uint8Array;
1294
+ }>;
1295
+ }
1296
+ declare const READ_LINKED_DOCUMENT_TOOL_NAME = "read_linked_document";
1297
+ /**
1298
+ * 能直接给模型用的 MIME。其余一律拒绝并列出这份清单——
1299
+ * 「尽力而为地猜格式」会让模型收到乱码却以为读成功了。
1300
+ */
1301
+ declare const SUPPORTED_DOCUMENT_MIME: {
1302
+ readonly pdf: "application/pdf";
1303
+ readonly docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
1304
+ };
1305
+ /** docx 抽取实现由宿主注入(`DOMParser` 是浏览器 API,Node 没有;备案 D55) */
1306
+ type DocxTextExtractor = (bytes: Uint8Array) => Promise<string>;
1307
+ /** 引擎侧固定流程(§2.3)用到的错误文案,集中一处便于判据引用 */
1308
+ declare const UNSUPPORTED_DOCUMENT_MESSAGE: string;
1309
+ /**
1310
+ * 内建工具:读页面链接指向的文档。
1311
+ *
1312
+ * **始终注册**(只要宿主装配了 reader):docx 与纯文本这条路对所有模型成立。
1313
+ * PDF 目标在模型不支持文档时**取数后拒绝**,而不是入口就拦 ——
1314
+ * 入口拦会误伤 docx,它抽成文本后根本不需要文档能力。
1315
+ */
1316
+ declare const READ_LINKED_DOCUMENT_TOOL: ToolDefinition;
1317
+ //#endregion
1146
1318
  //#region src/engine/external.d.ts
1147
1319
  /**
1148
1320
  * 外部工具来源(runtime 扩展点,mcp 包实现并插入)。
@@ -1278,6 +1450,27 @@ interface AgentLoopDeps {
1278
1450
  schemaInferer?: SchemaInferer;
1279
1451
  /** 缺省 MemoryArtifactStore */
1280
1452
  artifactStore?: ArtifactStore;
1453
+ /**
1454
+ * 宿主声明的数据源取数入口(分册 16)。注入后脚本上下文才有 `fetchData`。
1455
+ * 策略本体(`DataSourcePolicy`)住在 `@webskill/agent`,它依赖 runtime,
1456
+ * 所以这里只收一个函数,不收策略对象——否则依赖方向反了。
1457
+ */
1458
+ fetchData?: (sourceId: string, params?: Record<string, unknown>) => Promise<unknown>;
1459
+ /**
1460
+ * 页面链接文档的读取实现(分册 22)。不注入即 `read_linked_document` 不注册——
1461
+ * 模型连这个工具的存在都看不到,而不是看得到再被拒。
1462
+ */
1463
+ linkedDocuments?: LinkedDocumentReader;
1464
+ /** docx → 文本;`DOMParser` 是浏览器 API,因此由宿主注入(Node 侧无此能力,备案 D55) */
1465
+ docxExtractor?: DocxTextExtractor;
1466
+ /** 文档读取留痕出口(FR-22.6);不注入即不留痕,装配方要自己承担这个选择 */
1467
+ documentAudit?: {
1468
+ append(event: {
1469
+ type: string;
1470
+ target: string;
1471
+ data?: Record<string, unknown>;
1472
+ }): Promise<unknown>;
1473
+ };
1281
1474
  fs: FileSystemProvider;
1282
1475
  /** name → skillRoot(来自发现结果) */
1283
1476
  skillIndex: Map<string, string>;
@@ -1423,6 +1616,26 @@ interface WebSkillRuntimeDeps {
1423
1616
  skillIntegrityGuard?: SkillIntegrityGuard;
1424
1617
  /** F1 技能执行失败上报 port(治理 SkillStatePolicy.toSkillOutcomeReporter 装配;无注入即关闭) */
1425
1618
  skillOutcomeReporter?: SkillOutcomeReporter;
1619
+ /**
1620
+ * 宿主声明的数据源取数入口(分册 16);注入后脚本上下文才有 `fetchData`。
1621
+ * 通常由 `@webskill/agent` 的 `DataSourcePolicy.fetchData` 绑定过来。
1622
+ */
1623
+ fetchData?: (sourceId: string, params?: Record<string, unknown>) => Promise<unknown>;
1624
+ /**
1625
+ * 读页面链接指向的文档(分册 22);不注入即 `read_linked_document` 不注册。
1626
+ * 实现住在 `@webskill/browser`(docx 抽取要 `DOMParser`),由宿主装配。
1627
+ */
1628
+ linkedDocuments?: LinkedDocumentReader;
1629
+ /** docx → 文本;不注入即 Word 文档明确报「本环境不支持」(FR-23.8) */
1630
+ docxExtractor?: DocxTextExtractor;
1631
+ /** 文档读取留痕出口(FR-22.6) */
1632
+ documentAudit?: {
1633
+ append(event: {
1634
+ type: string;
1635
+ target: string;
1636
+ data?: Record<string, unknown>;
1637
+ }): Promise<unknown>;
1638
+ };
1426
1639
  }
1427
1640
  /**
1428
1641
  * runtime 门面:组合 discovery / router / agent loop / lifecycle
@@ -1754,4 +1967,4 @@ declare class FsSessionStore<TMessage = unknown> implements SessionStore<TMessag
1754
1967
  delete(id: string): Promise<void>;
1755
1968
  }
1756
1969
  //#endregion
1757
- export { READ_SKILL_FILE_INPUT_SCHEMA as $, schemaToForm as $n, TraceEventType as $t, FS_SESSION_PAGE_SIZE as A, fromVercelStreamPart as An, SealResult as At, HookRunnerOptions as B, normalizeToolContent as Bn, SkillScriptDescriptor as Bt, DEFAULT_LOOP_LIMITS as C, exportUserProfile as Cn, RuntimeSessionHandle as Ct, ExecuteLifecycleData as D, findUnpairedToolCalls as Dn, ScriptExecutor as Dt, EventBus as E, extractUiSpecEvents as En, ScriptExecutionContext as Et, FsSessionStore as F, mergeCatalogEntries as Fn, SessionStore as Ft, LifecycleEventInit as G, readBehaviorRecords as Gn, TextualToolContent as Gt, IntegrityVerdict as H, parseBridgeRequest as Hn, SkillStateGuard as Ht, FullDisclosureRouter as I, mergeProfileEntries as In, SkillFailureReport as It, LifecycleListener as J, refineUserProfile as Jn, ToolDefinition as Jt, LifecycleHook as K, readProfileEntries as Kn, TodoTraceEvent as Kt, GoogleGenAiClient as L, networkPolicyLibSource as Ln, SkillIntegrityGuard as Lt, FsMemoryStore as M, isNetworkAllowed as Mn, SessionListPage as Mt, FsRunSnapshotStore as N, isUnsupportedRunSnapshot as Nn, SessionMeta as Nt, ExternalSkillProvider as O, formatSkillScriptManifest as On, SealOptions as Ot, FsRunTraceStore as P, listSkillScripts as Pn, SessionRecord as Pt, ProgressiveRouter as Q, schemaSourceLabel as Qn, TraceEvent as Qt, GoogleGenAiClientConfig as R, networkUrlHost as Rn, SkillOutcomeReporter as Rt, CapabilityMode as S, diffUserProfile as Sn, RuntimeSession as St, EMPTY_USER_PROFILE as T, extractTodoTraceEvents as Tn, SchemaInferer as Tt, InteractLifecycleData as U, parseUserProfileExport as Un, SkillSuccessReport as Ut, InstalledSkillManifest as V, normalizeToolError as Vn, SkillScriptSchemaSource as Vt, LifecycleEvent as W, partsToText as Wn, TerminalLifecycleData as Wt, OpenAiCompatibleClient as X, resolveToolName as Xn, ToolResult as Xt, NetworkPolicy as Y, renderUserProfileContext as Yn, ToolResolution as Yt, OpenAiCompatibleClientConfig as Z, sampleBehaviorRecords as Zn, TraceClock as Zt, BridgeCapabilities as _, applyUserProfileImport as _n, RunTraceStore as _t, ActivateLifecycleData as a, USER_PROFILE_REFINE_PROMPT as an, toLlmToolSpec as ar, RouteLifecycleData as at, BridgeResponse as b, createScriptContext as bn, RuntimePhase as bt, AgentLoopDeps as c, UserProfileEntry as cn, validateUiSpecEvent as cr, RunResult as ct, ApprovalDecision as d, UserProfileLimits as dn, RunSnapshotStore as dt, TraceRecorder as en, scriptToolName as er, READ_SKILL_FILE_TOOL as et, ApprovalScope as f, VercelToolSpec as fn, RunTerminationReason as ft, BehaviorScene as g, appendBehaviorRecords as gn, RunTraceMetrics as gt, BehaviorRecordKind as h, WebSkillRuntimeDeps as hn, RunTraceFilter as ht, ASK_USER_TOOL_NAME as i, USER_PROFILE_PROMPT_HEADER as in, textParts as ir, RefineUserProfileInput as it, FsArtifactStore as j, interruptedToolResult as jn, SerializingMemoryStore as jt, ExternalToolSource as k, fromVercelResult as kn, SealRecord as kt, AnthropicClient as l, UserProfileExport as ln, validateUiSpecNode as lr, RunSnapshot as lt, BehaviorRecord as m, WebSkillRuntime as mn, RunTraceFile as mt, ASK_USER_INPUT_SCHEMA as n, USER_PROFILE_KEY as nn, summarizeRunUsage as nr, RUN_SNAPSHOT_SCHEMA_VERSION as nt, AgentLoop as o, UnsupportedRunSnapshot as on, toRecordDigests as or, RouteResult as ot, BEHAVIOR_RECORDS_KEY as p, WebSkillApi as pn, RunToolCall as pt, LifecycleHookContext as q, readUserProfile as qn, ToolContent as qt, ASK_USER_TOOL as r, USER_PROFILE_NO_INVENTION_RULE as rn, summarizeToolCalls as rr, RUN_TRACE_SCHEMA_VERSION as rt, AgentLoopConfig as s, UserProfile as sn, toVercelToolSpecs as sr, RunLimitErrorDetails as st, ALLOWED_TOOLS_EXCLUSION_REASON as t, USER_PROFILE_EXPORT_VERSION as tn, sealToolCallPairs as tr, READ_SKILL_FILE_TOOL_NAME as tt, AnthropicClientConfig as u, UserProfileImportDiff as un, RunSnapshotListEntry as ut, BridgeCapability as v, bridgeError as vn, RunTraceSummary as vt, DEFAULT_USER_PROFILE_LIMITS as w, extractChartSpec as wn, SESSION_SCHEMA_VERSION as wt, CapabilityApproval as x, createWebSkillApi as xn, RuntimeRun as xt, BridgeRequest as y, buildRenderResult as yn, RunUsageSummary as yt, HookRunner as z, normalizeErrorCode as zn, SkillRouter as zt };
1970
+ export { LifecycleHookContext as $, normalizeToolError as $n, SkillSuccessReport as $t, DocxTextExtractor as A, bridgeError as An, RuntimeRun as At, FsRunTraceStore as B, formatSkillScriptManifest as Bn, SealResult as Bt, CapabilityApproval as C, UserProfileLimits as Cn, RunTraceFile as Ct, DEFAULT_MAX_DOCUMENT_BYTES as D, WebSkillRuntimeDeps as Dn, RunTraceSummary as Dt, DEFAULT_MAX_DATA_SOURCE_BYTES as E, WebSkillRuntime as En, RunTraceStore as Et, ExternalToolSource as F, exportUserProfile as Fn, SchemaInferer as Ft, HookRunner as G, isUnsupportedRunSnapshot as Gn, SessionStore as Gt, FullDisclosureRouter as H, fromVercelStreamPart as Hn, SessionListPage as Ht, FS_SESSION_PAGE_SIZE as I, extractChartSpec as In, ScriptExecutionContext as It, IntegrityVerdict as J, mergeProfileEntries as Jn, SkillOutcomeReporter as Jt, HookRunnerOptions as K, listSkillScripts as Kn, SkillFailureReport as Kt, FsArtifactStore as L, extractTodoTraceEvents as Ln, ScriptExecutor as Lt, EventBus as M, createScriptContext as Mn, RuntimeSessionHandle as Mt, ExecuteLifecycleData as N, createWebSkillApi as Nn, SESSION_SCHEMA_VERSION as Nt, DEFAULT_MAX_DOCUMENT_TEXT_BYTES as O, appendBehaviorRecords as On, RunUsageSummary as Ot, ExternalSkillProvider as P, diffUserProfile as Pn, SUPPORTED_DOCUMENT_MIME as Pt, LifecycleHook as Q, normalizeToolContent as Qn, SkillStateGuard as Qt, FsMemoryStore as R, extractUiSpecEvents as Rn, SealOptions as Rt, BridgeResponse as S, UserProfileImportDiff as Sn, RunToolCall as St, DEFAULT_LOOP_LIMITS as T, WebSkillApi as Tn, RunTraceMetrics as Tt, GoogleGenAiClient as U, interruptedToolResult as Un, SessionMeta as Ut, FsSessionStore as V, fromVercelResult as Vn, SerializingMemoryStore as Vt, GoogleGenAiClientConfig as W, isNetworkAllowed as Wn, SessionRecord as Wt, LifecycleEvent as X, networkUrlHost as Xn, SkillScriptDescriptor as Xt, InteractLifecycleData as Y, networkPolicyLibSource as Yn, SkillRouter as Yt, LifecycleEventInit as Z, normalizeErrorCode as Zn, SkillScriptSchemaSource as Zt, BehaviorRecordKind as _, USER_PROFILE_REFINE_PROMPT as _n, toLlmToolSpec as _r, RunResult as _t, ASK_USER_TOOL as a, ToolDefinition as an, readUserProfile as ar, ProgressiveRouter as at, BridgeCapability as b, UserProfileEntry as bn, validateUiSpecEvent as br, RunSnapshotStore as bt, AgentLoop as c, TraceClock as cn, resolveToolName as cr, READ_SKILL_FILE_INPUT_SCHEMA as ct, AnthropicClient as d, TraceRecorder as dn, schemaToForm as dr, RUN_SNAPSHOT_SCHEMA_VERSION as dt, TEXT_BUDGETED_CONTENT_TYPES as en, parseBridgeRequest as er, LifecycleListener as et, AnthropicClientConfig as f, UNSUPPORTED_DOCUMENT_MESSAGE as fn, scriptToolName as fr, RUN_TRACE_SCHEMA_VERSION as ft, BehaviorRecord as g, USER_PROFILE_PROMPT_HEADER as gn, textParts as gr, RunLimitErrorDetails as gt, BEHAVIOR_RECORDS_KEY as h, USER_PROFILE_NO_INVENTION_RULE as hn, summarizeToolCalls as hr, RouteResult as ht, ASK_USER_MAX_FIELDS as i, ToolContent as in, readProfileEntries as ir, OpenAiCompatibleClientConfig as it, EMPTY_USER_PROFILE as j, buildRenderResult as jn, RuntimeSession as jt, DEFAULT_USER_PROFILE_LIMITS as k, applyUserProfileImport as kn, RuntimePhase as kt, AgentLoopConfig as l, TraceEvent as ln, sampleBehaviorRecords as lr, READ_SKILL_FILE_TOOL as lt, ApprovalScope as m, USER_PROFILE_KEY as mn, summarizeRunUsage as mr, RouteLifecycleData as mt, ASK_USER_FIELD_TYPES as n, TextualToolContent as nn, partsToText as nr, NetworkPolicy as nt, ASK_USER_TOOL_NAME as o, ToolResolution as on, refineUserProfile as or, READ_LINKED_DOCUMENT_TOOL as ot, ApprovalDecision as p, USER_PROFILE_EXPORT_VERSION as pn, sealToolCallPairs as pr, RefineUserProfileInput as pt, InstalledSkillManifest as q, mergeCatalogEntries as qn, SkillIntegrityGuard as qt, ASK_USER_INPUT_SCHEMA as r, TodoTraceEvent as rn, readBehaviorRecords as rr, OpenAiCompatibleClient as rt, ActivateLifecycleData as s, ToolResult as sn, renderUserProfileContext as sr, READ_LINKED_DOCUMENT_TOOL_NAME as st, ALLOWED_TOOLS_EXCLUSION_REASON as t, TerminalLifecycleData as tn, parseUserProfileExport as tr, LinkedDocumentReader as tt, AgentLoopDeps as u, TraceEventType as un, schemaSourceLabel as ur, READ_SKILL_FILE_TOOL_NAME as ut, BehaviorScene as v, UnsupportedRunSnapshot as vn, toRecordDigests as vr, RunSnapshot as vt, CapabilityMode as w, VercelToolSpec as wn, RunTraceFilter as wt, BridgeRequest as x, UserProfileExport as xn, validateUiSpecNode as xr, RunTerminationReason as xt, BridgeCapabilities as y, UserProfile as yn, toVercelToolSpecs as yr, RunSnapshotListEntry as yt, FsRunSnapshotStore as z, findUnpairedToolCalls as zn, SealRecord as zt };
@@ -1,5 +1,5 @@
1
- import { B as JsonSchema, C as UiSpecActionCapability, D as UiSpecSnapshot, S as UiBridge, b as RenderResultRequest, bt as UiSpecNode, c as InteractionResponse, r as ChartSpec, s as InteractionRequest, y as RenderBlock } from "./types-CrRcT-LM-DZAp8sWv.js";
2
- import { k as ExternalToolSource } from "./index-DtFdMKBX.js";
1
+ import { B as JsonSchema, C as UiSpecActionCapability, D as UiSpecSnapshot, S as UiBridge, b as RenderResultRequest, bt as UiSpecNode, c as InteractionResponse, r as ChartSpec, s as InteractionRequest, y as RenderBlock } from "./types-C26b05fW-CdrRCRDb.js";
2
+ import { F as ExternalToolSource } from "./index-D3mONFHD.js";
3
3
  import { z } from "zod";
4
4
  import { ComponentType, ReactNode } from "react";
5
5
  //#region ../ui/dist/index.d.ts
@@ -16,7 +16,7 @@ interface ControlModel {
16
16
  name: string;
17
17
  label: string;
18
18
  /** `password` 在不支持它的渲染档里必须**不渲染**,退化成文本框等于明文显示 */
19
- control: 'text' | 'number' | 'boolean' | 'select' | 'textarea' | 'file' | 'password';
19
+ control: 'text' | 'number' | 'boolean' | 'select' | 'textarea' | 'file' | 'password' | 'date';
20
20
  required?: boolean;
21
21
  description?: string;
22
22
  defaultValue?: unknown;
@@ -153,6 +153,47 @@ interface EchartHandle {
153
153
  */
154
154
  declare function mountEchart(container: HTMLElement): EchartHandle;
155
155
  //#endregion
156
+ //#region src/viewer/presetComponents.d.ts
157
+ /**
158
+ * viewer 的宿主预置组件(0.11.0 分册 18 FR-18.5 / 分册 19)。
159
+ *
160
+ * 技能**不写 JS**:文档 HTML 里只留占位,由这里挂载真实组件。
161
+ * 交互只落在图表上——表格排序的例子已作废(分册 29 §2 登记 #13)。
162
+ *
163
+ * 三条硬约束:
164
+ * - props 用 **catalog 自己的 zod schema** 解析,同形因此是机制上成立的,
165
+ * 不是靠一句「记得同步」的注释(FR-19.2);
166
+ * - 值一律经 `textContent` 落地,**永不** `innerHTML`(FR-19.4 / AC-19.5);
167
+ * - 白名单外的名字只渲染降级提示,**不触发任何按名 import**(FR-19.3)。
168
+ */
169
+ /** 占位元素的属性名,模板与挂载方共用(FR-19.1 的契约) */
170
+ declare const VIEWER_COMPONENT_ATTR = "data-webskill-component";
171
+ declare const VIEWER_PROPS_ATTR = "data-webskill-props";
172
+ /** 降级提示的标记;模板 CSS 与判据都认这个属性,不认某个 class 名 */
173
+ declare const VIEWER_FALLBACK_ATTR = "data-webskill-fallback";
174
+ /** 文档面可用的组件白名单(FR-19.3)。字面量数组——不接受任何按名动态加载 */
175
+ declare const DOCUMENT_COMPONENTS: readonly ["Chart", "Table", "Metric", "Gauge", "KeyValue"];
176
+ type DocumentComponentName = (typeof DOCUMENT_COMPONENTS)[number];
177
+ interface ViewerComponentsHandle {
178
+ dispose(): void;
179
+ }
180
+ /**
181
+ * 扫描 `root` 下的占位并挂载预置组件。
182
+ *
183
+ * 逐个占位独立处理:一个坏占位只降级它自己,不会让整篇文档变空白。
184
+ */
185
+ declare function mountViewerComponents(root: ParentNode): ViewerComponentsHandle;
186
+ //#endregion
187
+ //#region src/catalog/gauge.d.ts
188
+ /**
189
+ * `Gauge` 的百分比换算(0.11.0 分册 19 FR-19.2)。
190
+ *
191
+ * catalog 的 React `SpecGauge` 与文档面的预置组件都读这一份:
192
+ * 换算里有两个容易各写各的判断——`max === min` 时不能除零、越界值要夹紧——
193
+ * 两处各写一遍就会在边界值上给出不同的条。
194
+ */
195
+ declare function gaugePercent(value: number, min: number, max: number): number;
196
+ //#endregion
156
197
  //#region src/web/webFormBridge.d.ts
157
198
  /**
158
199
  * 框架无关原生 DOM 的 UiBridge:request 渲染表单并返回 Promise
@@ -236,7 +277,15 @@ interface UiSpecDegradation {
236
277
  kind: 'prop-dropped' | 'node-dropped' | 'unknown-component' | 'constraint-ignored' | 'condition-invalid';
237
278
  component: string;
238
279
  detail: string;
280
+ /**
281
+ * 稳定降级码,供上层可编程处理(AC-13.4)。
282
+ * 只有**策略性**拒绝才有码;纯粹的类型不匹配没有,那种只需要 detail。
283
+ * 组件在自己的 zod 里用 `codedError()` 声明,sanitize 自动提取——不维护组件名单。
284
+ */
285
+ code?: UiSpecDegradationCode;
239
286
  }
287
+ /** 稳定降级码。新增成员即新增公开契约,须登记。 */
288
+ type UiSpecDegradationCode = 'IMAGE_SRC_NOT_ALLOWED';
240
289
  interface UiSpecSanitization {
241
290
  /** `undefined` 表示连根节点都救不回来 */
242
291
  node: UiSpecNode | undefined;
@@ -294,10 +343,64 @@ declare const UI_CATALOG_GROUPS: {
294
343
  };
295
344
  /**
296
345
  * catalog 系统提示的体积上限(UTF-8 字节,FR-6.6)。
297
- * 描述每次请求都要重发,所以上限必须是可判定的数字而不是「尽量精简」。
298
- * 要改这个数字,先想清楚是否值得让每次请求都多付这些 token。
346
+ *
347
+ * **0.11.0 起只是 `CATALOG_PROMPT_MAX` 的别名**:旧值 20 480 相对实际 7 788 宽了 2.6 倍,
348
+ * 拦不住任何东西;且它只量提示词,漏掉了 `render_ui` 入参 Schema 那约两分之一的成本。
349
+ * @deprecated 用 `CATALOG_PROMPT_MAX` / `CATALOG_SCHEMA_MAX`(`./budget`)。
299
350
  */
300
- declare const UI_CATALOG_PROMPT_BUDGET_BYTES = 20480;
351
+ declare const UI_CATALOG_PROMPT_BUDGET_BYTES: number;
352
+ //#endregion
353
+ //#region src/catalog/budget.d.ts
354
+ /**
355
+ * catalog 请求体积上限(0.11.0 分册 14 / AC-G20)的**数字单一来源**。
356
+ *
357
+ * 度量与报错格式在 `scripts/catalogBudget.mjs`(`check:contracts` 与 vitest 共用);
358
+ * 那边不重复这些数字,一律从本模块读——两处各写一份阈值就等于没有阈值。
359
+ *
360
+ * catalog 进入每一次 LLM 请求的有两处:系统提示词 `toPrompt()` 与
361
+ * `render_ui` 入参 `toJsonSchema()`。只量前者会漏掉约 2/3 的成本。
362
+ *
363
+ * **超阈值的处置是砍组件或收窄枚举取值,不是抬高这里的数字。**
364
+ */
365
+ /**
366
+ * 预算阶段。分册 12 是本版最后一处 catalog 增量(分册 11 只把 `date` 加进
367
+ * 已有的 `Field.type`,分册 23 不碰 catalog),故在此切到 `'final'`:
368
+ * 阈值收紧到实测终态 + 余量,且余量小于一个平均组件的成本
369
+ * ——余量大于一个组件,等于默许下一版无声塞进一个。
370
+ */
371
+ declare const CATALOG_BUDGET_STAGE: 'entry' | 'final';
372
+ /**
373
+ * 阈值 = **已落地实测** + 余量,余量须小于一个平均组件的成本。
374
+ *
375
+ * 2026-08-14 实测终态(分册 12 落地后):prompt 12 744 / schema 21 470,30 个组件。
376
+ * 平均组件成本 prompt 425 / schema 716。
377
+ * 当前余量 prompt 256 / schema 330,均小于一个平均组件——再加一个组件必红。
378
+ *
379
+ * ⚠️ **本版这两个数字被上调过两次**,两次都由需求方裁决并改写了需求文档
380
+ * (分册 29 §2 范围订正 第 7 条与 §2.2),不是实现阶段自行放宽:
381
+ *
382
+ * 1. 11 200 → 12 200 / 20 500 → 21 200:分册 13 组件描述由短改长。
383
+ * `example` 是既有护栏的硬要求(`catalog.test.ts` 与 `catalogMatrix.test.tsx`
384
+ * 逐个组件校验并四档渲染),靠省掉示例腾出的空间收不回来。
385
+ * 2. 12 200 → 13 000 / 21 200 → 21 800:分册 12 的 `Split` 实测 490 + 694,
386
+ * 超出计划增量(403 + 1 047)的 prompt 侧。需求方裁定
387
+ * 「描述要长,可用性大于预算阈值」——收紧措辞可省回 158 字节,
388
+ * 但砍的正是各组件「何时改用 X」的辨析句,即选型准确率本身。
389
+ *
390
+ * 两次上调合计把单请求成本从 21.7 KB 抬到约 34.2 KB。
391
+ * **AC-G20 原文「超了砍组件、不抬阈值」已被推翻,但仅限本版;
392
+ * 后续再撞顶仍须回到需求方,不得沿用本版作为先例。**
393
+ */
394
+ declare const CATALOG_PROMPT_MAX = 13000;
395
+ declare const CATALOG_SCHEMA_MAX = 21800;
396
+ /**
397
+ * **尚未落地**的计划增量。本版已无剩余 catalog 增量,故归零;
398
+ * `CATALOG_BUDGET_STAGE` 同时切到 `'final'`,余量改由「小于一个平均组件」判定。
399
+ */
400
+ declare const PLANNED_INCREMENT: {
401
+ readonly prompt: 0;
402
+ readonly schema: 0;
403
+ };
301
404
  //#endregion
302
405
  //#region src/catalog/formScopes.d.ts
303
406
  /** 声明树里一个 `Form` 的提交作用域。@experimental */
@@ -769,4 +872,4 @@ interface LoadedOpenUiPeers {
769
872
  */
770
873
  declare function loadOpenUiPeers(): Promise<LoadedOpenUiPeers>;
771
874
  //#endregion
772
- export { UiSpecIssue as $, MAX_CONDITION_DEPTH as A, interactionToUiSpec as At, UI_CATALOG_PROMPT_BUDGET_BYTES as B, resolveColumnWidths as Bt, FieldCondition as C, ensureStyles as Ct, InteractionTexts as D, fromUiSurfaceActionDispatch as Dt, InteractionSpecLabels as E, fromA2uiSurfaceAction as Et, SPEC_TABLE_MIN_COLUMN_VAR as F, qualifyFieldName as Ft, UiCatalogInput as G, toA2uiSurfaceAction as Gt, UI_PRESET_NAMES as H, resolveSurfaceFormTexts as Ht, SPEC_TABLE_MIN_COLUMN_WIDTH as I, renderBlocks as It, UiComponentDef as J, toUiSurfaceActionDispatch as Jt, UiCatalogPromptOptions as K, toJsonRenderSpec as Kt, SpecColumnMeta as L, renderMiniChart as Lt, OpenUiRendererProps as M, loadWebSkillLitCatalog as Mt, OpenUiRuntime as N, mountEchart as Nt, JsonRenderSpec as O, fromVercelToolResult as Ot, RENDER_UI_TOOL as P, normalizeColumnWidths as Pt, UiSpecDegradation as Q, SurfaceFormTexts as R, renderMiniMarkdown as Rt, EvaluateFieldConditionOptions as S, defineUiCatalog as St, FormModel as T, fromA2uiSpecAction as Tt, UiActionDef as U, shapeInteractionValue as Ut, UI_PRESETS as V, resolveInteractionTexts as Vt, UiCatalog as W, toA2uiSpecMessages as Wt, UiPreset as X, uiCatalog as Xt, UiFormScope as Y, toVercelToolInvocation as Yt, UiPresetName as Z, uiPreset as Zt, ControlModel as _, collectFormScopes as _t, A2UI_SURFACE_ACTION as a, VercelUiBridge as at, DESCRIBE_UI_PRESET_TOOL as b, collectValues as bt, A2uiCatalogDefinition as c, WEBSKILL_SURFACE_ACTION as ct, A2uiMessage as d, a2uiComponentSchema as dt, UiSpecSanitization as et, A2uiSpecActionEvent as f, a2uiComponentShapes as ft, ColumnWidthsRejection as g, chartToTable as gt, CollectedValues as h, chartSpecFromProps as ht, A2UI_SPEC_FORM_PATH as i, VercelToolInvocation as it, NormalizedColumnWidths as j, loadOpenUiPeers as jt, LoadedOpenUiPeers as k, interactionToFormModel as kt, A2uiCatalogHandle as l, WebFormBridge as lt, CHART_PALETTE as m, buildA2uiCatalogDefinition as mt, A2UI_COMMON_TYPES as n, UiSurfaceActionDispatch as nt, A2UI_VERSION as o, WEBSKILL_A2UI_CATALOG_ID as ot, A2uiSpecMessageOptions as p, applySuggestion as pt, UiCatalogToolSourceOptions as q, toOpenUiSpecLang as qt, A2UI_SPEC_ACTION as r, VERCEL_INTERACTION_TOOL_NAME as rt, A2uiCatalogComponent as s, WEBSKILL_STYLES_CSS as st, A2UI_BASIC_CATALOG_ID as t, UiSpecValidation as tt, A2uiComponentShape as u, ZodRuntime as ut, DEFAULT_INTERACTION_TEXTS as v, collectScopedValues as vt, FieldConditionResult as w, evaluateFieldCondition as wt, EchartHandle as x, createUiCatalogToolSource as xt, DEFAULT_SURFACE_FORM_TEXTS as y, collectSpecActions as yt, UI_CATALOG_GROUPS as z, renderRenderResult as zt };
875
+ export { UiCatalogToolSourceOptions as $, resolveColumnWidths as $t, FormModel as A, collectSpecActions as At, RENDER_UI_TOOL as B, gaugePercent as Bt, DESCRIBE_UI_PRESET_TOOL as C, a2uiComponentShapes as Ct, EvaluateFieldConditionOptions as D, chartToTable as Dt, EchartHandle as E, chartSpecFromProps as Et, MAX_CONDITION_DEPTH as F, evaluateFieldCondition as Ft, UI_CATALOG_GROUPS as G, mountEchart as Gt, SPEC_TABLE_MIN_COLUMN_WIDTH as H, interactionToUiSpec as Ht, NormalizedColumnWidths as I, fromA2uiSpecAction as It, UI_PRESET_NAMES as J, qualifyFieldName as Jt, UI_CATALOG_PROMPT_BUDGET_BYTES as K, mountViewerComponents as Kt, OpenUiRendererProps as L, fromA2uiSurfaceAction as Lt, InteractionTexts as M, createUiCatalogToolSource as Mt, JsonRenderSpec as N, defineUiCatalog as Nt, FieldCondition as O, collectFormScopes as Ot, LoadedOpenUiPeers as P, ensureStyles as Pt, UiCatalogPromptOptions as Q, renderRenderResult as Qt, OpenUiRuntime as R, fromUiSurfaceActionDispatch as Rt, DEFAULT_SURFACE_FORM_TEXTS as S, a2uiComponentSchema as St, DocumentComponentName as T, buildA2uiCatalogDefinition as Tt, SpecColumnMeta as U, loadOpenUiPeers as Ut, SPEC_TABLE_MIN_COLUMN_VAR as V, interactionToFormModel as Vt, SurfaceFormTexts as W, loadWebSkillLitCatalog as Wt, UiCatalog as X, renderMiniChart as Xt, UiActionDef as Y, renderBlocks as Yt, UiCatalogInput as Z, renderMiniMarkdown as Zt, CHART_PALETTE as _, WEBSKILL_A2UI_CATALOG_ID as _t, A2UI_SURFACE_ACTION as a, toJsonRenderSpec as an, UiSpecDegradationCode as at, ControlModel as b, WebFormBridge as bt, A2uiCatalogDefinition as c, toVercelToolInvocation as cn, UiSpecValidation as ct, A2uiMessage as d, VIEWER_COMPONENT_ATTR as dt, resolveInteractionTexts as en, UiComponentDef as et, A2uiSpecActionEvent as f, VIEWER_FALLBACK_ATTR as ft, CATALOG_SCHEMA_MAX as g, ViewerComponentsHandle as gt, CATALOG_PROMPT_MAX as h, VercelUiBridge as ht, A2UI_SPEC_FORM_PATH as i, toA2uiSurfaceAction as in, UiSpecDegradation as it, InteractionSpecLabels as j, collectValues as jt, FieldConditionResult as k, collectScopedValues as kt, A2uiCatalogHandle as l, uiCatalog as ln, UiSurfaceActionDispatch as lt, CATALOG_BUDGET_STAGE as m, VercelToolInvocation as mt, A2UI_COMMON_TYPES as n, shapeInteractionValue as nn, UiPreset as nt, A2UI_VERSION as o, toOpenUiSpecLang as on, UiSpecIssue as ot, A2uiSpecMessageOptions as p, VIEWER_PROPS_ATTR as pt, UI_PRESETS as q, normalizeColumnWidths as qt, A2UI_SPEC_ACTION as r, toA2uiSpecMessages as rn, UiPresetName as rt, A2uiCatalogComponent as s, toUiSurfaceActionDispatch as sn, UiSpecSanitization as st, A2UI_BASIC_CATALOG_ID as t, resolveSurfaceFormTexts as tn, UiFormScope as tt, A2uiComponentShape as u, uiPreset as un, VERCEL_INTERACTION_TOOL_NAME as ut, CollectedValues as v, WEBSKILL_STYLES_CSS as vt, DOCUMENT_COMPONENTS as w, applySuggestion as wt, DEFAULT_INTERACTION_TEXTS as x, ZodRuntime as xt, ColumnWidthsRejection as y, WEBSKILL_SURFACE_ACTION as yt, PLANNED_INCREMENT as z, fromVercelToolResult as zt };