@webskill/sdk 0.4.0 → 0.6.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 +909 -0
  3. package/dist/browser.d.ts +233 -4
  4. package/dist/browser.js +869 -19
  5. package/dist/{catalogComponents-KsujmL4b-Clx1kCnU.js → catalogComponents-Dr5dFMAb-Dacibl1e.js} +372 -126
  6. package/dist/{dist-D9Lcn5Pp.js → dist-DnYG2-eY.js} +642 -39
  7. package/dist/{dist-C-Sh0MDU.js → dist-DusANsrn.js} +1035 -99
  8. package/dist/{env--jJB-TSX-04klhTYi.js → env-8cY40DXB-CGnEVZby.js} +7 -6
  9. package/dist/{env-BPUBZCwJ-4jat_SVG.d.ts → env-AK3cSMEA-Dli6QU5E.d.ts} +4 -3
  10. package/dist/governance.d.ts +46 -4
  11. package/dist/governance.js +45 -2
  12. package/dist/{index-CHXxDccV.d.ts → index-BMocOEi0.d.ts} +106 -10
  13. package/dist/index-BuTpBMzr.d.ts +474 -0
  14. package/dist/{index-DLfR2Y6I.d.ts → index-C-KFAZoF.d.ts} +337 -18
  15. package/dist/index.d.ts +3 -3
  16. package/dist/index.js +3 -3
  17. package/dist/mcp.d.ts +39 -8
  18. package/dist/mcp.js +53 -19
  19. package/dist/{memoryArtifactStore-BtOeB_hm-tj3fC5ip.js → memoryArtifactStore-52Zn9npI-BMPYwvoy.js} +10 -2
  20. package/dist/node.d.ts +4 -4
  21. package/dist/node.js +9 -2
  22. package/dist/{openUiLibrary-YLS-cxyT-C96jWDQq.js → openUiLibrary-Bdrji9qK-DzAxRlTY.js} +3 -3
  23. package/dist/{skillVersionStore-uyefLPR1-DXOzbksv.d.ts → skillVersionStore-BzLbzFOL-CxdAFWO2.d.ts} +4 -3
  24. package/dist/{testing-DDCJWvgA.js → testing-CYTFqkDm.js} +1 -1
  25. package/dist/testing.d.ts +2 -2
  26. package/dist/testing.js +3 -3
  27. package/dist/{types-7Wcg--Vh-1YlQ4jF9.d.ts → types-4pg-qp_I-Gq63X8Oa.d.ts} +55 -5
  28. package/dist/ui-react.d.ts +26 -5
  29. package/dist/ui-react.js +147 -29
  30. package/dist/ui-vue.d.ts +1 -1
  31. package/dist/ui-vue.js +30 -6
  32. package/dist/ui.d.ts +4 -4
  33. package/dist/ui.js +3 -3
  34. package/dist/{webskillLitCatalog-CSTbhBe_-CYIs5BX8.js → webskillLitCatalog-_mugzRHx-B_54vxum.js} +88 -2
  35. package/package.json +6 -1
package/dist/mcp.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { $ as SkillDocument, F as JsonSchema, Z as SkillCatalogEntry, h as LlmToolSpec } from "./types-7Wcg--Vh-1YlQ4jF9.js";
2
- import { Yt as mergeCatalogEntries, b as ExternalSkillProvider, kt as ToolResult, x as ExternalToolSource } from "./index-DLfR2Y6I.js";
1
+ import { I as JsonSchema, Q as SkillCatalogEntry, et as SkillDocument, g as LlmToolSpec } from "./types-4pg-qp_I-Gq63X8Oa.js";
2
+ import { D as ExternalSkillProvider, O as ExternalToolSource, Tn as mergeCatalogEntries, Ut as ToolResult } from "./index-C-KFAZoF.js";
3
3
  import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
4
4
  import { JSONRPCMessage } from "@modelcontextprotocol/sdk/types.js";
5
5
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
@@ -192,15 +192,46 @@ declare function serveSkillAsMcp(server: McpServer, skill: ServedSkill): Promise
192
192
  declare const catalogMerge: typeof mergeCatalogEntries;
193
193
  //#endregion
194
194
  //#region src/webmcp/experimentalWebMcpAdapter.d.ts
195
- /** navigator.modelContext 鸭子类型(对齐浏览器 WebMCP API 草案) */
195
+ /**
196
+ * WebMCP 命令式 API 的工具形状(Chrome 150+)。
197
+ * `getTools()` 返回的工具含 `inputSchema`(JSON 字符串)、`origin`、`window`、`annotations`。
198
+ * 参考 https://developer.chrome.com/docs/ai/webmcp/imperative-api
199
+ */
200
+ interface WebMcpToolLike {
201
+ name: string;
202
+ description?: string;
203
+ /** getTools() 返回的 inputSchema 是 JSON 字符串(非对象) */
204
+ inputSchema?: string;
205
+ origin?: string;
206
+ window?: unknown;
207
+ annotations?: {
208
+ readOnlyHint?: boolean;
209
+ untrustedContentHint?: boolean;
210
+ };
211
+ }
212
+ /**
213
+ * document.modelContext 鸭子类型(对齐 Chrome 150+ 的 WebMCP 命令式 API)。
214
+ * - 旧版(Chrome <150):navigator.modelContext.listTools() / executeTool(name, argsJson)
215
+ * - 新版(Chrome 150+):document.modelContext.getTools() / executeTool(tool, argsJson, { signal? })
216
+ * executeTool 的第一参在两种版本都能接受:新版传 tool 对象,旧版传 name 字符串。
217
+ */
196
218
  interface BrowserModelContextLike {
197
- listTools?: () => Promise<unknown>;
198
- executeTool?: (name: string, argsJson: string) => Promise<unknown>;
219
+ getTools?: () => Promise<unknown>;
220
+ executeTool?: (tool: WebMcpToolLike | string, argsJson: string, options?: {
221
+ signal?: AbortSignal;
222
+ }) => Promise<unknown>;
199
223
  }
200
224
  interface WebMcpToolDescriptor {
201
225
  name: string;
202
226
  description?: string;
203
227
  inputSchema?: unknown;
228
+ origin?: string;
229
+ annotations?: {
230
+ readOnlyHint?: boolean;
231
+ untrustedContentHint?: boolean;
232
+ };
233
+ /** getTools() 返回的原始 tool 对象:executeTool 第一参须透传原对象(含 inputSchema JSON 字符串、window 等) */
234
+ raw?: unknown;
204
235
  }
205
236
  /**
206
237
  * Experimental WebMCP Adapter(mcp# 分支):默认关闭显式启用;
@@ -214,9 +245,9 @@ declare class ExperimentalWebMcpAdapter {
214
245
  enabled?: boolean;
215
246
  });
216
247
  isAvailable(): boolean;
217
- /** 工具清单(listTools 缺失时返回 undefined;调用失败时告警后返回 undefined) */
248
+ /** 工具清单(getTools 缺失时返回 undefined;调用失败时告警后返回 undefined) */
218
249
  listTools(): Promise<WebMcpToolDescriptor[] | undefined>;
219
- /** 工具名清单(listTools 缺失/失败时返回 undefined) */
250
+ /** 工具名清单(getTools 缺失/失败时返回 undefined) */
220
251
  listToolNames(): Promise<string[] | undefined>;
221
252
  call(toolName: string, args: Record<string, unknown>): Promise<ToolResult>;
222
253
  }
@@ -269,4 +300,4 @@ declare function connectRemoteEndpoint(registry: EndpointRegistry<McpClientLike>
269
300
  close(): Promise<void>;
270
301
  }>;
271
302
  //#endregion
272
- export { type BrowserModelContextLike, EndpointRegistry, ExperimentalWebMcpAdapter, type McpClientLike, McpRuntimePlugin, McpToolResolver, MessageChannelTransport, type MessageChannelTransportOptions, type MessagePortLike, type RemoteEndpointConfig, type ServedSkill, TemporarySkillProvider, type TransportState, type WebMcpToolDescriptor, catalogMerge, connectRemoteEndpoint, endpointToolLlmName, parseEndpointToolLlmName, parseWebMcpToolLlmName, serveSkillAsMcp, validateJsonRpcMessage, webMcpToolLlmName };
303
+ export { type BrowserModelContextLike, EndpointRegistry, ExperimentalWebMcpAdapter, type McpClientLike, McpRuntimePlugin, McpToolResolver, MessageChannelTransport, type MessageChannelTransportOptions, type MessagePortLike, type RemoteEndpointConfig, type ServedSkill, TemporarySkillProvider, type TransportState, type WebMcpToolDescriptor, type WebMcpToolLike, catalogMerge, connectRemoteEndpoint, endpointToolLlmName, parseEndpointToolLlmName, parseWebMcpToolLlmName, serveSkillAsMcp, validateJsonRpcMessage, webMcpToolLlmName };
package/dist/mcp.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { O as messageOf, h as assertRemoteUrlAllowed, m as WebSkillError } from "./dist-8oQRa8Xz.js";
2
- import { H as normalizeToolContent, R as mergeCatalogEntries } from "./dist-C-Sh0MDU.js";
2
+ import { at as normalizeToolContent, et as mergeCatalogEntries } from "./dist-DusANsrn.js";
3
3
 
4
4
  //#region ../mcp/dist/index.js
5
5
  /**
@@ -392,15 +392,39 @@ const failure = (code, message) => ({
392
392
  message
393
393
  }
394
394
  });
395
- /** listTools 返回值提取工具描述(容忍数组或 {tools:[]} 两种形状) */
395
+ /** getTools() 返回的工具 描述符:inputSchema JSON 字符串时解析为对象,并保留原始对象 */
396
+ function toDescriptor(raw) {
397
+ if (typeof raw !== "object" || raw === null) return void 0;
398
+ const t = raw;
399
+ const name = String(t["name"] ?? "");
400
+ if (name === "") return void 0;
401
+ const descriptor = {
402
+ name,
403
+ raw
404
+ };
405
+ if (typeof t["description"] === "string") descriptor.description = t["description"];
406
+ if (typeof t["origin"] === "string") descriptor.origin = t["origin"];
407
+ if (typeof t["annotations"] === "object" && t["annotations"] !== null) {
408
+ const annotations = t["annotations"];
409
+ descriptor.annotations = {
410
+ ...typeof annotations["readOnlyHint"] === "boolean" ? { readOnlyHint: annotations["readOnlyHint"] } : {},
411
+ ...typeof annotations["untrustedContentHint"] === "boolean" ? { untrustedContentHint: annotations["untrustedContentHint"] } : {}
412
+ };
413
+ }
414
+ const schema = t["inputSchema"];
415
+ if (typeof schema === "string" && schema.trim() !== "") try {
416
+ descriptor.inputSchema = JSON.parse(schema);
417
+ } catch {
418
+ descriptor.inputSchema = schema;
419
+ }
420
+ else if (typeof schema === "object" && schema !== null) descriptor.inputSchema = schema;
421
+ return descriptor;
422
+ }
423
+ /** 从 getTools 返回值提取工具描述(容忍数组或 {tools:[]} 两种形状) */
396
424
  function extractToolDescriptors(raw) {
397
425
  const list = Array.isArray(raw) ? raw : typeof raw === "object" && raw !== null && Array.isArray(raw.tools) ? raw.tools : void 0;
398
426
  if (!list) return void 0;
399
- return list.filter((t) => typeof t === "object" && t !== null).map((t) => ({
400
- name: String(t["name"] ?? ""),
401
- ...typeof t["description"] === "string" ? { description: t["description"] } : {},
402
- ...typeof t["inputSchema"] === "object" && t["inputSchema"] !== null ? { inputSchema: t["inputSchema"] } : {}
403
- })).filter((t) => t.name !== "");
427
+ return list.map(toDescriptor).filter((d) => d !== void 0);
404
428
  }
405
429
  /**
406
430
  * Experimental WebMCP Adapter(mcp# 分支):默认关闭显式启用;
@@ -416,35 +440,45 @@ var ExperimentalWebMcpAdapter = class {
416
440
  this.#enabled = options?.enabled ?? false;
417
441
  }
418
442
  isAvailable() {
419
- return this.#enabled && typeof this.#resolveApi()?.executeTool === "function";
443
+ const api = this.#resolveApi();
444
+ return this.#enabled && typeof api?.executeTool === "function";
420
445
  }
421
- /** 工具清单(listTools 缺失时返回 undefined;调用失败时告警后返回 undefined) */
446
+ /** 工具清单(getTools 缺失时返回 undefined;调用失败时告警后返回 undefined) */
422
447
  async listTools() {
423
448
  const api = this.#resolveApi();
424
- if (typeof api?.listTools !== "function") return void 0;
449
+ if (typeof api?.getTools !== "function") return void 0;
425
450
  try {
426
- return extractToolDescriptors(await api.listTools());
451
+ return extractToolDescriptors(await api.getTools());
427
452
  } catch (e) {
428
- console.warn(`[webskill] navigator.modelContext.listTools() failed: ${e instanceof Error ? e.message : String(e)}`);
453
+ console.warn(`[webskill] document.modelContext.getTools() failed: ${e instanceof Error ? e.message : String(e)}`);
429
454
  return;
430
455
  }
431
456
  }
432
- /** 工具名清单(listTools 缺失/失败时返回 undefined) */
457
+ /** 工具名清单(getTools 缺失/失败时返回 undefined) */
433
458
  async listToolNames() {
434
459
  return (await this.listTools())?.map((t) => t.name);
435
460
  }
436
461
  async call(toolName, args) {
437
462
  if (!this.#enabled) return failure("TOOL_UNSUPPORTED", "WebMCP adapter is disabled (enable it explicitly to use mcp# tools)");
438
463
  const api = this.#resolveApi();
439
- if (typeof api?.executeTool !== "function") return failure("TOOL_UNSUPPORTED", "navigator.modelContext is not available");
440
- if (typeof api.listTools === "function") try {
441
- const names = extractToolDescriptors(await api.listTools())?.map((t) => t.name);
442
- if (names && !names.includes(toolName)) return failure("MCP_TOOL_NOT_FOUND", `WebMCP tool "${toolName}" not found`);
443
- } catch {}
464
+ if (typeof api?.executeTool !== "function") return failure("TOOL_UNSUPPORTED", "document.modelContext is not available");
465
+ const argsJson = JSON.stringify(args);
466
+ if (typeof api.getTools === "function") try {
467
+ const descriptors = extractToolDescriptors(await api.getTools());
468
+ const match = descriptors?.find((t) => t.name === toolName);
469
+ if (descriptors !== void 0 && match === void 0) return failure("MCP_TOOL_NOT_FOUND", `WebMCP tool "${toolName}" not found`);
470
+ const tool = match?.raw ?? { name: toolName };
471
+ return {
472
+ ok: true,
473
+ content: normalizeToolContent(await api.executeTool(tool, argsJson))
474
+ };
475
+ } catch (e) {
476
+ return failure("TOOL_EXECUTION_FAILED", `WebMCP tool "${toolName}" failed: ${messageOf(e)}`);
477
+ }
444
478
  try {
445
479
  return {
446
480
  ok: true,
447
- content: normalizeToolContent(await api.executeTool(toolName, JSON.stringify(args)))
481
+ content: normalizeToolContent(await api.executeTool(toolName, argsJson))
448
482
  };
449
483
  } catch (e) {
450
484
  return failure("TOOL_EXECUTION_FAILED", `WebMCP tool "${toolName}" failed: ${messageOf(e)}`);
@@ -1,6 +1,6 @@
1
1
  import { m as WebSkillError } from "./dist-8oQRa8Xz.js";
2
2
 
3
- //#region ../runtime/dist/memoryArtifactStore-BtOeB_hm.js
3
+ //#region ../runtime/dist/memoryArtifactStore-52Zn9npI.js
4
4
  /** 纯文本消息内容的构造快捷方式(引擎内部绝大多数消息仍是纯文本) */
5
5
  const textParts = (text) => [{
6
6
  type: "text",
@@ -8,6 +8,14 @@ const textParts = (text) => [{
8
8
  }];
9
9
  /** 取出 parts 中的文本(非文本分片在纯文本语境下无法表达,此处按丢弃处理——调用方须先校验) */
10
10
  const partsToText = (parts) => (parts ?? []).reduce((acc, part) => part.type === "text" ? acc + part.text : acc, "");
11
+ /**
12
+ * run 的提示词文本投影:`RuntimeRun.userPrompt` 与快照都是字符串字段,
13
+ * 而多模态提示词里的图片/文件分片没有文本形态,用占位符标注,避免记录成空串。
14
+ */
15
+ const promptText = (prompt) => {
16
+ if (typeof prompt === "string") return prompt;
17
+ return prompt.map((part) => part.type === "text" ? part.text : `[${part.type}: ${part.mimeType}]`).join("\n");
18
+ };
11
19
  const isContentPart = (value) => {
12
20
  if (typeof value !== "object" || value === null) return false;
13
21
  const part = value;
@@ -75,4 +83,4 @@ var MemoryArtifactStore = class {
75
83
  };
76
84
 
77
85
  //#endregion
78
- export { validateLlmMessages as a, textParts as i, partsToText as n, rejectUnsupportedPart as r, MemoryArtifactStore as t };
86
+ export { textParts as a, rejectUnsupportedPart as i, partsToText as n, validateLlmMessages as o, promptText as r, MemoryArtifactStore as t };
package/dist/node.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { D as ArchiveLimits, F as JsonSchema, H as SKILLS_LOCKFILE, J as SignatureAuditSink, M as FileStat, N as FileSystemProvider, U as SKILL_MANIFEST_FILE, et as SkillInstallSource, ft as TrustedKeyStore, gt as VerifyResult, it as SkillManifest, mt as UnsignedPolicy, o as InteractionRequest, rt as SkillManagerPort, s as InteractionResponse, ut as SkillsLockfile, v as RenderResultRequest, y as UiBridge } from "./types-7Wcg--Vh-1YlQ4jF9.js";
2
- import { C as FsArtifactStore, Dt as ToolDefinition, Lt as WebSkillRuntime, Rt as WebSkillRuntimeDeps, V as NetworkPolicy, Vt as createScriptContext, d as ApprovalScope, f as BridgeCapabilities, gt as ScriptExecutor, ht as ScriptExecutionContext, kt as ToolResult, mt as SchemaInferer, w as FsMemoryStore } from "./index-DLfR2Y6I.js";
3
- import { a as AuditLog, p as CandidateStore, r as ApprovalPolicy, u as CandidateSkill, v as SkillVersionStore } from "./skillVersionStore-uyefLPR1-DXOzbksv.js";
4
- import { n as LlmEnvConfig, s as probeLlmCapabilities, t as LlmCapabilities } from "./env-BPUBZCwJ-4jat_SVG.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-4pg-qp_I-Gq63X8Oa.js";
2
+ import { A as FsArtifactStore, Ct as ScriptExecutionContext, J as NetworkPolicy, St as SchemaInferer, Ut as ToolResult, Vt as ToolDefinition, _ as BridgeCapabilities, f as ApprovalScope, fn as createScriptContext, j as FsMemoryStore, on as WebSkillRuntime, sn as WebSkillRuntimeDeps, wt as ScriptExecutor } from "./index-C-KFAZoF.js";
3
+ import { a as AuditLog, p as CandidateStore, r as ApprovalPolicy, u as CandidateSkill, v as SkillVersionStore } from "./skillVersionStore-BzLbzFOL-CxdAFWO2.js";
4
+ import { n as LlmEnvConfig, s as probeLlmCapabilities, t as LlmCapabilities } from "./env-AK3cSMEA-Dli6QU5E.js";
5
5
  import { Readable, Writable } from "node:stream";
6
6
  //#region ../node/dist/index.d.ts
7
7
  //#region src/fs/nodeFs.d.ts
package/dist/node.js CHANGED
@@ -1,6 +1,6 @@
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 { A as createScriptContext, D as WebSkillRuntime, H as normalizeToolContent, O as bridgeError, U as normalizeToolError, W as parseBridgeRequest, l as FsArtifactStore, o as CapabilityApproval, u as FsMemoryStore, z as networkPolicyLibSource } from "./dist-C-Sh0MDU.js";
3
- import { i as probeLlmCapabilities } from "./env--jJB-TSX-04klhTYi.js";
2
+ import { I as WebSkillRuntime, V as createScriptContext, at as normalizeToolContent, c as CapabilityApproval, m as FsMemoryStore, nt as networkPolicyLibSource, ot as normalizeToolError, p as FsArtifactStore, st as parseBridgeRequest, z as bridgeError } from "./dist-DusANsrn.js";
3
+ import { i as probeLlmCapabilities } from "./env-8cY40DXB-CGnEVZby.js";
4
4
  import { createRequire } from "node:module";
5
5
  import { unzipSync, zipSync } from "fflate";
6
6
  import { existsSync, promises, realpathSync } from "node:fs";
@@ -1148,6 +1148,13 @@ var CliUiBridge = class {
1148
1148
  value: answer === "y" || answer === "yes"
1149
1149
  };
1150
1150
  }
1151
+ case "file-pick": {
1152
+ const answer = (await this.#question(`${input.message}\nLocal file path (empty to decline): `)).trim();
1153
+ return answer === "" ? { id: input.id } : {
1154
+ id: input.id,
1155
+ value: { path: answer }
1156
+ };
1157
+ }
1151
1158
  }
1152
1159
  }
1153
1160
  async progress(input) {
@@ -1,5 +1,5 @@
1
- import { q as uiCatalog } from "./dist-D9Lcn5Pp.js";
2
- import { t as CatalogNode } from "./catalogComponents-KsujmL4b-Clx1kCnU.js";
1
+ import { nt as uiCatalog } from "./dist-DnYG2-eY.js";
2
+ import { t as CatalogNode } from "./catalogComponents-Dr5dFMAb-Dacibl1e.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-YLS-cxyT.js
3764
+ //#region ../ui-react/dist/openUiLibrary-Bdrji9qK.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 与描述,
@@ -1,8 +1,9 @@
1
- import { N as FileSystemProvider, R as Page, Z as SkillCatalogEntry, it as SkillManifest, z as PageQuery } from "./types-7Wcg--Vh-1YlQ4jF9.js";
2
- //#region ../governance/dist/skillVersionStore-uyefLPR1.d.ts
1
+ import { B as PageQuery, P as FileSystemProvider, Q as SkillCatalogEntry, at as SkillManifest, z as Page } from "./types-4pg-qp_I-Gq63X8Oa.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;
@@ -1,5 +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
+ import { a as textParts, n as partsToText } from "./memoryArtifactStore-52Zn9npI-BMPYwvoy.js";
3
3
 
4
4
  //#region ../runtime/dist/testing.js
5
5
  /**
package/dist/testing.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { c as LlmClient, f as LlmResponse, g as MemoryStore, l as LlmCompleteInput, n as ArtifactStore, o as InteractionRequest, p as LlmStreamEvent, s as InteractionResponse, t as Artifact, y as UiBridge } from "./types-7Wcg--Vh-1YlQ4jF9.js";
2
- import { a as loadGoogleConfigFromEnv, i as loadAnthropicConfigFromEnv, n as LlmEnvConfig, o as loadLlmConfigFromEnv, r as ProviderEnvConfig } from "./env-BPUBZCwJ-4jat_SVG.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-4pg-qp_I-Gq63X8Oa.js";
2
+ import { a as loadGoogleConfigFromEnv, i as loadAnthropicConfigFromEnv, n as LlmEnvConfig, o as loadLlmConfigFromEnv, r as ProviderEnvConfig } from "./env-AK3cSMEA-Dli6QU5E.js";
3
3
  //#region ../runtime/dist/testing.d.ts
4
4
  //#region src/llm/mockLlmClient.d.ts
5
5
  type MockLlmHandler = (input: LlmCompleteInput) => LlmResponse | Promise<LlmResponse>;
package/dist/testing.js CHANGED
@@ -1,5 +1,5 @@
1
- import { t as MemoryArtifactStore } from "./memoryArtifactStore-BtOeB_hm-tj3fC5ip.js";
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-DDCJWvgA.js";
1
+ import { t as MemoryArtifactStore } from "./memoryArtifactStore-52Zn9npI-BMPYwvoy.js";
2
+ import { n as loadGoogleConfigFromEnv, r as loadLlmConfigFromEnv, t as loadAnthropicConfigFromEnv } from "./env-8cY40DXB-CGnEVZby.js";
3
+ import { n as MockLlmClient, r as MockUiBridge, t as InMemoryStore } from "./testing-CYTFqkDm.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_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';
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' | 'TOOL_RESOLUTION_EXHAUSTED' | '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' | 'PROFILE_IMPORT_INVALID' | 'PROFILE_IMPORT_VERSION_UNSUPPORTED' | 'PROFILE_IMPORT_CREDENTIAL_REJECTED' | 'PROFILE_KEY_UNAVAILABLE' | 'DICTATION_UNAVAILABLE' | 'DICTATION_PERMISSION_DENIED' | 'DICTATION_FAILED' | 'PERCEPTION_NOT_ENABLED' | 'PERCEPTION_FAILED' | 'MODEL_IMAGE_UNSUPPORTED' | 'MODEL_TOOLS_UNSUPPORTED' | 'ATTACHMENT_TOO_LARGE' | 'ATTACHMENT_TYPE_REJECTED';
4
4
  /**
5
5
  * 所有公开 API 抛出的结构化错误,code 供上层可编程处理
6
6
  * @stable
@@ -582,7 +582,7 @@ declare function escapeXml(text: string): string;
582
582
  declare function renderAvailableSkillsXml(catalog: SkillCatalog): string;
583
583
  declare const xmlRenderer: CatalogRenderer;
584
584
  //#endregion
585
- //#region ../runtime/dist/types-7Wcg--Vh.d.ts
585
+ //#region ../runtime/dist/types-4pg-qp_I.d.ts
586
586
  //#region src/llm/streamTypes.d.ts
587
587
  /** 流式 LLM 事件(OpenAI SSE / Vercel fullStream 统一映射) */
588
588
  type LlmStreamEvent = {
@@ -682,11 +682,26 @@ interface ArtifactStore {
682
682
  }
683
683
  //#endregion
684
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
+ }
685
697
  type InteractionRequest = {
698
+ origin?: InteractionOrigin;
699
+ } & ({
686
700
  type: 'ask';
687
701
  id: string;
688
702
  message: string;
689
703
  schema?: JsonSchema;
704
+ suggestion?: InteractionSuggestion;
690
705
  } | {
691
706
  type: 'confirm';
692
707
  id: string;
@@ -705,6 +720,22 @@ type InteractionRequest = {
705
720
  label: string;
706
721
  value: unknown;
707
722
  }>;
723
+ suggestion?: InteractionSuggestion;
724
+ } | {
725
+ /**
726
+ * 打开本地文件选择(FR-11.1)。与 `confirm` 分开:浏览器要求
727
+ * `input[type=file].click()` 处于用户手势的调用栈内,渲染层必须能识别
728
+ * 出“这个确认按钮点下去要同步打开选择器”,光看文案分辨不出。
729
+ * @experimental
730
+ */
731
+ type: 'file-pick';
732
+ id: string;
733
+ message: string;
734
+ /** 传给 `input.accept` 的 MIME / 扩展名列表 */
735
+ accept?: readonly string[];
736
+ multiple?: boolean;
737
+ /** 该文件要填的表单字段名 */
738
+ field?: string;
708
739
  } | {
709
740
  /**
710
741
  * 能力强制授权(require-approval):与脚本自发 confirm 区分,UI 渲染为授权样式
@@ -715,12 +746,22 @@ type InteractionRequest = {
715
746
  capability: 'readReference' | 'writeArtifact' | 'confirm';
716
747
  message: string;
717
748
  details?: unknown;
718
- };
749
+ });
719
750
  interface InteractionResponse {
720
751
  id: string;
721
752
  value?: unknown;
722
753
  cancelled?: boolean;
723
754
  }
755
+ /**
756
+ * 依据用户画像给出的建议值(FR-19.4)。**不会预填进控件**:
757
+ * 渲染器只能展示它并提供「采纳」入口,用户确认后才算填写。
758
+ * @experimental
759
+ */
760
+ interface InteractionSuggestion {
761
+ value: unknown;
762
+ /** 建议依据,展示给用户判断是否采纳 */
763
+ reason?: string;
764
+ }
724
765
  /** 图表规格($chart 约定的校验后形态;渲染单一来源在 ui/chart/miniChart) */
725
766
  interface ChartSpec {
726
767
  kind: 'bar' | 'line' | 'pie';
@@ -859,7 +900,7 @@ interface UiBridge {
859
900
  interface FormField {
860
901
  name: string;
861
902
  label: string;
862
- type: 'text' | 'number' | 'boolean' | 'select' | 'textarea';
903
+ type: 'text' | 'number' | 'boolean' | 'select' | 'textarea' | 'file';
863
904
  required?: boolean;
864
905
  description?: string;
865
906
  defaultValue?: unknown;
@@ -867,6 +908,15 @@ interface FormField {
867
908
  label: string;
868
909
  value: unknown;
869
910
  }>;
911
+ /**
912
+ * 建议值(FR-19.4)。**刻意不叫 defaultValue**:渲染器会把 defaultValue 直接填进控件,
913
+ * 而建议值来自对用户过往行为的推断,可能过时或不适用,必须由用户看到后主动采纳。
914
+ * @experimental
915
+ */
916
+ suggestion?: {
917
+ value: unknown;
918
+ reason?: string;
919
+ };
870
920
  }
871
921
  interface InteractionPolicy {
872
922
  /** 缺必填参数策略:默认 'user'(表单问用户),'llm' 回喂自愈 */
@@ -892,4 +942,4 @@ interface MemoryStore {
892
942
  transaction?<T>(scope: string, fn: (inner: MemoryStore) => Promise<T>): Promise<T>;
893
943
  }
894
944
  //#endregion
895
- export { SkillDocument as $, DEFAULT_ARCHIVE_LIMITS as A, jsonRenderer as At, RemoteUrlPolicy as B, resolveArchiveLimits as Bt, UiSpecPatch as C, buildManifest as Ct, ArchiveLimits as D, escapeXml as Dt, UiSurfaceActionResponse as E, computeDigest as Et, JsonSchema as F, parseSkillPackManifest as Ft, SKILL_NAME_PATTERN as G, validateSkills as Gt, SKILLS_LOCKFILE as H, signSkill as Ht, MANIFEST_EXCLUDED_FILES as I, readResponseWithLimit as It, SignatureAuditSink as J, xmlRenderer as Jt, SKILL_PACK_FILE as K, verifyManifest as Kt, MemoryFS as L, readSkillSignature as Lt, FileStat as M, messageOf as Mt, FileSystemProvider as N, normalizePath as Nt, CatalogRenderer as O, exportSkills as Ot, FsTrustedKeyStore as P, parseSkillMarkdown as Pt, SkillDiscovery as Q, Page as R, renderAvailableSkillsXml as Rt, UiSpecEvent as S, buildCatalog as St, UiSurfaceActionRequest as T, checkSkillRules as Tt, SKILL_MANIFEST_FILE as U, signaturePayloadBytes as Ut, SIGNATURE_SCHEMA_VERSION as V, resolveInsideRoot as Vt, SKILL_NAME_MAX_LENGTH as W, unzipWithLimits as Wt, SkillCatalog as X, SignatureVerdict as Y, SkillCatalogEntry as Z, RenderBlock as _, WebSkillError as _t, InteractionPolicy as a, SkillMetadata as at, UiSpecActionCapability as b, assertSafePathSegment as bt, LlmClient as c, SkillSignature as ct, LlmMessage as d, TrustedKey as dt, SkillInstallSource as et, LlmResponse as f, TrustedKeyStore as ft, MemoryStore as g, VerifyResult as gt, LlmToolSpec as h, ValidationReport as ht, FormField as i, SkillManifest as it, DiscoveryResult as j, keyIdOf as jt, CryptoKeyLike as k, isValidSkillName as kt, LlmCompleteInput as l, SkillSource as lt, LlmToolCall as m, UnsignedPolicy as mt, ArtifactStore as n, SkillLocation as nt, InteractionRequest as o, SkillPackManifest as ot, LlmStreamEvent as p, UiSpecNode as pt, SKILL_SIGNATURE_FILE as q, verifySkillSignature as qt, ChartSpec as r, SkillManagerPort as rt, InteractionResponse as s, SkillReader as st, Artifact as t, SkillIssue as tt, LlmContentPart as u, SkillsLockfile as ut, RenderResultRequest as v, WebSkillErrorCode as vt, UiSpecSnapshot as w, checkDependencyCycles as wt, UiSpecDrafts as x, atomicWriteText as xt, UiBridge as y, assertRemoteUrlAllowed as yt, PageQuery as z, renderCatalogJson as zt };
945
+ 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 };
@@ -1,5 +1,5 @@
1
- import { E as UiSurfaceActionResponse, S as UiSpecEvent, T as UiSurfaceActionRequest, b as UiSpecActionCapability, o as InteractionRequest, pt as UiSpecNode, s as InteractionResponse, v as RenderResultRequest, w as UiSpecSnapshot, x as UiSpecDrafts, y as UiBridge } from "./types-7Wcg--Vh-1YlQ4jF9.js";
2
- import { y as InteractionSpecLabels } from "./index-CHXxDccV.js";
1
+ import { C as UiSpecEvent, D as UiSurfaceActionResponse, E as UiSurfaceActionRequest, S as UiSpecDrafts, T as UiSpecSnapshot, b as UiBridge, c as InteractionResponse, mt as UiSpecNode, s as InteractionRequest, x as UiSpecActionCapability, y as RenderResultRequest } from "./types-4pg-qp_I-Gq63X8Oa.js";
2
+ import { b as InteractionSpecLabels } from "./index-BMocOEi0.js";
3
3
  import { z } from "zod";
4
4
  import { ComponentType, ReactNode } from "react";
5
5
  import "react/jsx-runtime";
@@ -256,8 +256,24 @@ declare class UiSurfaceStore {
256
256
  }
257
257
  //#endregion
258
258
  //#region src/bridgeState.d.ts
259
+ /**
260
+ * 一次被丢弃的 surface action(FR-11.7)。
261
+ *
262
+ * 丢弃本身是对的(重放/串扰防护),但静默丢弃会让「点了没反应」变成无从排查的现象。
263
+ * @experimental
264
+ */
265
+ interface DroppedSurfaceActionWarning {
266
+ /** duplicate:nonce 已被消费;no-pending:当前没有等待中的动作;mismatch:与待决动作不是同一个 */
267
+ reason: 'duplicate' | 'no-pending' | 'mismatch';
268
+ nonce: string;
269
+ message: string;
270
+ /** 丢弃发生时的待决状态,用于定位串扰 */
271
+ pending: UiSurfaceActionRequest | null;
272
+ }
259
273
  interface ReactBridgeStateOptions {
260
274
  onSurfaceDraftChange?(runId: string, surfaceId: string, value: Record<string, unknown>): Promise<void> | void;
275
+ /** 覆盖默认的 console.warn 上报(测试与宿主遥测用)。@experimental */
276
+ onDroppedSurfaceAction?(warning: DroppedSurfaceActionWarning): void;
261
277
  }
262
278
  /**
263
279
  * React 桥接状态:UiBridge 实现 + useSyncExternalStore 兼容订阅。
@@ -287,7 +303,10 @@ declare class ReactBridgeState implements UiBridge {
287
303
  renderResult(input: RenderResultRequest): Promise<void>;
288
304
  renderSurface(event: UiSpecEvent): Promise<void>;
289
305
  requestSurfaceAction(input: UiSurfaceActionRequest): Promise<UiSurfaceActionResponse>;
290
- /** Resolves exactly one pending action capability; stale or duplicate nonces are ignored. */
306
+ /**
307
+ * Resolves exactly one pending action capability; stale or duplicate nonces are ignored.
308
+ * Every ignored response is reported through `onDroppedSurfaceAction` (FR-11.7).
309
+ */
291
310
  resolveSurfaceAction(response: UiSurfaceActionResponse): boolean;
292
311
  cancelSurfaceAction(nonce: string): void;
293
312
  onTextDelta(runId: string, delta: string): Promise<void>;
@@ -317,6 +336,8 @@ interface CustomSurfaceActionEvent {
317
336
  actionId: string;
318
337
  intent: UiSpecActionCapability['intent'];
319
338
  nonce?: string;
339
+ /** 提交动作所属的表单容器;一张 surface 只有一个表单时省略 */
340
+ scopeId?: string;
320
341
  value?: Record<string, unknown>;
321
342
  }
322
343
  interface RegisteredSurfaceProps<Props> {
@@ -482,10 +503,10 @@ type CatalogNodeProps = {
482
503
  children?: ReactNode;
483
504
  };
484
505
  /**
485
- * catalog 16 个组件的展示实现:json-render 与 OpenUI 两档共用同一份,
506
+ * catalog 展示类组件的实现:json-render 与 OpenUI 两档共用同一份,
486
507
  * 避免"一个 catalog、多套 registry"退化成多套各自演进的视觉。
487
508
  * 交互(表单值收集 / action 回传)由各档的宿主组件负责。
488
509
  */
489
510
  declare const catalogComponentImpls: Record<string, (input: CatalogNodeProps) => ReactNode>;
490
511
  //#endregion
491
- export { type CatalogNodeProps, type CustomSurfaceActionEvent, InteractionForm, type JsonRenderActionDispatch, JsonRenderSpecSurface, type JsonRenderSpecSurfaceProps, NATIVE_SPEC_COMPONENTS, NativeSpecSurface, type NativeSpecSurfaceProps, OpenUiSpecSurface, type OpenUiSpecSurfaceProps, ReactBridgeState, type RegisteredSurfaceProps, ResultBlocks, SpecInteractionChannel, type SpecInteractionSession, StreamingText, type SurfaceRegistration, SurfaceRegistry, type UiSurfaceActionEvent, UiSurfaceList, type UiSurfaceListProps, UiSurfaceSnapshotList, type UiSurfaceSnapshotListProps, UiSurfaceStore, catalogComponentImpls, createJsonRenderRegistry, probeJsonRenderAvailability };
512
+ export { type CatalogNodeProps, type CustomSurfaceActionEvent, type DroppedSurfaceActionWarning, InteractionForm, type JsonRenderActionDispatch, JsonRenderSpecSurface, type JsonRenderSpecSurfaceProps, NATIVE_SPEC_COMPONENTS, NativeSpecSurface, type NativeSpecSurfaceProps, OpenUiSpecSurface, type OpenUiSpecSurfaceProps, ReactBridgeState, type ReactBridgeStateOptions, type RegisteredSurfaceProps, ResultBlocks, SpecInteractionChannel, type SpecInteractionSession, StreamingText, type SurfaceRegistration, SurfaceRegistry, type UiSurfaceActionEvent, UiSurfaceList, type UiSurfaceListProps, UiSurfaceSnapshotList, type UiSurfaceSnapshotListProps, UiSurfaceStore, catalogComponentImpls, createJsonRenderRegistry, probeJsonRenderAvailability };