@webskill/sdk 0.3.0 → 0.5.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 (35) hide show
  1. package/dist/agent.d.ts +2 -0
  2. package/dist/agent.js +867 -0
  3. package/dist/browser.d.ts +137 -4
  4. package/dist/browser.js +458 -22
  5. package/dist/{catalogComponents-C_V39rbF-BOHveMWa.js → catalogComponents-DV7cPpUm-C77AEEx9.js} +477 -157
  6. package/dist/{dist-rorEJsNi.js → dist-6C03DShK.js} +654 -298
  7. package/dist/{dist-ZKaM8j06.js → dist-bewtXYlO.js} +1061 -807
  8. package/dist/governance.d.ts +87 -10
  9. package/dist/governance.js +194 -24
  10. package/dist/{index-wiV5X8Rz.d.ts → index-Bsqg4ftU.d.ts} +151 -143
  11. package/dist/index-D_7ZZjkl.d.ts +411 -0
  12. package/dist/{index-8d-oEDww.d.ts → index-vBz_FC9w.d.ts} +289 -24
  13. package/dist/index.d.ts +3 -3
  14. package/dist/index.js +3 -2
  15. package/dist/mcp.d.ts +2 -2
  16. package/dist/mcp.js +1 -1
  17. package/dist/memoryArtifactStore-BtOeB_hm-tj3fC5ip.js +78 -0
  18. package/dist/node.d.ts +8 -4
  19. package/dist/node.js +1 -1
  20. package/dist/{openUiLibrary-B8-Cvou9-BbpNTXS3.js → openUiLibrary-W3Ce896k-ClFTRZFs.js} +6 -5
  21. package/dist/{skillVersionStore-DOEI9ptb-BxbYL70B.d.ts → skillVersionStore-BzLbzFOL-CxwIewHJ.d.ts} +43 -11
  22. package/dist/{testing-CsrG3XLz.js → testing-DDCJWvgA.js} +7 -5
  23. package/dist/testing.d.ts +1 -1
  24. package/dist/testing.js +2 -2
  25. package/dist/{types-AmKCKJn_-VGabeXK4.d.ts → types-D_hoCri8-BnNPiZCi.d.ts} +111 -72
  26. package/dist/ui-react.d.ts +352 -20
  27. package/dist/ui-react.js +3804 -3478
  28. package/dist/ui-vue.d.ts +1 -1
  29. package/dist/ui-vue.js +25 -6
  30. package/dist/ui.d.ts +4 -3
  31. package/dist/ui.js +3 -3
  32. package/dist/{webskillLitCatalog-CNaUpasU-BslMcxRZ.js → webskillLitCatalog-_mugzRHx-DiuJpCuf.js} +398 -122
  33. package/package.json +6 -1
  34. package/dist/jsonRenderRegistry-9GrWP_hE-U6Do3Kid.js +0 -2468
  35. package/dist/memoryArtifactStore-C9lFVqPF-yFz6yJj0.js +0 -48
@@ -0,0 +1,78 @@
1
+ import { m as WebSkillError } from "./dist-8oQRa8Xz.js";
2
+
3
+ //#region ../runtime/dist/memoryArtifactStore-BtOeB_hm.js
4
+ /** 纯文本消息内容的构造快捷方式(引擎内部绝大多数消息仍是纯文本) */
5
+ const textParts = (text) => [{
6
+ type: "text",
7
+ text
8
+ }];
9
+ /** 取出 parts 中的文本(非文本分片在纯文本语境下无法表达,此处按丢弃处理——调用方须先校验) */
10
+ const partsToText = (parts) => (parts ?? []).reduce((acc, part) => part.type === "text" ? acc + part.text : acc, "");
11
+ const isContentPart = (value) => {
12
+ if (typeof value !== "object" || value === null) return false;
13
+ const part = value;
14
+ if (part["type"] === "text") return typeof part["text"] === "string";
15
+ if (part["type"] === "image" || part["type"] === "file") return typeof part["mimeType"] === "string" && typeof part["data"] === "string";
16
+ return false;
17
+ };
18
+ /**
19
+ * 0.4.0 起 `content` 是 parts 数组。旧的 `string` content 一律拒绝,不做静默转换:
20
+ * 转换会让「模型看到的输入」与「历史记录的输入」悄悄分叉。
21
+ */
22
+ function validateLlmMessages(messages) {
23
+ messages.forEach((message, index) => {
24
+ if (typeof message.content === "string") throw new WebSkillError("VALIDATION_FAILED", `messages[${index}].content is a string; since schema version 2 it must be an array of content parts. Legacy data is not converted automatically.`);
25
+ if (!Array.isArray(message.content) || !message.content.every(isContentPart)) throw new WebSkillError("VALIDATION_FAILED", `messages[${index}].content is not a valid array of content parts`);
26
+ });
27
+ }
28
+ /** provider 不支持某类分片时的统一拒绝:静默丢弃会让模型回答一个它没看见的附件 */
29
+ function rejectUnsupportedPart(part, provider, where) {
30
+ throw new WebSkillError("VALIDATION_FAILED", `${provider} does not support ${part.type} content in ${where} messages`);
31
+ }
32
+ /** 内存 ArtifactStore:测试与浏览器降级用;索引随进程生命周期存在 */
33
+ var MemoryArtifactStore = class {
34
+ #byRun = /* @__PURE__ */ new Map();
35
+ #seq = 0;
36
+ async createTextArtifact(input) {
37
+ return this.#record({
38
+ runId: input.runId,
39
+ path: input.path,
40
+ type: "text",
41
+ size: new TextEncoder().encode(input.content).length,
42
+ mimeType: input.mimeType,
43
+ metadata: input.metadata
44
+ });
45
+ }
46
+ async createBinaryArtifact(input) {
47
+ return this.#record({
48
+ runId: input.runId,
49
+ path: input.path,
50
+ type: "binary",
51
+ size: input.content.length,
52
+ mimeType: input.mimeType,
53
+ metadata: input.metadata
54
+ });
55
+ }
56
+ async listArtifacts(runId) {
57
+ return [...this.#byRun.get(runId) ?? []];
58
+ }
59
+ #record(input) {
60
+ const artifact = {
61
+ id: `art-${++this.#seq}`,
62
+ runId: input.runId,
63
+ path: input.path,
64
+ type: input.type,
65
+ mimeType: input.mimeType,
66
+ size: input.size,
67
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
68
+ metadata: input.metadata
69
+ };
70
+ const list = this.#byRun.get(input.runId) ?? [];
71
+ list.push(artifact);
72
+ this.#byRun.set(input.runId, list);
73
+ return artifact;
74
+ }
75
+ };
76
+
77
+ //#endregion
78
+ export { validateLlmMessages as a, textParts as i, partsToText as n, rejectUnsupportedPart as r, MemoryArtifactStore as t };
package/dist/node.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { $ as SkillInstallSource, H as SKILL_MANIFEST_FILE, I as JsonSchema, N as FileStat, O as ArchiveLimits, P as FileSystemProvider, V as SKILLS_LOCKFILE, _ as RenderResultRequest, dt as TrustedKeyStore, ft as UnsignedPolicy, lt as SkillsLockfile, mt as VerifyResult, nt as SkillManagerPort, o as InteractionRequest, q as SignatureAuditSink, rt as SkillManifest, s as InteractionResponse, v as UiBridge } from "./types-AmKCKJn_-VGabeXK4.js";
2
- import { F as NetworkPolicy, Ot as createScriptContext, Tt as WebSkillRuntimeDeps, _t as ToolResult, b as FsArtifactStore, ct as ScriptExecutor, d as BridgeCapabilities, ht as ToolDefinition, ot as SchemaInferer, st as ScriptExecutionContext, u as ApprovalScope, wt as WebSkillRuntime, x as FsMemoryStore } from "./index-8d-oEDww.js";
3
- import { a as AuditLog, c as CandidateSkill, d as CandidateStore, h as SkillVersionStore, r as ApprovalPolicy } from "./skillVersionStore-DOEI9ptb-BxbYL70B.js";
1
+ import { I as JsonSchema, N as FileStat, O as ArchiveLimits, P as FileSystemProvider, U as SKILLS_LOCKFILE, W as SKILL_MANIFEST_FILE, Y as SignatureAuditSink, _t as VerifyResult, at as SkillManifest, b as UiBridge, c as InteractionResponse, dt as SkillsLockfile, ht as UnsignedPolicy, it as SkillManagerPort, pt as TrustedKeyStore, s as InteractionRequest, tt as SkillInstallSource, y as RenderResultRequest } from "./types-D_hoCri8-BnNPiZCi.js";
2
+ import { D as FsMemoryStore, E as FsArtifactStore, Ht as WebSkillRuntimeDeps, Nt as ToolResult, Vt as WebSkillRuntime, W as NetworkPolicy, _t as SchemaInferer, d as ApprovalScope, f as BridgeCapabilities, jt as ToolDefinition, qt as createScriptContext, vt as ScriptExecutionContext, yt as ScriptExecutor } from "./index-vBz_FC9w.js";
3
+ import { a as AuditLog, p as CandidateStore, r as ApprovalPolicy, u as CandidateSkill, v as SkillVersionStore } from "./skillVersionStore-BzLbzFOL-CxwIewHJ.js";
4
4
  import { n as LlmEnvConfig, s as probeLlmCapabilities, t as LlmCapabilities } from "./env-BPUBZCwJ-4jat_SVG.js";
5
5
  import { Readable, Writable } from "node:stream";
6
6
  //#region ../node/dist/index.d.ts
@@ -217,7 +217,11 @@ declare class SkillManager implements SkillManagerPort {
217
217
  */
218
218
  signature?: {
219
219
  trustedKeys?: TrustedKeyStore;
220
- /** 未签名包的处置,默认 warn */
220
+ /**
221
+ * 未签名包的处置,默认 `warn`(0.4.0 D2 复核后维持)。
222
+ * 收成 `deny` 必须同时注入 `trustedKeys`:空信任库 + deny 的接受集为空,
223
+ * 任何包都装不上。
224
+ */
221
225
  unsigned?: UnsignedPolicy;
222
226
  /** 验签结论落审计(governance 的 FsAuditLog 结构上兼容) */
223
227
  audit?: SignatureAuditSink;
package/dist/node.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { A as parseSkillMarkdown, B as unzipWithLimits, H as verifyManifest, I as resolveArchiveLimits, L as resolveInsideRoot, M as readResponseWithLimit, N as readSkillSignature, O as messageOf, T as isValidSkillName, U as verifySkillSignature, V as validateSkills, _ as atomicWriteText, g as assertSafePathSegment, h as assertRemoteUrlAllowed, j as parseSkillPackManifest, m as WebSkillError, o as SKILLS_LOCKFILE, r as MANIFEST_EXCLUDED_FILES, s as SKILL_MANIFEST_FILE, u as SKILL_PACK_FILE, w as exportSkills, y as buildManifest } from "./dist-8oQRa8Xz.js";
2
- import { B as normalizeToolContent, D as bridgeError, E as WebSkillRuntime, H as parseBridgeRequest, L as networkPolicyLibSource, V as normalizeToolError, c as FsArtifactStore, k as createScriptContext, l as FsMemoryStore, o as CapabilityApproval } from "./dist-rorEJsNi.js";
2
+ import { J as normalizeToolError, N as createScriptContext, O as WebSkillRuntime, W as networkPolicyLibSource, Y as parseBridgeRequest, d as FsMemoryStore, k as bridgeError, o as CapabilityApproval, q as normalizeToolContent, u as FsArtifactStore } from "./dist-6C03DShK.js";
3
3
  import { i as probeLlmCapabilities } from "./env--jJB-TSX-04klhTYi.js";
4
4
  import { createRequire } from "node:module";
5
5
  import { unzipSync, zipSync } from "fflate";
@@ -1,5 +1,5 @@
1
- import { ft as uiCatalog } from "./dist-ZKaM8j06.js";
2
- import { n as catalogComponentImpls } from "./catalogComponents-C_V39rbF-BOHveMWa.js";
1
+ import { nt as uiCatalog } from "./dist-bewtXYlO.js";
2
+ import { t as CatalogNode } from "./catalogComponents-DV7cPpUm-C77AEEx9.js";
3
3
  import { z } from "zod";
4
4
  import { Component, Fragment, createContext, useCallback, useContext, useEffect, useInsertionEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -3761,7 +3761,7 @@ function Renderer({ response, library, isStreaming = false, onAction, onStateUpd
3761
3761
  const FormValidationContext = createContext(null);
3762
3762
 
3763
3763
  //#endregion
3764
- //#region ../ui-react/dist/openUiLibrary-B8-Cvou9.js
3764
+ //#region ../ui-react/dist/openUiLibrary-W3Ce896k.js
3765
3765
  const propsFor = (props, container) => container ? props.extend({ children: z.array(z.any()).optional() }) : props;
3766
3766
  /**
3767
3767
  * catalog 的 OpenUI 投影:`defineComponent` 复用同一份 zod schema 与描述,
@@ -3773,10 +3773,11 @@ const webskillOpenUiLibrary = createLibrary({
3773
3773
  name: def.name,
3774
3774
  description: def.description,
3775
3775
  props: propsFor(def.props, def.children !== void 0),
3776
- component: ((input) => catalogComponentImpls[def.name]?.({
3776
+ component: ((input) => /* @__PURE__ */ jsx(CatalogNode, {
3777
+ name: def.name,
3777
3778
  props: input.props,
3778
3779
  children: input.renderNode(input.props["children"])
3779
- }) ?? null)
3780
+ }))
3780
3781
  }))
3781
3782
  });
3782
3783
  const OPEN_UI_COMPONENTS = Object.keys(webskillOpenUiLibrary.components);
@@ -1,8 +1,9 @@
1
- import { P as FileSystemProvider, X as SkillCatalogEntry, rt as SkillManifest } from "./types-AmKCKJn_-VGabeXK4.js";
2
- //#region ../governance/dist/skillVersionStore-DOEI9ptb.d.ts
1
+ import { B as PageQuery, P as FileSystemProvider, Q as SkillCatalogEntry, at as SkillManifest, z as Page } from "./types-D_hoCri8-BnNPiZCi.js";
2
+ //#region ../governance/dist/skillVersionStore-BzLbzFOL.d.ts
3
3
  //#region src/types.d.ts
4
4
  type CandidateStatus = 'draft' | 'pending-review' | 'approved' | 'published' | 'rejected';
5
- type CandidateSource = 'runtime-miss' | 'document' | 'manual';
5
+ /** `generated` 0.5.0 的技能自动生成来源(需求 12 AC-9.1) */
6
+ type CandidateSource = 'runtime-miss' | 'document' | 'manual' | 'generated';
6
7
  type CandidateRisk = 'low' | 'medium' | 'high';
7
8
  interface CandidateFile {
8
9
  path: string;
@@ -35,16 +36,32 @@ interface AuditEvent {
35
36
  /** 本事件规范化载荷 + prevHash 的 sha256 */
36
37
  hash?: string;
37
38
  }
39
+ /**
40
+ * 审计查询的筛选条件。刻意是**具名字段**而不是谓词函数:
41
+ * 谓词无法被存储层用索引优化,下推一个谓词等于把 `.filter()` 换了个位置。
42
+ * @stable
43
+ */
44
+ interface AuditQueryFilter {
45
+ target?: string;
46
+ type?: string;
47
+ actor?: string;
48
+ /** 含端点(`ts >= since`) */
49
+ since?: string;
50
+ /** 含端点(`ts <= until`) */
51
+ until?: string;
52
+ }
38
53
  interface AuditLog {
39
54
  append(event: Omit<AuditEvent, 'id' | 'ts'> & {
40
55
  id?: string;
41
56
  ts?: string;
42
57
  }): Promise<AuditEvent>;
43
- query(filter: {
44
- target?: string;
45
- type?: string;
46
- since?: string;
47
- }): Promise<AuditEvent[]>;
58
+ /**
59
+ * 分页查询。方向与会话消息一致:无游标给**最新**一页,`nextCursor` 指向更早的历史。
60
+ *
61
+ * 分页是性能优化,不是绕过完整性检查的通道:本页范围内的 hash 链断裂
62
+ * 必须以 `GOVERNANCE_FAILED` 报出,不得安静地把那一页返回。
63
+ */
64
+ query(filter?: AuditQueryFilter & PageQuery): Promise<Page<AuditEvent>>;
48
65
  }
49
66
  interface SkillVersion {
50
67
  versionId: string;
@@ -59,6 +76,8 @@ interface SkillVersion {
59
76
  type SkillState = 'active' | 'quarantined' | 'deprecated' | 'disabled';
60
77
  //#endregion
61
78
  //#region src/candidate/candidateStore.d.ts
79
+ /** 候选列表的缺省页长。缺省属于实现,不属于调用方 */
80
+ declare const CANDIDATE_PAGE_SIZE = 50;
62
81
  /** 逐文件持久化的候选存储:<managedRoot>/.webskill/candidates/<id>.json */
63
82
  declare class CandidateStore {
64
83
  #private;
@@ -68,7 +87,14 @@ declare class CandidateStore {
68
87
  });
69
88
  save(candidate: CandidateSkill): Promise<void>;
70
89
  get(id: string): Promise<CandidateSkill>;
71
- list(): Promise<CandidateSkill[]>;
90
+ /**
91
+ * 候选(= 审批队列)分页。`status` 是端口参数而不是上层 `.filter()`:
92
+ * 审批页面只看 `pending-review`,没理由把已发布的候选全部拉过端口。
93
+ * 目录扫描仍是逐文件读(备案 D25),但返回量已由 `limit` 封顶。
94
+ */
95
+ list(options?: {
96
+ status?: CandidateStatus;
97
+ } & PageQuery): Promise<Page<CandidateSkill>>;
72
98
  updateStatus(id: string, status: CandidateStatus, now?: string): Promise<CandidateSkill>;
73
99
  }
74
100
  /** 硬门禁:仅 published 可转换为 Catalog 条目,否则 APPROVAL_REQUIRED */
@@ -94,6 +120,8 @@ declare class CompositeApprovalPolicy implements ApprovalPolicy {
94
120
  }
95
121
  //#endregion
96
122
  //#region src/versioning/skillVersionStore.d.ts
123
+ /** 版本列表的缺省页长。缺省属于实现,不属于调用方 */
124
+ declare const SKILL_VERSION_PAGE_SIZE = 20;
97
125
  /** 版本存储:manifest 快照 + parentVersionId 链;回滚 = 追加新版本(谱系不断)。
98
126
  * 保留策略:maxArchivesPerSkill(默认 5)超出时清理最旧版本(json + zip 归档一并删除)。 */
99
127
  declare class SkillVersionStore {
@@ -115,7 +143,11 @@ declare class SkillVersionStore {
115
143
  }): Promise<SkillVersion>;
116
144
  /** 读取版本归档字节(applyRollback 用;未捕获归档的旧版本 → GOVERNANCE_FAILED) */
117
145
  readArchive(skillName: string, versionId: string): Promise<Uint8Array>;
118
- list(skillName: string): Promise<SkillVersion[]>;
146
+ /**
147
+ * 版本列表分页(方向同 C1:无游标给**最新**一页)。
148
+ * 保留策略与谱系构建走 `#readAll`:它们必须看到全量,不能被分页截断。
149
+ */
150
+ list(skillName: string, options?: PageQuery): Promise<Page<SkillVersion>>;
119
151
  get(skillName: string, versionId: string): Promise<SkillVersion>;
120
152
  /** 回滚:基于旧 manifest 追加新版本 + skill.rolled_back 审计 */
121
153
  rollback(skillName: string, targetVersionId: string, input: {
@@ -124,4 +156,4 @@ declare class SkillVersionStore {
124
156
  }): Promise<SkillVersion>;
125
157
  }
126
158
  //#endregion
127
- export { AuditLog as a, CandidateSkill as c, CandidateStore as d, CompositeApprovalPolicy as f, candidateToCatalogEntry as g, SkillVersionStore as h, AuditEvent as i, CandidateSource as l, SkillVersion as m, ApprovalDecision as n, CandidateFile as o, SkillState as p, ApprovalPolicy as r, CandidateRisk as s, AlwaysHumanApprovalPolicy as t, CandidateStatus as u };
159
+ export { SkillVersion as _, AuditLog as a, CandidateFile as c, CandidateSource as d, CandidateStatus as f, SkillState as g, SKILL_VERSION_PAGE_SIZE as h, AuditEvent as i, CandidateRisk as l, CompositeApprovalPolicy as m, ApprovalDecision as n, AuditQueryFilter as o, CandidateStore as p, ApprovalPolicy as r, CANDIDATE_PAGE_SIZE as s, AlwaysHumanApprovalPolicy as t, CandidateSkill as u, SkillVersionStore as v, candidateToCatalogEntry as y };
@@ -1,4 +1,5 @@
1
1
  import { m as WebSkillError } from "./dist-8oQRa8Xz.js";
2
+ import { i as textParts, n as partsToText } from "./memoryArtifactStore-BtOeB_hm-tj3fC5ip.js";
2
3
 
3
4
  //#region ../runtime/dist/testing.js
4
5
  /**
@@ -27,7 +28,7 @@ var MockLlmClient = class {
27
28
  else if (event.type === "tool-calls") toolCalls = event.toolCalls;
28
29
  else if (event.type === "done" && event.content !== void 0) content = event.content;
29
30
  return {
30
- content,
31
+ content: content === "" ? void 0 : textParts(content),
31
32
  toolCalls
32
33
  };
33
34
  }
@@ -43,11 +44,12 @@ var MockLlmClient = class {
43
44
  return;
44
45
  }
45
46
  const response = typeof next === "function" ? await next(input) : next;
46
- if (response.content) {
47
- const chunkSize = Math.max(1, Math.ceil(response.content.length / 3));
48
- for (let i = 0; i < response.content.length; i += chunkSize) yield {
47
+ const text = partsToText(response.content);
48
+ if (text !== "") {
49
+ const chunkSize = Math.max(1, Math.ceil(text.length / 3));
50
+ for (let i = 0; i < text.length; i += chunkSize) yield {
49
51
  type: "text-delta",
50
- delta: response.content.slice(i, i + chunkSize)
52
+ delta: text.slice(i, i + chunkSize)
51
53
  };
52
54
  }
53
55
  if (response.toolCalls?.length) yield {
package/dist/testing.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { c as LlmClient, d as LlmResponse, f as LlmStreamEvent, h as MemoryStore, l as LlmCompleteInput, n as ArtifactStore, o as InteractionRequest, s as InteractionResponse, t as Artifact, v as UiBridge } from "./types-AmKCKJn_-VGabeXK4.js";
1
+ import { _ as MemoryStore, b as UiBridge, c as InteractionResponse, l as LlmClient, m as LlmStreamEvent, n as ArtifactStore, p as LlmResponse, s as InteractionRequest, t as Artifact, u as LlmCompleteInput } from "./types-D_hoCri8-BnNPiZCi.js";
2
2
  import { a as loadGoogleConfigFromEnv, i as loadAnthropicConfigFromEnv, n as LlmEnvConfig, o as loadLlmConfigFromEnv, r as ProviderEnvConfig } from "./env-BPUBZCwJ-4jat_SVG.js";
3
3
  //#region ../runtime/dist/testing.d.ts
4
4
  //#region src/llm/mockLlmClient.d.ts
package/dist/testing.js CHANGED
@@ -1,5 +1,5 @@
1
- import { t as MemoryArtifactStore } from "./memoryArtifactStore-C9lFVqPF-yFz6yJj0.js";
1
+ import { t as MemoryArtifactStore } from "./memoryArtifactStore-BtOeB_hm-tj3fC5ip.js";
2
2
  import { n as loadGoogleConfigFromEnv, r as loadLlmConfigFromEnv, t as loadAnthropicConfigFromEnv } from "./env--jJB-TSX-04klhTYi.js";
3
- import { n as MockLlmClient, r as MockUiBridge, t as InMemoryStore } from "./testing-CsrG3XLz.js";
3
+ import { n as MockLlmClient, r as MockUiBridge, t as InMemoryStore } from "./testing-DDCJWvgA.js";
4
4
 
5
5
  export { InMemoryStore, MemoryArtifactStore, MockLlmClient, MockUiBridge, loadAnthropicConfigFromEnv, loadGoogleConfigFromEnv, loadLlmConfigFromEnv };
@@ -1,6 +1,6 @@
1
1
  //#region ../core/dist/index.d.ts
2
2
  //#region src/errors.d.ts
3
- type WebSkillErrorCode = 'FS_NOT_FOUND' | 'FS_PATH_OUTSIDE_ROOT' | 'SKILL_NOT_FOUND' | 'SKILL_INVALID_METADATA' | 'SKILL_INVALID_NAME' | 'SKILL_DUPLICATE_NAME' | 'SKILL_UNSUPPORTED_SCRIPT' | 'VALIDATION_FAILED' | 'TOOL_NOT_FOUND' | 'TOOL_EXECUTION_FAILED' | 'NETWORK_BLOCKED' | 'TOOL_UNSUPPORTED' | 'TOOL_SCHEMA_UNAVAILABLE' | 'RUN_TIMEOUT' | 'RUN_MAX_TURNS_EXCEEDED' | 'RUN_FAILED' | 'RUN_CANCELLED' | 'RUN_INTERACTION_TIMEOUT' | 'UI_UNAVAILABLE' | 'LLM_UNAVAILABLE' | 'LLM_REQUEST_FAILED' | 'INSTALL_FAILED' | 'UNINSTALL_FAILED' | 'EXPORT_FAILED' | 'INTEGRITY_FAILED' | 'FS_PERMISSION_DENIED' | 'MCP_ENDPOINT_UNAVAILABLE' | 'MCP_TOOL_NOT_FOUND' | 'CANDIDATE_INVALID' | 'APPROVAL_REQUIRED' | 'SKILL_QUARANTINED' | 'SKILL_DISABLED' | 'SKILL_UNKNOWN_ALLOWED_TOOL' | 'SKILL_UNKNOWN_DEPENDENCY' | 'SKILL_CIRCULAR_DEPENDENCY' | 'GOVERNANCE_FAILED' | 'RUN_SNAPSHOT_NOT_FOUND' | 'RUN_SNAPSHOT_EXPIRED' | 'RUN_SNAPSHOT_INCOMPATIBLE' | 'RUN_TRACE_INCOMPATIBLE' | 'SESSION_INCOMPATIBLE' | 'SIGNATURE_MISSING' | 'SIGNATURE_MALFORMED' | 'SIGNATURE_UNTRUSTED_KEY' | 'SIGNATURE_MISMATCH' | 'SIGNATURE_UNSUPPORTED' | 'MCP_STDIO_SPAWN_FAILED' | 'MCP_STDIO_EXITED' | 'MCP_STDIO_TIMEOUT';
3
+ type WebSkillErrorCode = 'FS_NOT_FOUND' | 'FS_PATH_OUTSIDE_ROOT' | 'SKILL_NOT_FOUND' | 'SKILL_INVALID_METADATA' | 'SKILL_INVALID_NAME' | 'SKILL_DUPLICATE_NAME' | 'SKILL_UNSUPPORTED_SCRIPT' | 'VALIDATION_FAILED' | 'TOOL_NOT_FOUND' | 'TOOL_EXECUTION_FAILED' | 'NETWORK_BLOCKED' | 'TOOL_UNSUPPORTED' | 'TOOL_NOT_ALLOWED' | 'TOOL_SCHEMA_UNAVAILABLE' | 'RUN_TIMEOUT' | 'RUN_MAX_TURNS_EXCEEDED' | 'RUN_FAILED' | 'RUN_CANCELLED' | 'RUN_INTERACTION_TIMEOUT' | 'UI_UNAVAILABLE' | 'LLM_UNAVAILABLE' | 'LLM_REQUEST_FAILED' | 'INSTALL_FAILED' | 'UNINSTALL_FAILED' | 'EXPORT_FAILED' | 'INTEGRITY_FAILED' | 'FS_PERMISSION_DENIED' | 'MCP_ENDPOINT_UNAVAILABLE' | 'MCP_TOOL_NOT_FOUND' | 'CANDIDATE_INVALID' | 'APPROVAL_REQUIRED' | 'SKILL_QUARANTINED' | 'SKILL_DISABLED' | 'SKILL_UNKNOWN_ALLOWED_TOOL' | 'SKILL_UNKNOWN_DEPENDENCY' | 'SKILL_CIRCULAR_DEPENDENCY' | 'GOVERNANCE_FAILED' | 'RUN_SNAPSHOT_NOT_FOUND' | 'RUN_SNAPSHOT_EXPIRED' | 'RUN_SNAPSHOT_INCOMPATIBLE' | 'RUN_SNAPSHOT_SCHEMA_UNSUPPORTED' | 'RUN_TRACE_INCOMPATIBLE' | 'SESSION_INCOMPATIBLE' | 'SIGNATURE_MISSING' | 'SIGNATURE_MALFORMED' | 'SIGNATURE_UNTRUSTED_KEY' | 'SIGNATURE_MISMATCH' | 'SIGNATURE_UNSUPPORTED' | 'MCP_STDIO_SPAWN_FAILED' | 'MCP_STDIO_EXITED' | 'MCP_STDIO_TIMEOUT' | 'TS_RESOURCE_URL_REJECTED' | 'TS_TRANSPILER_UNAVAILABLE' | 'TS_TRANSPILE_FAILED' | 'TODO_LIST_INVALID' | 'TODO_ITEM_NOT_FOUND' | 'SKILL_GENERATION_DISABLED' | 'SKILL_GENERATION_LIMIT_EXCEEDED' | 'SKILL_GENERATION_VALIDATION_FAILED' | 'DELEGATION_UNAVAILABLE' | 'DELEGATION_IN_PROGRESS' | 'DELEGATION_BUDGET_EXCEEDED' | 'PREFERENCE_IMPORT_INVALID' | 'PREFERENCE_IMPORT_VERSION_UNSUPPORTED' | 'PREFERENCE_IMPORT_CREDENTIAL_REJECTED' | 'DICTATION_UNAVAILABLE' | 'DICTATION_PERMISSION_DENIED' | 'DICTATION_FAILED' | 'PERCEPTION_NOT_ENABLED' | 'PERCEPTION_FAILED';
4
4
  /**
5
5
  * 所有公开 API 抛出的结构化错误,code 供上层可编程处理
6
6
  * @stable
@@ -29,6 +29,27 @@ interface JsonSchema {
29
29
  [key: string]: unknown;
30
30
  }
31
31
  //#endregion
32
+ //#region src/contracts/pagination.d.ts
33
+ /**
34
+ * 全仓统一的游标分页形状。会话、消息、治理列表共用同一套,
35
+ * 不为每个存储端口各造一种(形状一多,调用方就得为每个端口重写一遍翻页逻辑)。
36
+ */
37
+ interface PageQuery {
38
+ /**
39
+ * 不透明续读位置,只能来自上一页的 `nextCursor`。
40
+ * 刻意不是数字 offset:追加型存储上并发追加会让 offset 错位,
41
+ * 而不透明串让实现方自己决定编码。
42
+ */
43
+ cursor?: string;
44
+ /** 本页最多返回多少条;缺省值由**存储实现**决定,不由调用方兜底 */
45
+ limit?: number;
46
+ }
47
+ /** 一页结果。`nextCursor` 缺席即已到末页,不用额外的 `hasMore` 布尔 */
48
+ interface Page<T> {
49
+ items: T[];
50
+ nextCursor?: string;
51
+ }
52
+ //#endregion
32
53
  //#region src/skill/manifest.d.ts
33
54
  type SkillInstallSource = {
34
55
  type: 'local';
@@ -181,7 +202,12 @@ interface SkillSignature {
181
202
  signature: string;
182
203
  signedAt: string;
183
204
  }
184
- /** 未签名包的处置策略;0.3.0 默认 `warn`,0.4.0 与 D10 一起收紧 */
205
+ /**
206
+ * 未签名包的处置策略。默认是 `warn`,0.4.0(D2)复核后维持不变:
207
+ * 默认信任库是空的,`deny` 之下未签名包报 `SIGNATURE_MISSING`、签名再正确也报
208
+ * `SIGNATURE_UNTRUSTED_KEY`——接受集为空,那不是更严的默认值而是恒失败的安装。
209
+ * `deny` 必须与装配好的 `TrustedKeyStore` 成对启用。
210
+ */
185
211
  type UnsignedPolicy = 'allow' | 'warn' | 'deny';
186
212
  interface TrustedKey {
187
213
  keyId: string;
@@ -342,6 +368,22 @@ interface RemoteUrlPolicy {
342
368
  */
343
369
  declare function assertRemoteUrlAllowed(rawUrl: string, policy?: RemoteUrlPolicy): URL;
344
370
  //#endregion
371
+ //#region src/ui/types.d.ts
372
+ /**
373
+ * 声明式 UI 的节点:框架无关,技能脚本与 LLM 产出同一形状。
374
+ *
375
+ * 定义放在 core 而不是 ui/runtime:runtime 要用它做结构校验,ui 要用它做 catalog
376
+ * 语义校验,两者互不依赖。`@webskill/ui` 以同名 re-export,公开名不变。
377
+ */
378
+ interface UiSpecNode {
379
+ /** catalog 中声明过的组件名 */
380
+ component: string;
381
+ props?: Record<string, unknown>;
382
+ children?: UiSpecNode[];
383
+ /** 稳定 id(回放与 action 关联用;交互节点以此作为 actionId) */
384
+ id?: string;
385
+ }
386
+ //#endregion
345
387
  //#region src/skill/types.d.ts
346
388
  type SkillSource = 'local' | 'mcp' | 'generated' | 'installed';
347
389
  /**
@@ -540,7 +582,7 @@ declare function escapeXml(text: string): string;
540
582
  declare function renderAvailableSkillsXml(catalog: SkillCatalog): string;
541
583
  declare const xmlRenderer: CatalogRenderer;
542
584
  //#endregion
543
- //#region ../runtime/dist/types-AmKCKJn_.d.ts
585
+ //#region ../runtime/dist/types-D_hoCri8.d.ts
544
586
  //#region src/llm/streamTypes.d.ts
545
587
  /** 流式 LLM 事件(OpenAI SSE / Vercel fullStream 统一映射) */
546
588
  type LlmStreamEvent = {
@@ -555,9 +597,26 @@ type LlmStreamEvent = {
555
597
  };
556
598
  //#endregion
557
599
  //#region src/llm/types.d.ts
600
+ /**
601
+ * 消息内容分片。二进制一律 base64 内联:引用形态(URL / 句柄)需要生命周期管理,
602
+ * 不属于本批。代价是快照体积。
603
+ */
604
+ type LlmContentPart = {
605
+ type: 'text';
606
+ text: string;
607
+ } | {
608
+ type: 'image';
609
+ mimeType: string;
610
+ data: string;
611
+ } | {
612
+ type: 'file';
613
+ mimeType: string;
614
+ data: string;
615
+ name?: string;
616
+ };
558
617
  interface LlmMessage {
559
618
  role: 'system' | 'user' | 'assistant' | 'tool';
560
- content: string;
619
+ content: LlmContentPart[];
561
620
  /** role=tool 时必填 */
562
621
  toolCallId?: string;
563
622
  /** role=assistant 发起工具调用时携带 */
@@ -576,7 +635,7 @@ interface LlmToolCall {
576
635
  argumentsParseError?: string;
577
636
  }
578
637
  interface LlmResponse {
579
- content?: string;
638
+ content?: LlmContentPart[];
580
639
  toolCalls?: LlmToolCall[];
581
640
  raw?: unknown;
582
641
  }
@@ -623,7 +682,21 @@ interface ArtifactStore {
623
682
  }
624
683
  //#endregion
625
684
  //#region src/interaction/types.d.ts
685
+ /**
686
+ * 交互的发起方标识(FR-11.6)。串行委派下父 agent 与子 agent 都能发起交互,
687
+ * 缺了这个标识用户无法判断弹出来的表单属于哪个子任务。
688
+ * 缺省即父 agent 自己发起。
689
+ * @experimental
690
+ */
691
+ interface InteractionOrigin {
692
+ /** 展示用标签,通常是子任务标题 */
693
+ label: string;
694
+ /** 关联的待办条目 */
695
+ todoId?: string;
696
+ }
626
697
  type InteractionRequest = {
698
+ origin?: InteractionOrigin;
699
+ } & ({
627
700
  type: 'ask';
628
701
  id: string;
629
702
  message: string;
@@ -656,7 +729,7 @@ type InteractionRequest = {
656
729
  capability: 'readReference' | 'writeArtifact' | 'confirm';
657
730
  message: string;
658
731
  details?: unknown;
659
- };
732
+ });
660
733
  interface InteractionResponse {
661
734
  id: string;
662
735
  value?: unknown;
@@ -703,14 +776,16 @@ interface RenderResultRequest {
703
776
  artifacts?: Artifact[];
704
777
  }
705
778
  /** A user action exposed by a generative UI surface. @experimental */
706
- interface UiSurfaceAction {
779
+ interface UiSpecActionCapability {
780
+ /** Matches the `id` of the interactive node that declares the action. */
707
781
  id: string;
708
- label: string;
709
782
  intent: 'submit' | 'cancel' | 'select' | 'download' | 'refresh';
710
- disabled?: boolean;
711
783
  /** Requests that the producing run waits for this action before continuing. @experimental */
712
784
  awaitResponse?: boolean;
713
- /** Runtime-generated action capability; model-provided values are never trusted. @experimental */
785
+ /**
786
+ * Runtime-generated action capability. Kept out of the node tree on purpose:
787
+ * the tree is model-writable, so a nonce carried inside it would be forgeable.
788
+ */
714
789
  nonce?: string;
715
790
  }
716
791
  /** A runtime-owned request for a user action on a rendered UI surface. @experimental */
@@ -718,7 +793,7 @@ interface UiSurfaceActionRequest {
718
793
  runId: string;
719
794
  surfaceId: string;
720
795
  actionId: string;
721
- intent: UiSurfaceAction['intent'];
796
+ intent: UiSpecActionCapability['intent'];
722
797
  nonce: string;
723
798
  }
724
799
  /** A structured action returned by a renderer to the waiting run. @experimental */
@@ -727,75 +802,26 @@ interface UiSurfaceActionResponse extends UiSurfaceActionRequest {
727
802
  cancelled?: boolean;
728
803
  }
729
804
  /** Serializable draft values for forms that belong to one interrupted run. @experimental */
730
- type UiSurfaceDrafts = Record<string, Record<string, unknown>>;
731
- /** A structured form field rendered inside a generative UI surface. @experimental */
732
- interface UiSurfaceFormField {
733
- name: string;
734
- label: string;
735
- type: 'text' | 'number' | 'date' | 'textarea' | 'select' | 'multi-select' | 'toggle' | 'file';
736
- required?: boolean;
737
- description?: string;
738
- defaultValue?: unknown;
739
- options?: Array<{
740
- label: string;
741
- value: unknown;
742
- }>;
743
- }
744
- /** Framework-neutral generative UI surface. @experimental */
745
- type UiSurface = {
746
- kind: 'form';
747
- id: string;
748
- title?: string;
749
- fields: UiSurfaceFormField[];
750
- actions: UiSurfaceAction[];
751
- } | {
752
- kind: 'chart';
753
- id: string;
754
- chart: ChartSpec;
755
- actions?: UiSurfaceAction[];
756
- } | {
757
- kind: 'table';
758
- id: string;
759
- columns: string[];
760
- rows: unknown[][];
761
- actions?: UiSurfaceAction[];
762
- } | {
763
- kind: 'metric';
764
- id: string;
765
- label: string;
766
- value: string | number;
767
- trend?: 'up' | 'down' | 'neutral';
768
- } | {
769
- kind: 'file';
770
- id: string;
771
- path: string;
772
- mimeType?: string;
773
- size?: number;
774
- actions?: UiSurfaceAction[];
775
- } | {
776
- kind: 'custom';
777
- id: string;
778
- component: string;
779
- props: unknown;
780
- actions?: UiSurfaceAction[];
781
- };
782
- /** A bounded mutation applied to an existing UI surface. @experimental */
783
- interface UiSurfacePatch {
805
+ type UiSpecDrafts = Record<string, Record<string, unknown>>;
806
+ /** A bounded mutation applied to an existing UI spec tree. @experimental */
807
+ interface UiSpecPatch {
784
808
  op: 'replace' | 'merge' | 'append';
785
809
  path: string;
786
810
  value: unknown;
787
811
  }
788
812
  /** Incremental lifecycle event for a framework-neutral generative UI surface. @experimental */
789
- type UiSurfaceEvent = {
813
+ type UiSpecEvent = {
790
814
  runId?: string;
791
815
  } & ({
792
816
  type: 'open';
793
- surface: UiSurface;
817
+ id: string;
818
+ node: UiSpecNode;
819
+ actions?: UiSpecActionCapability[];
794
820
  } | {
795
821
  type: 'patch';
796
822
  id: string;
797
823
  revision: number;
798
- operations: UiSurfacePatch[];
824
+ operations: UiSpecPatch[];
799
825
  } | {
800
826
  type: 'complete';
801
827
  id: string;
@@ -810,8 +836,10 @@ type UiSurfaceEvent = {
810
836
  id: string;
811
837
  });
812
838
  /** Persisted state of a generative UI surface. @experimental */
813
- interface UiSurfaceSnapshot {
814
- surface: UiSurface;
839
+ interface UiSpecSnapshot {
840
+ id: string;
841
+ node: UiSpecNode;
842
+ actions?: UiSpecActionCapability[];
815
843
  revision: number;
816
844
  status: 'active' | 'complete' | 'error' | 'cancelled';
817
845
  /** Immutable producing run; supplied on open to support session persistence and replay. */
@@ -834,7 +862,7 @@ interface UiBridge {
834
862
  /** 定义即可,阶段 7 消费 */
835
863
  renderResult?(input: RenderResultRequest): Promise<void>;
836
864
  /** Framework-neutral generative UI surface stream. @experimental */
837
- renderSurface?(event: UiSurfaceEvent): Promise<void>;
865
+ renderSurface?(event: UiSpecEvent): Promise<void>;
838
866
  /** Waits for an action declared with awaitResponse; optional for compatibility with legacy bridges. @experimental */
839
867
  requestSurfaceAction?(input: UiSurfaceActionRequest): Promise<UiSurfaceActionResponse>;
840
868
  /** Best-effort cleanup when a surface action wait times out or is cancelled. @experimental */
@@ -853,6 +881,17 @@ interface FormField {
853
881
  label: string;
854
882
  value: unknown;
855
883
  }>;
884
+ /** 跨会话稳定的字段标识 `<skillName>#<fieldName>`(FR-5.6);缺省表示该字段不参与召回 */
885
+ fieldKey?: string;
886
+ /**
887
+ * 上次填写值(FR-5.9)。**刻意不叫 defaultValue**:渲染器会把 defaultValue 直接填进控件,
888
+ * 而历史值可能是手机号、地址甚至凭据,必须由用户看到后主动采纳。
889
+ * @experimental
890
+ */
891
+ suggestion?: {
892
+ value: unknown;
893
+ ts: number;
894
+ };
856
895
  }
857
896
  interface InteractionPolicy {
858
897
  /** 缺必填参数策略:默认 'user'(表单问用户),'llm' 回喂自愈 */
@@ -878,4 +917,4 @@ interface MemoryStore {
878
917
  transaction?<T>(scope: string, fn: (inner: MemoryStore) => Promise<T>): Promise<T>;
879
918
  }
880
919
  //#endregion
881
- export { SkillInstallSource as $, CryptoKeyLike as A, messageOf as At, SIGNATURE_SCHEMA_VERSION as B, signSkill as Bt, UiSurfaceDrafts as C, checkSkillRules as Ct, UiSurfaceSnapshot as D, isValidSkillName as Dt, UiSurfacePatch as E, exportSkills as Et, FsTrustedKeyStore as F, readSkillSignature as Ft, SKILL_PACK_FILE as G, verifySkillSignature as Gt, SKILL_MANIFEST_FILE as H, unzipWithLimits as Ht, JsonSchema as I, renderAvailableSkillsXml as It, SignatureVerdict as J, SKILL_SIGNATURE_FILE as K, xmlRenderer as Kt, MANIFEST_EXCLUDED_FILES as L, renderCatalogJson as Lt, DiscoveryResult as M, parseSkillMarkdown as Mt, FileStat as N, parseSkillPackManifest as Nt, ArchiveLimits as O, jsonRenderer as Ot, FileSystemProvider as P, readResponseWithLimit as Pt, SkillDocument as Q, MemoryFS as R, resolveArchiveLimits as Rt, UiSurfaceActionResponse as S, checkDependencyCycles as St, UiSurfaceFormField as T, escapeXml as Tt, SKILL_NAME_MAX_LENGTH as U, validateSkills as Ut, SKILLS_LOCKFILE as V, signaturePayloadBytes as Vt, SKILL_NAME_PATTERN as W, verifyManifest as Wt, SkillCatalogEntry as X, SkillCatalog as Y, SkillDiscovery as Z, RenderResultRequest as _, assertRemoteUrlAllowed as _t, InteractionPolicy as a, SkillPackManifest as at, UiSurfaceAction as b, buildCatalog as bt, LlmClient as c, SkillSource as ct, LlmResponse as d, TrustedKeyStore as dt, SkillIssue as et, LlmStreamEvent as f, UnsignedPolicy as ft, RenderBlock as g, WebSkillErrorCode as gt, MemoryStore as h, WebSkillError as ht, FormField as i, SkillMetadata as it, DEFAULT_ARCHIVE_LIMITS as j, normalizePath as jt, CatalogRenderer as k, keyIdOf as kt, LlmCompleteInput as l, SkillsLockfile as lt, LlmToolSpec as m, VerifyResult as mt, ArtifactStore as n, SkillManagerPort as nt, InteractionRequest as o, SkillReader as ot, LlmToolCall as p, ValidationReport as pt, SignatureAuditSink as q, ChartSpec as r, SkillManifest as rt, InteractionResponse as s, SkillSignature as st, Artifact as t, SkillLocation as tt, LlmMessage as u, TrustedKey as ut, UiBridge as v, assertSafePathSegment as vt, UiSurfaceEvent as w, computeDigest as wt, UiSurfaceActionRequest as x, buildManifest as xt, UiSurface as y, atomicWriteText as yt, RemoteUrlPolicy as z, resolveInsideRoot as zt };
920
+ export { SkillDiscovery as $, CryptoKeyLike as A, isValidSkillName as At, PageQuery as B, renderCatalogJson as Bt, UiSpecEvent as C, buildCatalog as Ct, UiSurfaceActionResponse as D, computeDigest as Dt, UiSurfaceActionRequest as E, checkSkillRules as Et, FsTrustedKeyStore as F, parseSkillMarkdown as Ft, SKILL_NAME_MAX_LENGTH as G, unzipWithLimits as Gt, SIGNATURE_SCHEMA_VERSION as H, resolveInsideRoot as Ht, JsonSchema as I, parseSkillPackManifest as It, SKILL_SIGNATURE_FILE as J, verifySkillSignature as Jt, SKILL_NAME_PATTERN as K, validateSkills as Kt, MANIFEST_EXCLUDED_FILES as L, readResponseWithLimit as Lt, DiscoveryResult as M, keyIdOf as Mt, FileStat as N, messageOf as Nt, ArchiveLimits as O, escapeXml as Ot, FileSystemProvider as P, normalizePath as Pt, SkillCatalogEntry as Q, MemoryFS as R, readSkillSignature as Rt, UiSpecDrafts as S, atomicWriteText as St, UiSpecSnapshot as T, checkDependencyCycles as Tt, SKILLS_LOCKFILE as U, signSkill as Ut, RemoteUrlPolicy as V, resolveArchiveLimits as Vt, SKILL_MANIFEST_FILE as W, signaturePayloadBytes as Wt, SignatureVerdict as X, SignatureAuditSink as Y, xmlRenderer as Yt, SkillCatalog as Z, MemoryStore as _, VerifyResult as _t, InteractionOrigin as a, SkillManifest as at, UiBridge as b, assertRemoteUrlAllowed as bt, InteractionResponse as c, SkillReader as ct, LlmContentPart as d, SkillsLockfile as dt, SkillDocument as et, LlmMessage as f, TrustedKey as ft, LlmToolSpec as g, ValidationReport as gt, LlmToolCall as h, UnsignedPolicy as ht, FormField as i, SkillManagerPort as it, DEFAULT_ARCHIVE_LIMITS as j, jsonRenderer as jt, CatalogRenderer as k, exportSkills as kt, LlmClient as l, SkillSignature as lt, LlmStreamEvent as m, UiSpecNode as mt, ArtifactStore as n, SkillIssue as nt, InteractionPolicy as o, SkillMetadata as ot, LlmResponse as p, TrustedKeyStore as pt, SKILL_PACK_FILE as q, verifyManifest as qt, ChartSpec as r, SkillLocation as rt, InteractionRequest as s, SkillPackManifest as st, Artifact as t, SkillInstallSource as tt, LlmCompleteInput as u, SkillSource as ut, RenderBlock as v, WebSkillError as vt, UiSpecPatch as w, buildManifest as wt, UiSpecActionCapability as x, assertSafePathSegment as xt, RenderResultRequest as y, WebSkillErrorCode as yt, Page as z, renderAvailableSkillsXml as zt };