@webskill/sdk 0.9.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.
- package/dist/agent.d.ts +3 -2
- package/dist/agent.js +3 -1098
- package/dist/browser.d.ts +260 -11
- package/dist/browser.js +772 -52
- package/dist/{catalogComponents-DfxxfUvn-T7Ic8QFV.js → catalogComponents-BFoqpT1v-CjUBZ3bc.js} +1604 -426
- package/dist/{dist-CFmkV45C.js → dist-B-cOu08W.js} +874 -107
- package/dist/{dist-BQe1uglQ.js → dist-DTHZS2k1.js} +524 -30
- package/dist/dist-qnlI2Iup.js +1280 -0
- package/dist/{eventTypes-DbOpAECr-BjcjZVms.js → eventTypes-FllCrX-Z-DNDeHWoG.js} +9 -2
- package/dist/governance.d.ts +33 -6
- package/dist/governance.js +45 -7
- package/dist/{index-znZjobkr.d.ts → index-D3mONFHD.d.ts} +281 -11
- package/dist/{index-DXNTIa-6.d.ts → index-DACk2_XZ.d.ts} +114 -7
- package/dist/{index-lLcCpHE-.d.ts → index-DWbs58LF.d.ts} +234 -14
- package/dist/index.d.ts +4 -4
- package/dist/index.js +3 -3
- package/dist/mcp.d.ts +49 -6
- package/dist/mcp.js +146 -38
- package/dist/node.d.ts +3 -3
- package/dist/node.js +52 -2
- package/dist/{openUiLibrary-DURlAxjk-Do_yqg3u.js → openUiLibrary-D5u8oIvx-BLOAQCho.js} +3 -3
- package/dist/processSandboxEntry.js +6 -0
- package/dist/sandboxWorkerEntry.js +6 -0
- package/dist/{skillVersionStore-Bl-ElD45-dMJ8Ybhb.d.ts → skillVersionStore-D-qHk9ZE-BcmFLykd.d.ts} +13 -5
- package/dist/{testing-Csg5ljNm.js → testing-WPTyXQYt.js} +26 -3
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +1 -1
- package/dist/{types-B3n0cMZu-BDhheIhX.d.ts → types-C26b05fW-CdrRCRDb.d.ts} +55 -6
- package/dist/ui-react.d.ts +11 -2
- package/dist/ui-react.js +141 -42
- package/dist/ui-vue.d.ts +1 -1
- package/dist/ui-vue.js +2 -2
- package/dist/ui.d.ts +4 -4
- package/dist/ui.js +3 -3
- package/dist/{webskillLitCatalog-DwTwSBFt-BG7kL-Es.js → webskillLitCatalog-DME6PBkV-CmYNLlIT.js} +135 -16
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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) */
|
|
@@ -148,6 +218,19 @@ interface AnthropicClientConfig {
|
|
|
148
218
|
requestTimeoutMs?: number;
|
|
149
219
|
/** max_tokens(Messages API 必填),默认 4096 */
|
|
150
220
|
maxTokens?: number;
|
|
221
|
+
/**
|
|
222
|
+
* Extended thinking 开关(预算 token 数)。语义(0.10.0 复核后固化的分层口径):
|
|
223
|
+
* - 不设置 ⇒ 完全不请求思考能力(**直连客户端的缺省**);
|
|
224
|
+
* - `> 0` 的正整数 ⇒ 启用并透传 `budget_tokens`;
|
|
225
|
+
* - `<= 0` / 非整数 / 非有限数 ⇒ 一律视为关闭(不发出 thinking 参数,避免供应商 400)。
|
|
226
|
+
* 经 `createLlmClient` 装配时由工厂层按 `?? 10_000` 默认开启(0.10.0 #40.4),
|
|
227
|
+
* 与直连客户端的「默认关闭」是同一字段的两层缺省,不互相冲突。
|
|
228
|
+
* 开启后响应里的 thinking block 解析进 `LlmResponse.thinking`,
|
|
229
|
+
* 流式路径的 thinking_delta 映射为 `thinking-delta` 事件。
|
|
230
|
+
* 注意:Anthropic 要求 thinking 开启时不传 temperature(只允许默认值 1),
|
|
231
|
+
* 本客户端在开启时自动省略 temperature。
|
|
232
|
+
*/
|
|
233
|
+
thinkingBudgetTokens?: number;
|
|
151
234
|
/**
|
|
152
235
|
* 浏览器直调 opt-in:true 时发送 anthropic-dangerous-direct-browser-access 头
|
|
153
236
|
* (默认 false 不发——仅在明确运行于浏览器且无服务端代理时开启)
|
|
@@ -316,14 +399,18 @@ declare const READ_SKILL_FILE_TOOL: ToolDefinition;
|
|
|
316
399
|
//#endregion
|
|
317
400
|
//#region src/tools/askUserTool.d.ts
|
|
318
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"];
|
|
319
406
|
declare const ASK_USER_INPUT_SCHEMA: JsonSchema;
|
|
320
407
|
/** 内建工具:LLM 信息不足时主动向用户提问;仅当配置了 UiBridge 时注册 */
|
|
321
408
|
declare const ASK_USER_TOOL: ToolDefinition;
|
|
322
409
|
//#endregion
|
|
323
410
|
//#region src/tools/scriptContext.d.ts
|
|
324
411
|
/**
|
|
325
|
-
* 脚本执行上下文:只暴露 readReference / writeArtifact
|
|
326
|
-
*
|
|
412
|
+
* 脚本执行上下文:只暴露 readReference / readAsset / readAssetBinary / writeArtifact
|
|
413
|
+
* 四个显式能力,不暴露 fs 本体(沙箱语义,对齐 deferred-items D1)。
|
|
327
414
|
*/
|
|
328
415
|
declare function createScriptContext(deps: {
|
|
329
416
|
fs: FileSystemProvider;
|
|
@@ -333,6 +420,12 @@ declare function createScriptContext(deps: {
|
|
|
333
420
|
runId: string;
|
|
334
421
|
/** 提供时暴露 context.confirm(由引擎按交互策略实现) */
|
|
335
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>;
|
|
336
429
|
/** 宿主侧降级 warning 出口(网络阻断等;引擎接线到 run.warning trace) */
|
|
337
430
|
onWarning?: (message: string) => void;
|
|
338
431
|
/** writeArtifact 创建产物后的回调(引擎记录新产物 ID,执行后单次 listArtifacts 过滤) */
|
|
@@ -375,6 +468,11 @@ type ExecuteLifecycleData = {
|
|
|
375
468
|
} | {
|
|
376
469
|
kind: 'llm-delta';
|
|
377
470
|
delta: string;
|
|
471
|
+
} |
|
|
472
|
+
/** 思考增量(0.10.0 UI-UX5 #32):流式思考逐段透出;非流式路径一次性补发整段 */
|
|
473
|
+
{
|
|
474
|
+
kind: 'thinking-delta';
|
|
475
|
+
delta: string;
|
|
378
476
|
} | {
|
|
379
477
|
kind: 'interaction-resumed';
|
|
380
478
|
interactionId: string;
|
|
@@ -398,6 +496,11 @@ type InteractLifecycleData = {
|
|
|
398
496
|
/** complete / fail:终态原因 */
|
|
399
497
|
interface TerminalLifecycleData {
|
|
400
498
|
reason: RunTerminationReason;
|
|
499
|
+
/**
|
|
500
|
+
* 失败时的具体说明(`RuntimeRun.error.message`)。`reason` 只有七种取值,
|
|
501
|
+
* 说不出「哪个上限、哪个模型、本轮带了文档」这类唯一能指导下一步的信息。
|
|
502
|
+
*/
|
|
503
|
+
detail?: string;
|
|
401
504
|
}
|
|
402
505
|
interface LifecycleEventBase {
|
|
403
506
|
runId: string;
|
|
@@ -444,7 +547,11 @@ type LifecycleHook = (ctx: LifecycleHookContext) => Promise<void | {
|
|
|
444
547
|
}>;
|
|
445
548
|
//#endregion
|
|
446
549
|
//#region src/trace/types.d.ts
|
|
447
|
-
type TraceEventType = 'skill.routed' | 'skill.activated' | 'skill.integrity-failed' | 'llm.request' | 'llm.response' |
|
|
550
|
+
type TraceEventType = 'skill.routed' | 'skill.activated' | 'skill.integrity-failed' | 'llm.request' | 'llm.response' |
|
|
551
|
+
/** 一轮模型调用产出的一段思考正文(data.text;每轮至多一条,UI-UX5 #32) */
|
|
552
|
+
'llm.thinking' |
|
|
553
|
+
/** 一轮模型调用的 token 用量(data.inputTokens/outputTokens;上游不回报则无此事件,UI-UX5 #47) */
|
|
554
|
+
'llm.usage' | 'tool.started' | 'tool.completed' | 'tool.failed' | 'tool.denied' | 'artifact.created' | 'ui.requested' | 'ui.resumed' | 'ui.surface-action.requested' | 'ui.surface-action.resolved' | 'ui.rendered' | 'ui.degraded' | 'todo.created' | 'todo.updated' | 'todo.cleared' | 'run.warning' | 'run.completed' | 'run.cancelled' | 'run.failed' | 'run.resumed';
|
|
448
555
|
interface TraceEvent {
|
|
449
556
|
id: string;
|
|
450
557
|
runId: string;
|
|
@@ -465,7 +572,7 @@ interface AgentLoopConfig {
|
|
|
465
572
|
temperature?: number;
|
|
466
573
|
/** 设为 'off' 时完成 run 不调用 uiBridge.renderResult */
|
|
467
574
|
renderResult?: 'off';
|
|
468
|
-
/** 工具结果回喂上限(字节,默认
|
|
575
|
+
/** 工具结果回喂上限(字节,默认 256_000;超长头尾保留 + 完整内容落 artifact) */
|
|
469
576
|
toolResultMaxBytes?: number;
|
|
470
577
|
/** session paramHistory 保留条数上限(默认 50,超出裁最旧) */
|
|
471
578
|
paramHistoryLimit?: number;
|
|
@@ -480,6 +587,23 @@ interface AgentLoopConfig {
|
|
|
480
587
|
* 不设上限的话,模型会一路猜到 maxTurns 用完,用户等到最后拿到的还是一句失败。
|
|
481
588
|
*/
|
|
482
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;
|
|
483
607
|
}
|
|
484
608
|
/** 技能状态拦截 port(治理装配;无注入默认全放行) */
|
|
485
609
|
interface SkillStateGuard {
|
|
@@ -977,6 +1101,16 @@ type BridgeRequest = {
|
|
|
977
1101
|
kind: 'readReference';
|
|
978
1102
|
id: string;
|
|
979
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;
|
|
980
1114
|
} | {
|
|
981
1115
|
kind: 'writeArtifact';
|
|
982
1116
|
id: string;
|
|
@@ -987,6 +1121,13 @@ type BridgeRequest = {
|
|
|
987
1121
|
kind: 'confirm';
|
|
988
1122
|
id: string;
|
|
989
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>;
|
|
990
1131
|
};
|
|
991
1132
|
interface BridgeResponse {
|
|
992
1133
|
id: string;
|
|
@@ -1004,11 +1145,18 @@ interface BridgeResponse {
|
|
|
1004
1145
|
type CapabilityMode = boolean | 'require-approval';
|
|
1005
1146
|
/** 授权粒度:'once-per-run'(默认,run 内同类能力批准一次)/ 'every-call'(每次调用都问) */
|
|
1006
1147
|
type ApprovalScope = 'once-per-run' | 'every-call';
|
|
1007
|
-
/**
|
|
1148
|
+
/** 能力独立开关;缺省全开,显式 false 即关闭(TOOL_UNSUPPORTED) */
|
|
1008
1149
|
interface BridgeCapabilities {
|
|
1009
1150
|
readReference?: CapabilityMode;
|
|
1151
|
+
/** 同时管 readAsset 与 readAssetBinary;与 readReference 分开是为了审计可区分 */
|
|
1152
|
+
readAsset?: CapabilityMode;
|
|
1010
1153
|
writeArtifact?: CapabilityMode;
|
|
1011
1154
|
confirm?: CapabilityMode;
|
|
1155
|
+
/**
|
|
1156
|
+
* 脚本取数(FR-16.1)。**缺省关**——与其余能力相反:
|
|
1157
|
+
* 它会出网,缺省开等于让任何技能默认拥有出站能力。
|
|
1158
|
+
*/
|
|
1159
|
+
fetchData?: CapabilityMode;
|
|
1012
1160
|
}
|
|
1013
1161
|
/** 入站校验:非法 kind / 缺 id / 缺字段 → undefined(调用方忽略并记 warning) */
|
|
1014
1162
|
declare function parseBridgeRequest(data: unknown): BridgeRequest | undefined;
|
|
@@ -1064,8 +1212,8 @@ declare function normalizeToolError(code: unknown, message: string): {
|
|
|
1064
1212
|
};
|
|
1065
1213
|
//#endregion
|
|
1066
1214
|
//#region src/sandbox/approval.d.ts
|
|
1067
|
-
/**
|
|
1068
|
-
type BridgeCapability = 'readReference' | 'writeArtifact' | 'confirm';
|
|
1215
|
+
/** 桥消息对应的四类能力(readAsset 同时覆盖文本与二进制读取) */
|
|
1216
|
+
type BridgeCapability = 'readReference' | 'readAsset' | 'writeArtifact' | 'confirm' | 'fetchData';
|
|
1069
1217
|
/** allowed 放行;denied 用户拒绝/无法询问;disabled 能力关闭(两者都回 TOOL_UNSUPPORTED,仅消息不同) */
|
|
1070
1218
|
type ApprovalDecision = 'allowed' | 'denied' | 'disabled';
|
|
1071
1219
|
/**
|
|
@@ -1121,6 +1269,52 @@ interface TodoTraceEvent {
|
|
|
1121
1269
|
*/
|
|
1122
1270
|
declare function extractTodoTraceEvents(data: unknown): TodoTraceEvent[];
|
|
1123
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
|
|
1124
1318
|
//#region src/engine/external.d.ts
|
|
1125
1319
|
/**
|
|
1126
1320
|
* 外部工具来源(runtime 扩展点,mcp 包实现并插入)。
|
|
@@ -1256,6 +1450,27 @@ interface AgentLoopDeps {
|
|
|
1256
1450
|
schemaInferer?: SchemaInferer;
|
|
1257
1451
|
/** 缺省 MemoryArtifactStore */
|
|
1258
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
|
+
};
|
|
1259
1474
|
fs: FileSystemProvider;
|
|
1260
1475
|
/** name → skillRoot(来自发现结果) */
|
|
1261
1476
|
skillIndex: Map<string, string>;
|
|
@@ -1336,8 +1551,8 @@ declare class AgentLoop {
|
|
|
1336
1551
|
*/
|
|
1337
1552
|
declare const DEFAULT_LOOP_LIMITS: {
|
|
1338
1553
|
readonly maxTurns: 10;
|
|
1339
|
-
readonly totalTimeoutMs:
|
|
1340
|
-
readonly toolTimeoutMs:
|
|
1554
|
+
readonly totalTimeoutMs: 3600000;
|
|
1555
|
+
readonly toolTimeoutMs: 600000;
|
|
1341
1556
|
};
|
|
1342
1557
|
/**
|
|
1343
1558
|
* 触顶类失败(`RUN_TIMEOUT` / `RUN_MAX_TURNS_EXCEEDED`)记进 `run.failed`
|
|
@@ -1401,6 +1616,26 @@ interface WebSkillRuntimeDeps {
|
|
|
1401
1616
|
skillIntegrityGuard?: SkillIntegrityGuard;
|
|
1402
1617
|
/** F1 技能执行失败上报 port(治理 SkillStatePolicy.toSkillOutcomeReporter 装配;无注入即关闭) */
|
|
1403
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
|
+
};
|
|
1404
1639
|
}
|
|
1405
1640
|
/**
|
|
1406
1641
|
* runtime 门面:组合 discovery / router / agent loop / lifecycle
|
|
@@ -1493,6 +1728,12 @@ interface RunTraceSummary {
|
|
|
1493
1728
|
turnCount: number;
|
|
1494
1729
|
/** endedAt - startedAt,无 endedAt 或时间戳不可解析时缺省 */
|
|
1495
1730
|
durationMs?: number;
|
|
1731
|
+
/**
|
|
1732
|
+
* 本 run 各轮 `llm.usage` 事件的 token 聚合(0.10.0 UI-UX5 #47)。
|
|
1733
|
+
* 全 run 无 usage 上报(旧 trace、不支持统计的上游)时缺省——
|
|
1734
|
+
* 消费方据「有没有」决定要不要展示,不显示假数据。
|
|
1735
|
+
*/
|
|
1736
|
+
usage?: LlmTokenUsage;
|
|
1496
1737
|
}
|
|
1497
1738
|
/** @stable */
|
|
1498
1739
|
interface RunTraceFilter {
|
|
@@ -1566,6 +1807,11 @@ interface RunToolCall {
|
|
|
1566
1807
|
args?: string;
|
|
1567
1808
|
/** 执行耗时 ms */
|
|
1568
1809
|
durationMs?: number;
|
|
1810
|
+
/**
|
|
1811
|
+
* 开始时刻(trace `tool.started` 的 ts,ISO)。思考卡片与工具卡片按时间
|
|
1812
|
+
* 穿插(UI-UX5 #32)需要一个共同时钟;旧 trace 没有 started 事件时缺省。
|
|
1813
|
+
*/
|
|
1814
|
+
startedAt?: string;
|
|
1569
1815
|
/**
|
|
1570
1816
|
* failed 时的结构化错误码(如 `TOOL_NOT_ALLOWED`)。
|
|
1571
1817
|
* 消费方据此区分「被策略拒绝」与「执行出错」,不必解析 message 文案。
|
|
@@ -1585,6 +1831,30 @@ interface RunToolCall {
|
|
|
1585
1831
|
*/
|
|
1586
1832
|
declare function summarizeToolCalls(run: RuntimeRun): RunToolCall[];
|
|
1587
1833
|
//#endregion
|
|
1834
|
+
//#region src/engine/usage.d.ts
|
|
1835
|
+
/**
|
|
1836
|
+
* 一次 run 的大模型用量聚合(0.10.0 UI-UX5 #47)。
|
|
1837
|
+
* 从 trace 事件推导,不落第二份数据:llm.request 计请求次数,llm.usage 计 token。
|
|
1838
|
+
* @stable
|
|
1839
|
+
*/
|
|
1840
|
+
interface RunUsageSummary {
|
|
1841
|
+
/** llm.request 事件数:本 run 向大模型发送请求的次数(与 RunTraceSummary.turnCount 同源) */
|
|
1842
|
+
llmCalls: number;
|
|
1843
|
+
/**
|
|
1844
|
+
* 各轮 llm.usage 的输入 token 合计。全 run 没有任何 usage 上报时缺省——
|
|
1845
|
+
* 「上游不支持统计」与「恰好为零」必须可区分,消费方缺省时不显示假数据。
|
|
1846
|
+
*/
|
|
1847
|
+
inputTokens?: number;
|
|
1848
|
+
/** 各轮 llm.usage 的输出 token 合计;缺省语义同 inputTokens */
|
|
1849
|
+
outputTokens?: number;
|
|
1850
|
+
}
|
|
1851
|
+
/**
|
|
1852
|
+
* 从 run 的 trace 聚合大模型用量(请求次数 + 输入/输出 token)。
|
|
1853
|
+
* 与 `summarizeToolCalls` 同型:消费方不再各自遍历 trace。
|
|
1854
|
+
* @stable
|
|
1855
|
+
*/
|
|
1856
|
+
declare function summarizeRunUsage(trace: readonly TraceEvent[]): RunUsageSummary;
|
|
1857
|
+
//#endregion
|
|
1588
1858
|
//#region src/engine/session.d.ts
|
|
1589
1859
|
declare const SESSION_SCHEMA_VERSION = 1;
|
|
1590
1860
|
/** `FsSessionStore` 的缺省页长。缺省值属于实现,不属于调用方——否则「下推」只推了一半 */
|
|
@@ -1697,4 +1967,4 @@ declare class FsSessionStore<TMessage = unknown> implements SessionStore<TMessag
|
|
|
1697
1967
|
delete(id: string): Promise<void>;
|
|
1698
1968
|
}
|
|
1699
1969
|
//#endregion
|
|
1700
|
-
export {
|
|
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 };
|