@webskill/sdk 0.22.0 → 0.23.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/index.js CHANGED
@@ -1,16 +1,16 @@
1
1
  import { n as messageOf, t as WebSkillError } from "./errors-BDZNpC13.js";
2
- import { A as SKILL_MANIFEST_FILE, C as keyIdOf, D as verifySkillSignature, E as signaturePayloadBytes, M as buildManifest, N as computeDigest, O as MANIFEST_EXCLUDED_FILES, P as verifyManifest, S as SIGNATURE_SCHEMA_VERSION, T as signSkill, _ as SKILL_NAME_MAX_LENGTH, a as DEFAULT_ARCHIVE_LIMITS, b as parseSkillMarkdown, c as unzipWithLimits, d as stripArchiveRoot, f as SKILL_PACK_FILE, g as checkSkillRules, h as checkDependencyCycles, i as buildCatalog, j as SKILL_SIGNATURE_FILE, k as SKILLS_LOCKFILE, l as detectSkillArchiveShape, m as parseSkillPackManifest, n as SkillDiscovery, o as readResponseWithLimit, p as exportSkills, r as SkillReader, s as resolveArchiveLimits, t as validateSkills, u as detectSkillArchiveShapeFromFs, v as SKILL_NAME_PATTERN, w as readSkillSignature, x as FsTrustedKeyStore, y as isValidSkillName } from "./skill-CAJMsLod.js";
3
- import { a as atomicWriteText, i as ATOMIC_TMP_SUFFIX_PATTERN, n as normalizePath, o as isAtomicTempPath, r as resolveInsideRoot, t as assertSafePathSegment } from "./pathSecurity-B1owvJAF.js";
2
+ import { A as SKILL_MANIFEST_FILE, C as keyIdOf, D as verifySkillSignature, E as signaturePayloadBytes, M as buildManifest, N as computeDigest, O as MANIFEST_EXCLUDED_FILES, P as verifyManifest, S as SIGNATURE_SCHEMA_VERSION, T as signSkill, _ as SKILL_NAME_MAX_LENGTH, a as DEFAULT_ARCHIVE_LIMITS, b as parseSkillMarkdown, c as unzipWithLimits, d as stripArchiveRoot, f as SKILL_PACK_FILE, g as checkSkillRules, h as checkDependencyCycles, i as buildCatalog, j as SKILL_SIGNATURE_FILE, k as SKILLS_LOCKFILE, l as detectSkillArchiveShape, m as parseSkillPackManifest, n as SkillDiscovery, o as readResponseWithLimit, p as exportSkills, r as SkillReader, s as resolveArchiveLimits, t as validateSkills, u as detectSkillArchiveShapeFromFs, v as SKILL_NAME_PATTERN, w as readSkillSignature, x as FsTrustedKeyStore, y as isValidSkillName } from "./skill-WSUDp6A1.js";
3
+ import { a as atomicWriteBinary, i as ATOMIC_TMP_SUFFIX_PATTERN, n as normalizePath, o as atomicWriteText, r as resolveInsideRoot, s as isAtomicTempPath, t as assertSafePathSegment } from "./pathSecurity-CirkQwWP.js";
4
4
  import { t as assertRemoteUrlAllowed } from "./urlSafety-CiSuCJvX.js";
5
5
  import { n as sanitizeUntrustedLine, t as UNTRUSTED_LINE_LIMIT } from "./untrustedText-BIaRvPZK.js";
6
6
  import { a as FILE_MIME_TYPES, c as TEXT_EXTENSIONS, d as extractedDocumentFormat, f as formatAttachmentText, i as DWG_MIME_TYPES, l as XLSX_MIME, n as BINARY_EXTENSIONS, o as IMAGE_MIME_TYPES, r as DOCX_MIME, s as PPTX_MIME, t as ATTACHMENT_TEXT_LIMIT, u as classifyAttachment } from "./kind-Dc8x0HWz.js";
7
- import { $ as READ_SKILL_FILE_TOOL, A as BEHAVIOR_RECORDS_KEY, B as renderUserProfileContext, C as extractTodoTraceEvents, D as VISION_SLOW_THRESHOLD_MS, E as VISION_MAX_CONCURRENCY, F as readProfileEntries, G as schemaToForm, H as EMPTY_USER_PROFILE, I as readUserProfile, J as ASK_USER_INPUT_SCHEMA, K as createScriptContext, L as sampleBehaviorRecords, M as appendBehaviorRecords, N as mergeProfileEntries, O as clampVisionConcurrency, P as readBehaviorRecords, Q as READ_SKILL_FILE_INPUT_SCHEMA, R as USER_PROFILE_NO_INVENTION_RULE, S as extractSkillCandidate, T as VISION_DEFAULT_CONCURRENCY, U as SerializingMemoryStore, V as DEFAULT_USER_PROFILE_LIMITS, W as EventBus, X as ASK_USER_TOOL, Y as ASK_USER_MAX_FIELDS, Z as ASK_USER_TOOL_NAME, _ as FsRunSnapshotStore, a as networkPolicyLibSource, at as scriptToolName, b as DEFAULT_LOOP_LIMITS, c as bridgeError, ct as ProgressiveRouter, d as FsMemoryStore, dt as xmlRenderer, et as READ_SKILL_FILE_TOOL_NAME, f as WebSkillRuntime, g as redactToolStepArgs, h as SENSITIVE_ANNOTATION, i as isNetworkAllowed, it as schemaSourceLabel, j as USER_PROFILE_KEY, k as runVisionBatch, l as parseBridgeRequest, lt as escapeXml, m as AgentLoop, n as normalizeErrorCode, nt as formatSkillScriptManifest, o as networkUrlHost, ot as resolveToolName, p as summarizeRunUsage, q as ASK_USER_FIELD_TYPES, r as normalizeToolError, rt as listSkillScripts, s as UPLOAD_FILES_UNAVAILABLE, st as toLlmToolSpec, t as CapabilityApproval, tt as ALLOWED_TOOLS_EXCLUSION_REASON, u as FsArtifactStore, ut as renderAvailableSkillsXml, v as RUN_SNAPSHOT_SCHEMA_VERSION, w as TraceRecorder, x as MAX_TOOL_STEP_ARG_BYTES, y as isUnsupportedRunSnapshot, z as USER_PROFILE_PROMPT_HEADER } from "./approval-DWQlDPbY.js";
7
+ import { $ as READ_SKILL_FILE_TOOL, A as BEHAVIOR_RECORDS_KEY, B as renderUserProfileContext, C as extractTodoTraceEvents, D as VISION_SLOW_THRESHOLD_MS, E as VISION_MAX_CONCURRENCY, F as readProfileEntries, G as schemaToForm, H as EMPTY_USER_PROFILE, I as readUserProfile, J as ASK_USER_INPUT_SCHEMA, K as createScriptContext, L as sampleBehaviorRecords, M as appendBehaviorRecords, N as mergeProfileEntries, O as clampVisionConcurrency, P as readBehaviorRecords, Q as READ_SKILL_FILE_INPUT_SCHEMA, R as USER_PROFILE_NO_INVENTION_RULE, S as extractSkillCandidate, T as VISION_DEFAULT_CONCURRENCY, U as SerializingMemoryStore, V as DEFAULT_USER_PROFILE_LIMITS, W as EventBus, X as ASK_USER_TOOL, Y as ASK_USER_MAX_FIELDS, Z as ASK_USER_TOOL_NAME, _ as FsRunSnapshotStore, a as networkPolicyLibSource, at as scriptToolName, b as DEFAULT_LOOP_LIMITS, c as bridgeError, ct as ProgressiveRouter, d as FsMemoryStore, dt as xmlRenderer, et as READ_SKILL_FILE_TOOL_NAME, f as WebSkillRuntime, g as redactToolStepArgs, h as SENSITIVE_ANNOTATION, i as isNetworkAllowed, it as schemaSourceLabel, j as USER_PROFILE_KEY, k as runVisionBatch, l as parseBridgeRequest, lt as escapeXml, m as AgentLoop, n as normalizeErrorCode, nt as formatSkillScriptManifest, o as networkUrlHost, ot as resolveToolName, p as summarizeRunUsage, q as ASK_USER_FIELD_TYPES, r as normalizeToolError, rt as listSkillScripts, s as UPLOAD_FILES_UNAVAILABLE, st as toLlmToolSpec, t as CapabilityApproval, tt as ALLOWED_TOOLS_EXCLUSION_REASON, u as FsArtifactStore, ut as renderAvailableSkillsXml, v as RUN_SNAPSHOT_SCHEMA_VERSION, w as TraceRecorder, x as MAX_TOOL_STEP_ARG_BYTES, y as isUnsupportedRunSnapshot, z as USER_PROFILE_PROMPT_HEADER } from "./approval-7CuZS3Z4.js";
8
8
  import { a as GoogleGenAiClient, c as findUnpairedToolCalls, d as partsToText, f as promptText, i as toVercelToolSpecs, l as interruptedToolResult, n as fromVercelResult, o as AnthropicClient, p as textParts, r as fromVercelStreamPart, s as OpenAiCompatibleClient, u as sealToolCallPairs } from "./llm-eIQNO9tr.js";
9
- import { _ as DEFAULT_MAX_UPLOAD_FILE_BYTES, a as UNSUPPORTED_DOCUMENT_MESSAGE, c as toBase64, d as SPREADSHEET_LIMITS, f as SPREADSHEET_MIME_TYPE, g as DEFAULT_MAX_DOCUMENT_TEXT_BYTES, h as DEFAULT_MAX_DOCUMENT_BYTES, i as SUPPORTED_DOCUMENT_MIME, l as encodeSpreadsheet, m as DEFAULT_MAX_DATA_SOURCE_BYTES, n as READ_LINKED_DOCUMENT_TOOL, p as XLSX_UNSUPPORTED, r as READ_LINKED_DOCUMENT_TOOL_NAME, s as isBytesOnlyDocument, t as BYTES_ONLY_DOCUMENT_MIME, u as SPREADSHEET_EXTENSION, v as TEXT_BUDGETED_CONTENT_TYPES } from "./linkedDocument-CIuh_Yp0.js";
9
+ import { _ as DEFAULT_MAX_UPLOAD_FILE_BYTES, a as UNSUPPORTED_DOCUMENT_MESSAGE, c as toBase64, d as SPREADSHEET_LIMITS, f as SPREADSHEET_MIME_TYPE, g as DEFAULT_MAX_DOCUMENT_TEXT_BYTES, h as DEFAULT_MAX_DOCUMENT_BYTES, i as SUPPORTED_DOCUMENT_MIME, l as encodeSpreadsheet, m as DEFAULT_MAX_DATA_SOURCE_BYTES, n as READ_LINKED_DOCUMENT_TOOL, p as XLSX_UNSUPPORTED, r as READ_LINKED_DOCUMENT_TOOL_NAME, s as isBytesOnlyDocument, t as BYTES_ONLY_DOCUMENT_MIME, u as SPREADSHEET_EXTENSION, v as TEXT_BUDGETED_CONTENT_TYPES } from "./linkedDocument-CZZOl9cO.js";
10
10
  import { n as normalizeToolContent, t as mergeCatalogEntries } from "./external-_ZRQe-V9.js";
11
11
  import { n as extractChartSpec, t as buildRenderResult } from "./renderResult-D9Q-Vu2x.js";
12
12
  import { n as validateUiSpecEvent, r as validateUiSpecNode, t as extractUiSpecEvents } from "./surface-DVGiCmwq.js";
13
- import { t as createWebSkillApi } from "./webSkillApi-Dy-Zjv0y.js";
13
+ import { t as createWebSkillApi } from "./webSkillApi-D5VMUnrv.js";
14
14
 
15
15
  //#region ../core/src/fs/memoryFs.ts
16
16
  const ROOT = "/";
@@ -873,8 +873,10 @@ var FsSessionStore = class {
873
873
  console.warn(`[webskill] ${skipped.length} session file(s) under ${this.#root} are unreadable (possible data loss from an interrupted write): ${skipped.join(", ")}`);
874
874
  }
875
875
  metas.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
876
+ const page = takeTailPage(metas, options, "session");
876
877
  return {
877
- ...takeTailPage(metas, options, "session"),
878
+ ...page,
879
+ items: [...page.items].reverse(),
878
880
  source: "ok",
879
881
  skipped
880
882
  };
@@ -1010,7 +1012,7 @@ var FsToolStepStore = class {
1010
1012
  * Version of the published `@webskill/sdk` package, injected at build time.
1011
1013
  * @stable
1012
1014
  */
1013
- const SDK_VERSION = "0.22.0";
1015
+ const SDK_VERSION = "0.23.0";
1014
1016
 
1015
1017
  //#endregion
1016
- export { ALLOWED_TOOLS_EXCLUSION_REASON, ASK_USER_FIELD_TYPES, ASK_USER_INPUT_SCHEMA, ASK_USER_MAX_FIELDS, ASK_USER_TOOL, ASK_USER_TOOL_NAME, ATOMIC_TMP_SUFFIX_PATTERN, ATTACHMENT_TEXT_LIMIT, AgentLoop, AnthropicClient, BEHAVIOR_RECORDS_KEY, BINARY_EXTENSIONS, BYTES_ONLY_DOCUMENT_MIME, CapabilityApproval, DEFAULT_ARCHIVE_LIMITS, DEFAULT_LOOP_LIMITS, DEFAULT_MAX_DATA_SOURCE_BYTES, DEFAULT_MAX_DOCUMENT_BYTES, DEFAULT_MAX_DOCUMENT_TEXT_BYTES, DEFAULT_MAX_UPLOAD_FILE_BYTES, DEFAULT_USER_PROFILE_LIMITS, DOCX_MIME, DWG_MIME_TYPES, EMPTY_USER_PROFILE, EventBus, FILE_MIME_TYPES, FS_SESSION_PAGE_SIZE, FsArtifactStore, FsMemoryStore, FsRunSnapshotStore, FsRunTraceStore, FsSessionStore, FsToolStepStore, FsTrustedKeyStore, FullDisclosureRouter, GoogleGenAiClient, HookRunner, IMAGE_MIME_TYPES, MANIFEST_EXCLUDED_FILES, MAX_TOOL_STEP_ARG_BYTES, MemoryFS, OpenAiCompatibleClient, PPTX_MIME, ProgressiveRouter, READ_LINKED_DOCUMENT_TOOL, READ_LINKED_DOCUMENT_TOOL_NAME, READ_SKILL_FILE_INPUT_SCHEMA, READ_SKILL_FILE_TOOL, READ_SKILL_FILE_TOOL_NAME, RUN_SNAPSHOT_SCHEMA_VERSION, RUN_TRACE_SCHEMA_VERSION, SDK_VERSION, SENSITIVE_ANNOTATION, SESSION_SCHEMA_VERSION, SIGNATURE_SCHEMA_VERSION, SKILLS_LOCKFILE, SKILL_MANIFEST_FILE, SKILL_NAME_MAX_LENGTH, SKILL_NAME_PATTERN, SKILL_PACK_FILE, SKILL_SIGNATURE_FILE, SPREADSHEET_EXTENSION, SPREADSHEET_LIMITS, SPREADSHEET_MIME_TYPE, SUPPORTED_DOCUMENT_MIME, SerializingMemoryStore, SkillDiscovery, SkillReader, TEXT_BUDGETED_CONTENT_TYPES, TEXT_EXTENSIONS, TraceRecorder, UNSUPPORTED_DOCUMENT_MESSAGE, UNTRUSTED_LINE_LIMIT, UPLOAD_FILES_UNAVAILABLE, USER_PROFILE_EXPORT_VERSION, USER_PROFILE_KEY, USER_PROFILE_NO_INVENTION_RULE, USER_PROFILE_PROMPT_HEADER, USER_PROFILE_REFINE_PROMPT, VISION_DEFAULT_CONCURRENCY, VISION_MAX_CONCURRENCY, VISION_SLOW_THRESHOLD_MS, WebSkillError, WebSkillRuntime, XLSX_MIME, XLSX_UNSUPPORTED, appendBehaviorRecords, applyUserProfileImport, assertRemoteUrlAllowed, assertSafePathSegment, atomicWriteText, bridgeError, buildCatalog, buildManifest, buildRenderResult, checkDependencyCycles, checkSkillRules, clampVisionConcurrency, classifyAttachment, computeDigest, createScriptContext, createWebSkillApi, detectSkillArchiveShape, detectSkillArchiveShapeFromFs, diffUserProfile, encodeSpreadsheet, escapeXml, exportSkills, exportUserProfile, extractChartSpec, extractSkillCandidate, extractTodoTraceEvents, extractUiSpecEvents, extractedDocumentFormat, findUnpairedToolCalls, formatAttachmentText, formatSkillScriptManifest, fromVercelResult, fromVercelStreamPart, interruptedToolResult, isAtomicTempPath, isBytesOnlyDocument, isNetworkAllowed, isUnsupportedRunSnapshot, isValidSkillName, jsonRenderer, keyIdOf, listSkillScripts, mergeCatalogEntries, mergeProfileEntries, messageOf, networkPolicyLibSource, networkUrlHost, normalizeErrorCode, normalizePath, normalizeToolContent, normalizeToolError, parseBridgeRequest, parseSkillMarkdown, parseSkillPackManifest, parseUserProfileExport, partsToText, readBehaviorRecords, readProfileEntries, readResponseWithLimit, readSkillSignature, readUserProfile, redactToolStepArgs, refineUserProfile, renderAvailableSkillsXml, renderCatalogJson, renderUserProfileContext, resolveArchiveLimits, resolveInsideRoot, resolveToolName, runVisionBatch, sampleBehaviorRecords, sanitizeUntrustedLine, schemaSourceLabel, schemaToForm, scriptToolName, sealToolCallPairs, signSkill, signaturePayloadBytes, stripArchiveRoot, summarizeRunUsage, summarizeToolCalls, textParts, toBase64, toLlmToolSpec, toRecordDigests, toVercelToolSpecs, unzipWithLimits, validateSkills, validateUiSpecEvent, validateUiSpecNode, verifyManifest, verifySkillSignature, xmlRenderer };
1018
+ export { ALLOWED_TOOLS_EXCLUSION_REASON, ASK_USER_FIELD_TYPES, ASK_USER_INPUT_SCHEMA, ASK_USER_MAX_FIELDS, ASK_USER_TOOL, ASK_USER_TOOL_NAME, ATOMIC_TMP_SUFFIX_PATTERN, ATTACHMENT_TEXT_LIMIT, AgentLoop, AnthropicClient, BEHAVIOR_RECORDS_KEY, BINARY_EXTENSIONS, BYTES_ONLY_DOCUMENT_MIME, CapabilityApproval, DEFAULT_ARCHIVE_LIMITS, DEFAULT_LOOP_LIMITS, DEFAULT_MAX_DATA_SOURCE_BYTES, DEFAULT_MAX_DOCUMENT_BYTES, DEFAULT_MAX_DOCUMENT_TEXT_BYTES, DEFAULT_MAX_UPLOAD_FILE_BYTES, DEFAULT_USER_PROFILE_LIMITS, DOCX_MIME, DWG_MIME_TYPES, EMPTY_USER_PROFILE, EventBus, FILE_MIME_TYPES, FS_SESSION_PAGE_SIZE, FsArtifactStore, FsMemoryStore, FsRunSnapshotStore, FsRunTraceStore, FsSessionStore, FsToolStepStore, FsTrustedKeyStore, FullDisclosureRouter, GoogleGenAiClient, HookRunner, IMAGE_MIME_TYPES, MANIFEST_EXCLUDED_FILES, MAX_TOOL_STEP_ARG_BYTES, MemoryFS, OpenAiCompatibleClient, PPTX_MIME, ProgressiveRouter, READ_LINKED_DOCUMENT_TOOL, READ_LINKED_DOCUMENT_TOOL_NAME, READ_SKILL_FILE_INPUT_SCHEMA, READ_SKILL_FILE_TOOL, READ_SKILL_FILE_TOOL_NAME, RUN_SNAPSHOT_SCHEMA_VERSION, RUN_TRACE_SCHEMA_VERSION, SDK_VERSION, SENSITIVE_ANNOTATION, SESSION_SCHEMA_VERSION, SIGNATURE_SCHEMA_VERSION, SKILLS_LOCKFILE, SKILL_MANIFEST_FILE, SKILL_NAME_MAX_LENGTH, SKILL_NAME_PATTERN, SKILL_PACK_FILE, SKILL_SIGNATURE_FILE, SPREADSHEET_EXTENSION, SPREADSHEET_LIMITS, SPREADSHEET_MIME_TYPE, SUPPORTED_DOCUMENT_MIME, SerializingMemoryStore, SkillDiscovery, SkillReader, TEXT_BUDGETED_CONTENT_TYPES, TEXT_EXTENSIONS, TraceRecorder, UNSUPPORTED_DOCUMENT_MESSAGE, UNTRUSTED_LINE_LIMIT, UPLOAD_FILES_UNAVAILABLE, USER_PROFILE_EXPORT_VERSION, USER_PROFILE_KEY, USER_PROFILE_NO_INVENTION_RULE, USER_PROFILE_PROMPT_HEADER, USER_PROFILE_REFINE_PROMPT, VISION_DEFAULT_CONCURRENCY, VISION_MAX_CONCURRENCY, VISION_SLOW_THRESHOLD_MS, WebSkillError, WebSkillRuntime, XLSX_MIME, XLSX_UNSUPPORTED, appendBehaviorRecords, applyUserProfileImport, assertRemoteUrlAllowed, assertSafePathSegment, atomicWriteBinary, atomicWriteText, bridgeError, buildCatalog, buildManifest, buildRenderResult, checkDependencyCycles, checkSkillRules, clampVisionConcurrency, classifyAttachment, computeDigest, createScriptContext, createWebSkillApi, detectSkillArchiveShape, detectSkillArchiveShapeFromFs, diffUserProfile, encodeSpreadsheet, escapeXml, exportSkills, exportUserProfile, extractChartSpec, extractSkillCandidate, extractTodoTraceEvents, extractUiSpecEvents, extractedDocumentFormat, findUnpairedToolCalls, formatAttachmentText, formatSkillScriptManifest, fromVercelResult, fromVercelStreamPart, interruptedToolResult, isAtomicTempPath, isBytesOnlyDocument, isNetworkAllowed, isUnsupportedRunSnapshot, isValidSkillName, jsonRenderer, keyIdOf, listSkillScripts, mergeCatalogEntries, mergeProfileEntries, messageOf, networkPolicyLibSource, networkUrlHost, normalizeErrorCode, normalizePath, normalizeToolContent, normalizeToolError, parseBridgeRequest, parseSkillMarkdown, parseSkillPackManifest, parseUserProfileExport, partsToText, readBehaviorRecords, readProfileEntries, readResponseWithLimit, readSkillSignature, readUserProfile, redactToolStepArgs, refineUserProfile, renderAvailableSkillsXml, renderCatalogJson, renderUserProfileContext, resolveArchiveLimits, resolveInsideRoot, resolveToolName, runVisionBatch, sampleBehaviorRecords, sanitizeUntrustedLine, schemaSourceLabel, schemaToForm, scriptToolName, sealToolCallPairs, signSkill, signaturePayloadBytes, stripArchiveRoot, summarizeRunUsage, summarizeToolCalls, textParts, toBase64, toLlmToolSpec, toRecordDigests, toVercelToolSpecs, unzipWithLimits, validateSkills, validateUiSpecEvent, validateUiSpecNode, verifyManifest, verifySkillSignature, xmlRenderer };
@@ -1,4 +1,5 @@
1
1
  import { t as WebSkillError } from "./errors-BDZNpC13.js";
2
+ import { unzipSync, zipSync } from "fflate";
2
3
  import writeXlsxFile from "write-excel-file/universal";
3
4
 
4
5
  //#region ../runtime/src/tools/types.ts
@@ -120,6 +121,40 @@ const ROW_PADDING_PT = 4;
120
121
  */
121
122
  const COLUMN_CHAR_PX = 7;
122
123
  const COLUMN_PADDING_PX = 5;
124
+ /**
125
+ * 归档里写死的时间戳(0.23.0 分册 24 FR-24.2)。
126
+ *
127
+ * `write-excel-file` 调 fflate 的 `zip(files, callback)` 时不传 options,
128
+ * mtime 于是缺省成 `new Date()`——同一份规格在不同时刻编出的字节因此不同。
129
+ * ZIP 的时间戳只有 2 秒精度,所以这件事表现为「偶发」而不是「必现」。
130
+ *
131
+ * 取值约束:ZIP 的纪元是 1980 而不是 Unix 的 1970,且 fflate 拒绝纪元 0,
132
+ * 因此必须用本地时区构造,不能用 `Date.UTC`。
133
+ * `verify/scripts/documents.mjs` 里有同值的一份(两处不共享实现——那些脚本
134
+ * 一个仓内包都不引;一致性由 `test/spreadsheetMtimeSingleSource.test.ts` 钉住)。
135
+ *
136
+ * 不导出:它是实现细节,导出就进 api-snapshot,而本册的准入标准是零契约变更。
137
+ */
138
+ const XLSX_ZIP_MTIME = new Date(1980, 0, 1, 0, 0, 0);
139
+ /**
140
+ * 解包再用固定 mtime 重打包。
141
+ *
142
+ * 不直接改 ZIP 字节里的时间戳字段:那要手写本地文件头与中央目录的偏移解析,
143
+ * 而时间戳在两处各存一份,漏一处就是坏档,坏档还不一定报错(FR-24.4 明令禁止)。
144
+ * `unzipSync` 保留中央目录的条目顺序,`zipSync` 按对象键顺序写回,
145
+ * 所以 OOXML 要求的 `[Content_Types].xml` 居首不会被打乱。
146
+ */
147
+ function withFixedTimestamps(bytes) {
148
+ return zipSync(unzipSync(bytes), {
149
+ level: 6,
150
+ mtime: XLSX_ZIP_MTIME
151
+ });
152
+ }
153
+ /** 字节数是唯一无法预先算出的上限,只能编码后查 */
154
+ function assertWithinByteLimit(length) {
155
+ if (length <= SPREADSHEET_LIMITS.bytes) return;
156
+ throw invalid(`The encoded spreadsheet is ${length} bytes (max ${SPREADSHEET_LIMITS.bytes}); reduce the number of rows, sheets or images.`);
157
+ }
123
158
  function invalid(message) {
124
159
  return new WebSkillError("VALIDATION_FAILED", message);
125
160
  }
@@ -311,8 +346,11 @@ function applyImageSizing(data, images) {
311
346
  /**
312
347
  * 把表格规格编码为 xlsx 字节。
313
348
  *
314
- * 纯函数——不认识产物、run 与工具,因此工具、脚本能力、测试三个消费面共用同一份
315
- * 实现,AC-10.8「双消费面逐字节相同」是结构性成立的。
349
+ * 纯函数——不认识产物、run 与工具,因此工具、脚本能力、测试三个消费面共用同一份实现。
350
+ *
351
+ * 「纯函数」只保证三个消费面走的是同一条代码路径,**不足以**保证输出逐字节相同:
352
+ * 归档格式本身会把编码时刻写进字节。AC-10.8「双消费面逐字节相同」靠的是
353
+ * `withFixedTimestamps()` 把那个时刻拿掉(0.23.0 分册 24)。
316
354
  *
317
355
  * `resolveImage` 是图片引用的解析出口(0.22.0 分册 20 FR-20.3)。它同样不破坏纯函数性:
318
356
  * 给定相同的规格与相同的解析结果,输出逐字节相同。规格里有图片却没给它,是
@@ -340,8 +378,10 @@ async function encodeSpreadsheet(spec, resolveImage) {
340
378
  });
341
379
  }
342
380
  const blob = await writeXlsxFile(payload).toBlob();
343
- const bytes = new Uint8Array(await blob.arrayBuffer());
344
- if (bytes.length > SPREADSHEET_LIMITS.bytes) throw invalid(`The encoded spreadsheet is ${bytes.length} bytes (max ${SPREADSHEET_LIMITS.bytes}); reduce the number of rows, sheets or images.`);
381
+ const encoded = new Uint8Array(await blob.arrayBuffer());
382
+ assertWithinByteLimit(encoded.length);
383
+ const bytes = withFixedTimestamps(encoded);
384
+ assertWithinByteLimit(bytes.length);
345
385
  return bytes;
346
386
  }
347
387
 
package/dist/mcp.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { X as JsonSchema, _ as LlmToolSpec, _t as SkillDocument, ht as SkillCatalogEntry } from "./types-CpDRZ0rA-BM5FI9oN.js";
2
- import { B as ExternalToolSource, Hr as mergeCatalogEntries, Mn as ToolDisclosure, Pn as ToolResult, z as ExternalSkillProvider } from "./index-YPd8ZSEa.js";
1
+ import { X as JsonSchema, _ as LlmToolSpec, _t as SkillDocument, ht as SkillCatalogEntry } from "./types-CpDRZ0rA-BiZBXGm4.js";
2
+ import { B as ExternalToolSource, Hr as mergeCatalogEntries, Mn as ToolDisclosure, Pn as ToolResult, z as ExternalSkillProvider } from "./index-7No55dRb.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";
package/dist/node.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { G as FileStat, It as VerifyResult, K as FileSystemProvider, N as ArchiveLimits, Ot as SkillsLockfile, Pt as UnsignedPolicy, S as UiBridge, St as SkillManifest, X as JsonSchema, at as SKILL_MANIFEST_FILE, b as RenderResultRequest, c as InteractionResponse, it as SKILLS_LOCKFILE, jt as TrustedKeyStore, q as FileWriteStream, s as InteractionRequest, ut as SignatureAuditSink, vt as SkillInstallSource, xt as SkillManagerPort } from "./types-CpDRZ0rA-BM5FI9oN.js";
2
- import { $t as SchemaInferer, H as FsArtifactStore, Pn as ToolResult, Tr as createScriptContext, U as FsMemoryStore, b as BridgeCapabilities, en as ScriptExecutionContext, gr as WebSkillRuntimeDeps, hr as WebSkillRuntime, jn as ToolDefinition, m as ApprovalScope, tn as ScriptExecutor, ut as NetworkPolicy } from "./index-YPd8ZSEa.js";
3
- import { a as AuditLog, b as SkillVersionStore, d as CandidateSkill, m as CandidateStore, r as ApprovalPolicy } from "./skillVersionStore-B24Jjjry-BY1H7Krp.js";
1
+ import { G as FileStat, It as VerifyResult, K as FileSystemProvider, N as ArchiveLimits, Ot as SkillsLockfile, Pt as UnsignedPolicy, S as UiBridge, St as SkillManifest, X as JsonSchema, at as SKILL_MANIFEST_FILE, b as RenderResultRequest, c as InteractionResponse, it as SKILLS_LOCKFILE, jt as TrustedKeyStore, q as FileWriteStream, s as InteractionRequest, ut as SignatureAuditSink, vt as SkillInstallSource, xt as SkillManagerPort } from "./types-CpDRZ0rA-BiZBXGm4.js";
2
+ import { $t as SchemaInferer, H as FsArtifactStore, Pn as ToolResult, Tr as createScriptContext, U as FsMemoryStore, b as BridgeCapabilities, en as ScriptExecutionContext, gr as WebSkillRuntimeDeps, hr as WebSkillRuntime, jn as ToolDefinition, m as ApprovalScope, tn as ScriptExecutor, ut as NetworkPolicy } from "./index-7No55dRb.js";
3
+ import { a as AuditLog, f as CandidateSkill, h as CandidateStore, r as ApprovalPolicy, x as SkillVersionStore } from "./skillVersionStore-S4_HJ_Fl-Cvy9LqVu.js";
4
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
package/dist/node.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { n as messageOf, t as WebSkillError } from "./errors-BDZNpC13.js";
2
- import { A as SKILL_MANIFEST_FILE, D as verifySkillSignature, M as buildManifest, O as MANIFEST_EXCLUDED_FILES, P as verifyManifest, b as parseSkillMarkdown, c as unzipWithLimits, f as SKILL_PACK_FILE, k as SKILLS_LOCKFILE, m as parseSkillPackManifest, o as readResponseWithLimit, p as exportSkills, s as resolveArchiveLimits, t as validateSkills, w as readSkillSignature, y as isValidSkillName } from "./skill-CAJMsLod.js";
3
- import { a as atomicWriteText, o as isAtomicTempPath, r as resolveInsideRoot, t as assertSafePathSegment } from "./pathSecurity-B1owvJAF.js";
2
+ import { A as SKILL_MANIFEST_FILE, D as verifySkillSignature, M as buildManifest, O as MANIFEST_EXCLUDED_FILES, P as verifyManifest, b as parseSkillMarkdown, c as unzipWithLimits, f as SKILL_PACK_FILE, k as SKILLS_LOCKFILE, m as parseSkillPackManifest, o as readResponseWithLimit, p as exportSkills, s as resolveArchiveLimits, t as validateSkills, w as readSkillSignature, y as isValidSkillName } from "./skill-WSUDp6A1.js";
3
+ import { a as atomicWriteBinary, o as atomicWriteText, r as resolveInsideRoot, s as isAtomicTempPath, t as assertSafePathSegment } from "./pathSecurity-CirkQwWP.js";
4
4
  import { t as assertRemoteUrlAllowed } from "./urlSafety-CiSuCJvX.js";
5
- import { K as createScriptContext, a as networkPolicyLibSource, c as bridgeError, d as FsMemoryStore, f as WebSkillRuntime, l as parseBridgeRequest, r as normalizeToolError, s as UPLOAD_FILES_UNAVAILABLE, t as CapabilityApproval, u as FsArtifactStore } from "./approval-DWQlDPbY.js";
6
- import { f as SPREADSHEET_MIME_TYPE } from "./linkedDocument-CIuh_Yp0.js";
5
+ import { K as createScriptContext, a as networkPolicyLibSource, c as bridgeError, d as FsMemoryStore, f as WebSkillRuntime, l as parseBridgeRequest, r as normalizeToolError, s as UPLOAD_FILES_UNAVAILABLE, t as CapabilityApproval, u as FsArtifactStore } from "./approval-7CuZS3Z4.js";
6
+ import { f as SPREADSHEET_MIME_TYPE } from "./linkedDocument-CZZOl9cO.js";
7
7
  import { n as normalizeToolContent } from "./external-_ZRQe-V9.js";
8
8
  import { i as probeLlmCapabilities } from "./env-Bj1MI2Ww.js";
9
9
  import { t as AUDIT_EVENT_TYPES } from "./eventTypes-DcTQXSV1.js";
@@ -2469,7 +2469,14 @@ var ApprovalWorkflow = class {
2469
2469
  const stagingRoot = (await mkdtemp(path.join(tmpdir(), "webskill-candidate-"))).split(path.sep).join("/");
2470
2470
  try {
2471
2471
  const skillDir = `${stagingRoot}/${candidate.name}`;
2472
- for (const file of candidate.files) await atomicWriteText(this.#fs, resolveInsideRoot(skillDir, file.path), file.content);
2472
+ for (const file of candidate.files) {
2473
+ const target = resolveInsideRoot(skillDir, file.path);
2474
+ if (file.binary === void 0) {
2475
+ await atomicWriteText(this.#fs, target, file.content);
2476
+ continue;
2477
+ }
2478
+ await atomicWriteBinary(this.#fs, target, await this.#store.readCandidateBinary(candidate.id, file.binary.file));
2479
+ }
2473
2480
  const report = await validateSkills(this.#fs, [stagingRoot]);
2474
2481
  if (!report.ok) {
2475
2482
  const errors = report.issues.filter((i) => i.severity === "error");
@@ -20,6 +20,17 @@ async function atomicWriteText(fs, path, content) {
20
20
  await fs.writeText(tmp, content);
21
21
  await fs.rename(tmp, path);
22
22
  }
23
+ /**
24
+ * 原子写二进制:与 `atomicWriteText` 逐字对称,只换写入方法(0.23.0 分册 20)。
25
+ *
26
+ * 临时名必须沿用同一条 `ATOMIC_TMP_SUFFIX_PATTERN` 形状——打包与列举侧靠那条正则
27
+ * 排除中断残留,另起一套命名会让残留的临时文件被打进技能包。
28
+ */
29
+ async function atomicWriteBinary(fs, path, content) {
30
+ const tmp = `${path}.tmp-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
31
+ await fs.writeBinary(tmp, content);
32
+ await fs.rename(tmp, path);
33
+ }
23
34
 
24
35
  //#endregion
25
36
  //#region ../core/src/fs/pathSecurity.ts
@@ -62,4 +73,4 @@ function resolveInsideRoot(root, relativePath) {
62
73
  }
63
74
 
64
75
  //#endregion
65
- export { atomicWriteText as a, ATOMIC_TMP_SUFFIX_PATTERN as i, normalizePath as n, isAtomicTempPath as o, resolveInsideRoot as r, assertSafePathSegment as t };
76
+ export { atomicWriteBinary as a, ATOMIC_TMP_SUFFIX_PATTERN as i, normalizePath as n, atomicWriteText as o, resolveInsideRoot as r, isAtomicTempPath as s, assertSafePathSegment as t };
@@ -1,5 +1,5 @@
1
1
  import { n as messageOf, t as WebSkillError } from "./errors-BDZNpC13.js";
2
- import { a as atomicWriteText, o as isAtomicTempPath, r as resolveInsideRoot } from "./pathSecurity-B1owvJAF.js";
2
+ import { o as atomicWriteText, r as resolveInsideRoot, s as isAtomicTempPath } from "./pathSecurity-CirkQwWP.js";
3
3
  import { parse } from "yaml";
4
4
  import { Unzip, UnzipInflate, zipSync } from "fflate";
5
5
 
@@ -1,5 +1,5 @@
1
- import { K as FileSystemProvider, St as SkillManifest, et as Page, ht as SkillCatalogEntry, tt as PageQuery } from "./types-CpDRZ0rA-BM5FI9oN.js";
2
- //#region ../governance/dist/skillVersionStore-B24Jjjry.d.ts
1
+ import { K as FileSystemProvider, St as SkillManifest, et as Page, ht as SkillCatalogEntry, tt as PageQuery } from "./types-CpDRZ0rA-BiZBXGm4.js";
2
+ //#region ../governance/dist/skillVersionStore-S4_HJ_Fl.d.ts
3
3
  //#region src/types.d.ts
4
4
  type CandidateStatus = 'draft' | 'pending-review' | 'approved' | 'published' | 'rejected';
5
5
  /** `generated` 是 0.5.0 的技能自动生成来源(需求 12 号 AC-9.1) */
@@ -8,7 +8,29 @@ type CandidateRisk = 'low' | 'medium' | 'high';
8
8
  interface CandidateFile {
9
9
  path: string;
10
10
  kind: 'skill-md' | 'script' | 'reference' | 'asset';
11
+ /**
12
+ * 文件正文。二进制条目为空串——字节存在候选自己的旁路里,见 `binary`。
13
+ * 保持必填 `string`:它的消费方遍布审核 UI、发布链路与测试,
14
+ * 改成联合类型会让每一处都要分支,而其中大多数只关心文本。
15
+ */
11
16
  content: string;
17
+ /** 在场即本条目是二进制,正文在旁路文件里(0.23.0 分册 20) */
18
+ binary?: CandidateBinaryRef;
19
+ }
20
+ /**
21
+ * 候选二进制旁路里的一份字节(0.23.0 分册 20)。
22
+ *
23
+ * 字节**不内嵌进候选 JSON**:`CandidateStore.list()` 会把目录里每一个 JSON 全文读出来解析,
24
+ * 内嵌等于审批列表每翻一页都要把所有候选的二进制读进内存再做一次 base64 往返。
25
+ */
26
+ interface CandidateBinaryRef {
27
+ /** 候选二进制目录(`<id>.files/`)下的文件名,不是路径 */
28
+ file: string;
29
+ size: number;
30
+ /** sha-256,十六进制小写;AC-20.1 的「逐字节相同」靠它判 */
31
+ sha256: string;
32
+ /** 来源附件的原始文件名,供审核者辨认(FR-20.10) */
33
+ sourceName: string;
12
34
  }
13
35
  interface CandidateSkill {
14
36
  id: string;
@@ -97,7 +119,16 @@ declare class CandidateStore {
97
119
  /** 治理根下该技能是否仍装着;不注入则 published 一律拒删(见 `remove`) */
98
120
  isSkillInstalled?: (name: string) => Promise<boolean>;
99
121
  });
100
- save(candidate: CandidateSkill): Promise<void>;
122
+ /**
123
+ * 存候选。`binaries` 的键是 `CandidateFile.binary.file`,缺省即本候选全是文本。
124
+ *
125
+ * 落盘顺序是**先字节、后 JSON**(0.23.0 分册 20 §3.2):反过来的话,
126
+ * 崩溃会留下一条指向不存在字节的元数据,而那种候选要到审批安装那一步才暴露——
127
+ * 正是 FR-20.6 要避免的那类「延迟到审批才失败」。
128
+ */
129
+ save(candidate: CandidateSkill, binaries?: ReadonlyMap<string, Uint8Array>): Promise<void>;
130
+ /** 读回候选旁路里的一份字节(安装时按原样写进技能目录,0.23.0 分册 20 FR-20.8) */
131
+ readCandidateBinary(id: string, file: string): Promise<Uint8Array>;
101
132
  get(id: string): Promise<CandidateSkill>;
102
133
  /**
103
134
  * 候选(= 审批队列)分页。`status` 是端口参数而不是上层 `.filter()`:
@@ -182,4 +213,4 @@ declare class SkillVersionStore {
182
213
  }): Promise<SkillVersion>;
183
214
  }
184
215
  //#endregion
185
- export { SkillState as _, AuditLog as a, SkillVersionStore as b, CandidateFile as c, CandidateSkill as d, CandidateSource as f, SKILL_VERSION_PAGE_SIZE as g, CompositeApprovalPolicy as h, AuditEvent as i, CandidatePage as l, CandidateStore as m, ApprovalDecision as n, AuditQueryFilter as o, CandidateStatus as p, ApprovalPolicy as r, CANDIDATE_PAGE_SIZE as s, AlwaysHumanApprovalPolicy as t, CandidateRisk as u, SkillVersion as v, candidateToCatalogEntry as x, SkillVersionPage as y };
216
+ export { candidateToCatalogEntry as S, SKILL_VERSION_PAGE_SIZE as _, AuditLog as a, SkillVersionPage as b, CandidateBinaryRef as c, CandidateRisk as d, CandidateSkill as f, CompositeApprovalPolicy as g, CandidateStore as h, AuditEvent as i, CandidateFile as l, CandidateStatus as m, ApprovalDecision as n, AuditQueryFilter as o, CandidateSource as p, ApprovalPolicy as r, CANDIDATE_PAGE_SIZE as s, AlwaysHumanApprovalPolicy as t, CandidatePage as u, SkillState as v, SkillVersionStore as x, SkillVersion as y };
package/dist/testing.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { S 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, v as MemoryStore } from "./types-CpDRZ0rA-BM5FI9oN.js";
1
+ import { S 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, v as MemoryStore } from "./types-CpDRZ0rA-BiZBXGm4.js";
2
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
@@ -416,6 +416,13 @@ declare const isAtomicTempPath: (path: string) => boolean;
416
416
  * 对崩溃一致性要求极高的场景在浏览器侧需知悉此前提。
417
417
  */
418
418
  declare function atomicWriteText(fs: FileSystemProvider, path: string, content: string): Promise<void>;
419
+ /**
420
+ * 原子写二进制:与 `atomicWriteText` 逐字对称,只换写入方法(0.23.0 分册 20)。
421
+ *
422
+ * 临时名必须沿用同一条 `ATOMIC_TMP_SUFFIX_PATTERN` 形状——打包与列举侧靠那条正则
423
+ * 排除中断残留,另起一套命名会让残留的临时文件被打进技能包。
424
+ */
425
+ declare function atomicWriteBinary(fs: FileSystemProvider, path: string, content: Uint8Array): Promise<void>;
419
426
  //#endregion
420
427
  //#region src/fs/pathSecurity.d.ts
421
428
  /** 统一分隔符为 `/`,去除 `.` 段与重复分隔符(不解析 `..`) */
@@ -1261,4 +1268,4 @@ interface MemoryStore {
1261
1268
  transaction?<T>(scope: string, fn: (inner: MemoryStore) => Promise<T>): Promise<T>;
1262
1269
  }
1263
1270
  //#endregion
1264
- export { PPTX_MIME as $, extractedDocumentFormat as $t, extractSkillCandidate as A, TrustedKey as At, DOCX_MIME as B, assertRemoteUrlAllowed as Bt, UiSpecActionCapability as C, xmlRenderer as Cn, SkillMetadata as Ct, UiSpecSnapshot as D, SkillSource as Dt, UiSpecPatch as E, SkillSignature as Et, BINARY_EXTENSIONS as F, ValidationReport as Ft, FileStat as G, checkDependencyCycles as Gt, DiscoveryResult as H, atomicWriteText as Ht, CatalogRenderer as I, VerifyResult as It, FsTrustedKeyStore as J, computeDigest as Jt, FileSystemProvider as K, checkSkillRules as Kt, ChatAttachmentKind as L, WebSkillError as Lt, ATTACHMENT_TEXT_LIMIT as M, UNTRUSTED_LINE_LIMIT as Mt, ArchiveLimits as N, UiSpecNode as Nt, UiSurfaceActionRequest as O, SkillsLockfile as Ot, AttachmentTextInput as P, UnsignedPolicy as Pt, MemoryFS as Q, exportSkills as Qt, CryptoKeyLike as R, WebSkillErrorCode as Rt, UiBridge as S, verifySkillSignature as Sn, SkillManifest as St, UiSpecEvent as T, SkillReader as Tt, ExtractedDocumentFormat as U, buildCatalog as Ut, DWG_MIME_TYPES as V, assertSafePathSegment as Vt, FILE_MIME_TYPES as W, buildManifest as Wt, JsonSchema as X, detectSkillArchiveShapeFromFs as Xt, IMAGE_MIME_TYPES as Y, detectSkillArchiveShape as Yt, MANIFEST_EXCLUDED_FILES as Z, escapeXml as Zt, LlmToolSpec as _, signaturePayloadBytes as _n, SkillDocument as _t, InteractionOrigin as a, messageOf as an, SKILL_MANIFEST_FILE as at, RenderResultRequest as b, validateSkills as bn, SkillLocation as bt, InteractionResponse as c, parseSkillPackManifest as cn, SKILL_PACK_FILE as ct, LlmContentPart as d, renderAvailableSkillsXml as dn, SignatureVerdict as dt, formatAttachmentText as en, Page as et, LlmMessage as f, renderCatalogJson as fn, SkillArchiveDetection as ft, LlmToolCall as g, signSkill as gn, SkillDiscovery as gt, LlmTokenUsage as h, sanitizeUntrustedLine as hn, SkillCatalogEntry as ht, FormField as i, keyIdOf as in, SKILLS_LOCKFILE as it, ATOMIC_TMP_SUFFIX_PATTERN as j, TrustedKeyStore as jt, UiSurfaceActionResponse as k, TEXT_EXTENSIONS as kt, LlmClient as l, readResponseWithLimit as ln, SKILL_SIGNATURE_FILE as lt, LlmStreamEvent as m, resolveInsideRoot as mn, SkillCatalog as mt, ArtifactStore as n, isValidSkillName as nn, RemoteUrlPolicy as nt, InteractionPolicy as o, normalizePath as on, SKILL_NAME_MAX_LENGTH as ot, LlmResponse as p, resolveArchiveLimits as pn, SkillArchiveShape as pt, FileWriteStream as q, classifyAttachment as qt, ChartSpec as r, jsonRenderer as rn, SIGNATURE_SCHEMA_VERSION as rt, InteractionRequest as s, parseSkillMarkdown as sn, SKILL_NAME_PATTERN as st, Artifact as t, isAtomicTempPath as tn, PageQuery as tt, LlmCompleteInput as u, readSkillSignature as un, SignatureAuditSink as ut, MemoryStore as v, stripArchiveRoot as vn, SkillInstallSource as vt, UiSpecDrafts as w, SkillPackManifest as wt, SkillCandidateMarker as x, verifyManifest as xn, SkillManagerPort as xt, RenderBlock as y, unzipWithLimits as yn, SkillIssue as yt, DEFAULT_ARCHIVE_LIMITS as z, XLSX_MIME as zt };
1271
+ export { PPTX_MIME as $, exportSkills as $t, extractSkillCandidate as A, TrustedKey as At, DOCX_MIME as B, assertRemoteUrlAllowed as Bt, UiSpecActionCapability as C, verifySkillSignature as Cn, SkillMetadata as Ct, UiSpecSnapshot as D, SkillSource as Dt, UiSpecPatch as E, SkillSignature as Et, BINARY_EXTENSIONS as F, ValidationReport as Ft, FileStat as G, buildManifest as Gt, DiscoveryResult as H, atomicWriteBinary as Ht, CatalogRenderer as I, VerifyResult as It, FsTrustedKeyStore as J, classifyAttachment as Jt, FileSystemProvider as K, checkDependencyCycles as Kt, ChatAttachmentKind as L, WebSkillError as Lt, ATTACHMENT_TEXT_LIMIT as M, UNTRUSTED_LINE_LIMIT as Mt, ArchiveLimits as N, UiSpecNode as Nt, UiSurfaceActionRequest as O, SkillsLockfile as Ot, AttachmentTextInput as P, UnsignedPolicy as Pt, MemoryFS as Q, escapeXml as Qt, CryptoKeyLike as R, WebSkillErrorCode as Rt, UiBridge as S, verifyManifest as Sn, SkillManifest as St, UiSpecEvent as T, SkillReader as Tt, ExtractedDocumentFormat as U, atomicWriteText as Ut, DWG_MIME_TYPES as V, assertSafePathSegment as Vt, FILE_MIME_TYPES as W, buildCatalog as Wt, JsonSchema as X, detectSkillArchiveShape as Xt, IMAGE_MIME_TYPES as Y, computeDigest as Yt, MANIFEST_EXCLUDED_FILES as Z, detectSkillArchiveShapeFromFs as Zt, LlmToolSpec as _, signSkill as _n, SkillDocument as _t, InteractionOrigin as a, keyIdOf as an, SKILL_MANIFEST_FILE as at, RenderResultRequest as b, unzipWithLimits as bn, SkillLocation as bt, InteractionResponse as c, parseSkillMarkdown as cn, SKILL_PACK_FILE as ct, LlmContentPart as d, readSkillSignature as dn, SignatureVerdict as dt, extractedDocumentFormat as en, Page as et, LlmMessage as f, renderAvailableSkillsXml as fn, SkillArchiveDetection as ft, LlmToolCall as g, sanitizeUntrustedLine as gn, SkillDiscovery as gt, LlmTokenUsage as h, resolveInsideRoot as hn, SkillCatalogEntry as ht, FormField as i, jsonRenderer as in, SKILLS_LOCKFILE as it, ATOMIC_TMP_SUFFIX_PATTERN as j, TrustedKeyStore as jt, UiSurfaceActionResponse as k, TEXT_EXTENSIONS as kt, LlmClient as l, parseSkillPackManifest as ln, SKILL_SIGNATURE_FILE as lt, LlmStreamEvent as m, resolveArchiveLimits as mn, SkillCatalog as mt, ArtifactStore as n, isAtomicTempPath as nn, RemoteUrlPolicy as nt, InteractionPolicy as o, messageOf as on, SKILL_NAME_MAX_LENGTH as ot, LlmResponse as p, renderCatalogJson as pn, SkillArchiveShape as pt, FileWriteStream as q, checkSkillRules as qt, ChartSpec as r, isValidSkillName as rn, SIGNATURE_SCHEMA_VERSION as rt, InteractionRequest as s, normalizePath as sn, SKILL_NAME_PATTERN as st, Artifact as t, formatAttachmentText as tn, PageQuery as tt, LlmCompleteInput as u, readResponseWithLimit as un, SignatureAuditSink as ut, MemoryStore as v, signaturePayloadBytes as vn, SkillInstallSource as vt, UiSpecDrafts as w, xmlRenderer as wn, SkillPackManifest as wt, SkillCandidateMarker as x, validateSkills as xn, SkillManagerPort as xt, RenderBlock as y, stripArchiveRoot as yn, SkillIssue as yt, DEFAULT_ARCHIVE_LIMITS as z, XLSX_MIME as zt };
@@ -1,6 +1,6 @@
1
- import { C as UiSpecActionCapability, D as UiSpecSnapshot, Nt as UiSpecNode, O as UiSurfaceActionRequest, S as UiBridge, T as UiSpecEvent, b as RenderResultRequest, c as InteractionResponse, k as UiSurfaceActionResponse, s as InteractionRequest, w as UiSpecDrafts } from "./types-CpDRZ0rA-BM5FI9oN.js";
2
- import { P as DocumentSurfacePort } from "./index-YPd8ZSEa.js";
3
- import { F as InteractionSpecLabels, J as SurfaceFormTexts, Y as SurfaceHostControlTexts, v as ChartFontSizes } from "./index-BiO9_XRk.js";
1
+ import { C as UiSpecActionCapability, D as UiSpecSnapshot, Nt as UiSpecNode, O as UiSurfaceActionRequest, S as UiBridge, T as UiSpecEvent, b as RenderResultRequest, c as InteractionResponse, k as UiSurfaceActionResponse, s as InteractionRequest, w as UiSpecDrafts } from "./types-CpDRZ0rA-BiZBXGm4.js";
2
+ import { P as DocumentSurfacePort } from "./index-7No55dRb.js";
3
+ import { F as InteractionSpecLabels, J as SurfaceFormTexts, Y as SurfaceHostControlTexts, v as ChartFontSizes } from "./index-ShvCB5I9.js";
4
4
  import { z } from "zod";
5
5
  import React$1, { ComponentType, ReactNode } from "react";
6
6
  import "react/jsx-runtime";
package/dist/ui-react.js CHANGED
@@ -258,6 +258,8 @@ var ReactBridgeState = class {
258
258
  streamingRunId = null;
259
259
  streamingText = "";
260
260
  #listeners = /* @__PURE__ */ new Set();
261
+ /** 待决交互队列,队头即 `pending`(0.23.0 分册 19 FR-19.6) */
262
+ #queue = [];
261
263
  #resolvers = /* @__PURE__ */ new Map();
262
264
  #surfaceActionResolvers = /* @__PURE__ */ new Map();
263
265
  #processedSurfaceActionNonces = /* @__PURE__ */ new Set();
@@ -301,10 +303,11 @@ var ReactBridgeState = class {
301
303
  for (const listener of [...this.#listeners]) listener();
302
304
  }
303
305
  request(input) {
304
- this.pending = input;
305
- this.#emit();
306
306
  return new Promise((resolve) => {
307
307
  this.#resolvers.set(input.id, resolve);
308
+ this.#queue.push(input);
309
+ this.pending = this.#queue[0] ?? null;
310
+ this.#emit();
308
311
  });
309
312
  }
310
313
  /** 组件提交/取消回调 */
@@ -312,7 +315,8 @@ var ReactBridgeState = class {
312
315
  const resolver = this.#resolvers.get(response.id);
313
316
  if (!resolver) return;
314
317
  this.#resolvers.delete(response.id);
315
- this.pending = null;
318
+ this.#queue = this.#queue.filter((request) => request.id !== response.id);
319
+ this.pending = this.#queue[0] ?? null;
316
320
  this.#emit();
317
321
  resolver(response);
318
322
  }
@@ -134885,7 +134889,14 @@ async function probeJsonRenderAvailability() {
134885
134889
  var SpecInteractionChannel = class {
134886
134890
  /** 宿主注入的界面文案(本地化);未设时用 FormModel 的英文默认值 */
134887
134891
  labelsFor = () => ({});
134888
- #current;
134892
+ /**
134893
+ * 待决交互队列,队头即 `current`(0.23.0 分册 19 FR-19.6)。
134894
+ *
134895
+ * 原本是单槽,新请求到来时把旧请求主动取消。并发子 agent 下那一句
134896
+ * 「正常路径 runtime 串行」不再成立,而主动取消比悬挂还糟:
134897
+ * 子 agent 会收到一个看似正常的 `cancelled: true`,然后把「用户拒绝了」写进结论。
134898
+ */
134899
+ #queue = [];
134889
134900
  #listeners = /* @__PURE__ */ new Set();
134890
134901
  #attached = 0;
134891
134902
  #failure;
@@ -134895,7 +134906,7 @@ var SpecInteractionChannel = class {
134895
134906
  return () => this.#listeners.delete(listener);
134896
134907
  };
134897
134908
  get current() {
134898
- return this.#current?.session;
134909
+ return this.#queue[0]?.session;
134899
134910
  }
134900
134911
  get isAttached() {
134901
134912
  return this.#attached > 0;
@@ -134911,26 +134922,22 @@ var SpecInteractionChannel = class {
134911
134922
  this.#attached = Math.max(0, this.#attached - 1);
134912
134923
  }
134913
134924
  request(input) {
134914
- if (this.#current) this.#settle({
134915
- id: this.#current.session.request.id,
134916
- cancelled: true
134917
- });
134918
134925
  return new Promise((resolve, reject) => {
134919
134926
  const session = {
134920
134927
  request: input,
134921
134928
  spec: interactionToUiSpec(input, this.labelsFor(input))
134922
134929
  };
134923
- this.#current = {
134930
+ this.#queue.push({
134924
134931
  session,
134925
134932
  resolve,
134926
134933
  reject
134927
- };
134934
+ });
134928
134935
  this.#emit();
134929
134936
  });
134930
134937
  }
134931
134938
  /** runtime 交互超时/取消:以 cancelled resolve 挂起的 request(防悬挂 + 残留) */
134932
134939
  cancel(id) {
134933
- if (this.#current?.session.request.id === id) this.#settle({
134940
+ if (this.#queue.some((entry) => entry.session.request.id === id)) this.#settle({
134934
134941
  id,
134935
134942
  cancelled: true
134936
134943
  });
@@ -134941,14 +134948,14 @@ var SpecInteractionChannel = class {
134941
134948
  * 本通道只提供入口:裸用本通道的宿主不调就维持原来的 cancelled 语义。
134942
134949
  */
134943
134950
  decline(id) {
134944
- if (this.#current?.session.request.id === id) this.#settle({
134951
+ if (this.#queue.some((entry) => entry.session.request.id === id)) this.#settle({
134945
134952
  id,
134946
134953
  value: false
134947
134954
  });
134948
134955
  }
134949
134956
  /** react 层动作回传:submit 归形提交值,其余意图(cancel)按取消收尾 */
134950
134957
  handleAction(event) {
134951
- const pending = this.#current;
134958
+ const pending = this.#queue[0];
134952
134959
  if (!pending) return;
134953
134960
  const { request } = pending.session;
134954
134961
  if (event.intent !== "submit") {
@@ -134967,14 +134974,16 @@ var SpecInteractionChannel = class {
134967
134974
  /** react 层初始化失败:挂起请求 reject 并记录原因(桥读取后降级 native) */
134968
134975
  fail(message) {
134969
134976
  this.#failure = message;
134970
- const pending = this.#current;
134971
- this.#current = void 0;
134977
+ const pendings = this.#queue;
134978
+ this.#queue = [];
134972
134979
  this.#emit();
134973
- pending?.reject(new Error(message));
134980
+ const error = new Error(message);
134981
+ for (const pending of pendings) pending.reject(error);
134974
134982
  }
134975
134983
  #settle(response) {
134976
- const pending = this.#current;
134977
- this.#current = void 0;
134984
+ const index = this.#queue.findIndex((entry) => entry.session.request.id === response.id);
134985
+ if (index < 0) return;
134986
+ const [pending] = this.#queue.splice(index, 1);
134978
134987
  this.#emit();
134979
134988
  pending?.resolve(response);
134980
134989
  }
package/dist/ui-vue.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { S as UiBridge, b as RenderResultRequest, c as InteractionResponse, s as InteractionRequest } from "./types-CpDRZ0rA-BM5FI9oN.js";
1
+ import { S as UiBridge, b as RenderResultRequest, c as InteractionResponse, s as InteractionRequest } from "./types-CpDRZ0rA-BiZBXGm4.js";
2
2
  import { PropType } from "vue";
3
3
  //#region ../ui-vue/dist/index.d.ts
4
4
  //#region src/bridgeState.d.ts
package/dist/ui.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Nt as UiSpecNode } from "./types-CpDRZ0rA-BM5FI9oN.js";
2
- import { Cr as buildRenderResult } from "./index-YPd8ZSEa.js";
3
- import { $ as UI_PRESET_NAMES, $t as normalizeColumnWidths, A as EvaluateFieldConditionOptions, At as applySuggestion, B as NormalizedColumnWidths, Bt as ensureStyles, C as DEFAULT_INTERACTION_TEXTS, Ct as WEBSKILL_A2UI_CATALOG_ID, D as DOCUMENT_COMPONENTS, Dt as ZodRuntime, E as DESCRIBE_UI_PRESET_TOOL, Et as WebFormBridge, F as InteractionSpecLabels, Ft as collectScopedValues, G as SPEC_TABLE_MIN_COLUMN_VAR, Gt as fromVercelToolResult, H as OpenUiRuntime, Ht as fromA2uiSpecAction, I as InteractionTexts, It as collectSpecActions, J as SurfaceFormTexts, Jt as interactionToUiSpec, K as SPEC_TABLE_MIN_COLUMN_WIDTH, Kt as gaugePercent, L as JsonRenderSpec, Lt as collectValues, M as FieldConditionResult, Mt as chartSpecFromProps, N as FieldOption, Nt as chartToTable, O as DocumentComponentName, Ot as a2uiComponentSchema, P as FormModel, Pt as collectFormScopes, Q as UI_PRESETS, Qt as mountViewerComponents, R as LoadedOpenUiPeers, Rt as createUiCatalogToolSource, S as DEFAULT_CHART_FONT_SIZES, St as ViewerComponentsOptions, T as DEFAULT_SURFACE_HOST_CONTROL_TEXTS, Tt as WEBSKILL_SURFACE_ACTION, U as PLANNED_INCREMENT, Ut as fromA2uiSurfaceAction, V as OpenUiRendererProps, Vt as evaluateFieldCondition, W as RENDER_UI_TOOL, Wt as fromUiSurfaceActionDispatch, X as UI_CATALOG_GROUPS, Xt as loadWebSkillLitCatalog, Y as SurfaceHostControlTexts, Yt as loadOpenUiPeers, Z as UI_CATALOG_PROMPT_BUDGET_BYTES, Zt as mountEchart, _ as CHART_PALETTE, _n as toUiSurfaceActionDispatch, _t as VIEWER_FALLBACK_ATTR, a as A2UI_SURFACE_ACTION, an as renderRenderResult, at as UiComponentDef, b as ColumnWidthsRejection, bn as uiPreset, bt as VercelUiBridge, c as A2uiCatalogDefinition, cn as resolveInteractionTexts, ct as UiPresetName, d as A2uiMessage, dn as shapeInteractionValue, dt as UiSpecIssue, en as normalizeFieldOptions, et as UiActionDef, f as A2uiSpecActionEvent, fn as toA2uiSpecMessages, ft as UiSpecSanitization, g as CATALOG_SCHEMA_MAX, gn as toOpenUiSpecLang, gt as VIEWER_COMPONENT_ATTR, h as CATALOG_PROMPT_MAX, hn as toJsonRenderSpec, ht as VERCEL_INTERACTION_TOOL_NAME, i as A2UI_SPEC_FORM_PATH, in as renderMiniMarkdown, it as UiCatalogToolSourceOptions, j as FieldCondition, jt as buildA2uiCatalogDefinition, k as EchartHandle, kt as a2uiComponentShapes, l as A2uiCatalogHandle, ln as resolveSurfaceFormTexts, lt as UiSpecDegradation, m as CATALOG_BUDGET_STAGE, mn as toEchartsOption, mt as UiSurfaceActionDispatch, n as A2UI_COMMON_TYPES, nn as renderBlocks, nt as UiCatalogInput, o as A2UI_VERSION, on as resolveChartFontSizes, ot as UiFormScope, p as A2uiSpecMessageOptions, pn as toA2uiSurfaceAction, pt as UiSpecValidation, q as SpecColumnMeta, qt as interactionToFormModel, r as A2UI_SPEC_ACTION, rn as renderMiniChart, rt as UiCatalogPromptOptions, s as A2uiCatalogComponent, sn as resolveColumnWidths, st as UiPreset, t as A2UI_BASIC_CATALOG_ID, tn as qualifyFieldName, tt as UiCatalog, u as A2uiComponentShape, un as resolveSurfaceHostControlTexts, ut as UiSpecDegradationCode, v as ChartFontSizes, vn as toVercelToolInvocation, vt as VIEWER_PROPS_ATTR, w as DEFAULT_SURFACE_FORM_TEXTS, wt as WEBSKILL_STYLES_CSS, x as ControlModel, xt as ViewerComponentsHandle, y as CollectedValues, yn as uiCatalog, yt as VercelToolInvocation, z as MAX_CONDITION_DEPTH, zt as defineUiCatalog } from "./index-BiO9_XRk.js";
1
+ import { Nt as UiSpecNode } from "./types-CpDRZ0rA-BiZBXGm4.js";
2
+ import { Cr as buildRenderResult } from "./index-7No55dRb.js";
3
+ import { $ as UI_PRESET_NAMES, $t as normalizeColumnWidths, A as EvaluateFieldConditionOptions, At as applySuggestion, B as NormalizedColumnWidths, Bt as ensureStyles, C as DEFAULT_INTERACTION_TEXTS, Ct as WEBSKILL_A2UI_CATALOG_ID, D as DOCUMENT_COMPONENTS, Dt as ZodRuntime, E as DESCRIBE_UI_PRESET_TOOL, Et as WebFormBridge, F as InteractionSpecLabels, Ft as collectScopedValues, G as SPEC_TABLE_MIN_COLUMN_VAR, Gt as fromVercelToolResult, H as OpenUiRuntime, Ht as fromA2uiSpecAction, I as InteractionTexts, It as collectSpecActions, J as SurfaceFormTexts, Jt as interactionToUiSpec, K as SPEC_TABLE_MIN_COLUMN_WIDTH, Kt as gaugePercent, L as JsonRenderSpec, Lt as collectValues, M as FieldConditionResult, Mt as chartSpecFromProps, N as FieldOption, Nt as chartToTable, O as DocumentComponentName, Ot as a2uiComponentSchema, P as FormModel, Pt as collectFormScopes, Q as UI_PRESETS, Qt as mountViewerComponents, R as LoadedOpenUiPeers, Rt as createUiCatalogToolSource, S as DEFAULT_CHART_FONT_SIZES, St as ViewerComponentsOptions, T as DEFAULT_SURFACE_HOST_CONTROL_TEXTS, Tt as WEBSKILL_SURFACE_ACTION, U as PLANNED_INCREMENT, Ut as fromA2uiSurfaceAction, V as OpenUiRendererProps, Vt as evaluateFieldCondition, W as RENDER_UI_TOOL, Wt as fromUiSurfaceActionDispatch, X as UI_CATALOG_GROUPS, Xt as loadWebSkillLitCatalog, Y as SurfaceHostControlTexts, Yt as loadOpenUiPeers, Z as UI_CATALOG_PROMPT_BUDGET_BYTES, Zt as mountEchart, _ as CHART_PALETTE, _n as toUiSurfaceActionDispatch, _t as VIEWER_FALLBACK_ATTR, a as A2UI_SURFACE_ACTION, an as renderRenderResult, at as UiComponentDef, b as ColumnWidthsRejection, bn as uiPreset, bt as VercelUiBridge, c as A2uiCatalogDefinition, cn as resolveInteractionTexts, ct as UiPresetName, d as A2uiMessage, dn as shapeInteractionValue, dt as UiSpecIssue, en as normalizeFieldOptions, et as UiActionDef, f as A2uiSpecActionEvent, fn as toA2uiSpecMessages, ft as UiSpecSanitization, g as CATALOG_SCHEMA_MAX, gn as toOpenUiSpecLang, gt as VIEWER_COMPONENT_ATTR, h as CATALOG_PROMPT_MAX, hn as toJsonRenderSpec, ht as VERCEL_INTERACTION_TOOL_NAME, i as A2UI_SPEC_FORM_PATH, in as renderMiniMarkdown, it as UiCatalogToolSourceOptions, j as FieldCondition, jt as buildA2uiCatalogDefinition, k as EchartHandle, kt as a2uiComponentShapes, l as A2uiCatalogHandle, ln as resolveSurfaceFormTexts, lt as UiSpecDegradation, m as CATALOG_BUDGET_STAGE, mn as toEchartsOption, mt as UiSurfaceActionDispatch, n as A2UI_COMMON_TYPES, nn as renderBlocks, nt as UiCatalogInput, o as A2UI_VERSION, on as resolveChartFontSizes, ot as UiFormScope, p as A2uiSpecMessageOptions, pn as toA2uiSurfaceAction, pt as UiSpecValidation, q as SpecColumnMeta, qt as interactionToFormModel, r as A2UI_SPEC_ACTION, rn as renderMiniChart, rt as UiCatalogPromptOptions, s as A2uiCatalogComponent, sn as resolveColumnWidths, st as UiPreset, t as A2UI_BASIC_CATALOG_ID, tn as qualifyFieldName, tt as UiCatalog, u as A2uiComponentShape, un as resolveSurfaceHostControlTexts, ut as UiSpecDegradationCode, v as ChartFontSizes, vn as toVercelToolInvocation, vt as VIEWER_PROPS_ATTR, w as DEFAULT_SURFACE_FORM_TEXTS, wt as WEBSKILL_STYLES_CSS, x as ControlModel, xt as ViewerComponentsHandle, y as CollectedValues, yn as uiCatalog, yt as VercelToolInvocation, z as MAX_CONDITION_DEPTH, zt as defineUiCatalog } from "./index-ShvCB5I9.js";
4
4
  export { A2UI_BASIC_CATALOG_ID, A2UI_COMMON_TYPES, A2UI_SPEC_ACTION, A2UI_SPEC_FORM_PATH, A2UI_SURFACE_ACTION, A2UI_VERSION, type A2uiCatalogComponent, type A2uiCatalogDefinition, type A2uiCatalogHandle, type A2uiComponentShape, type A2uiMessage, type A2uiSpecActionEvent, type A2uiSpecMessageOptions, CATALOG_BUDGET_STAGE, CATALOG_PROMPT_MAX, CATALOG_SCHEMA_MAX, CHART_PALETTE, type ChartFontSizes, type CollectedValues, type ColumnWidthsRejection, type ControlModel, DEFAULT_CHART_FONT_SIZES, DEFAULT_INTERACTION_TEXTS, DEFAULT_SURFACE_FORM_TEXTS, DEFAULT_SURFACE_HOST_CONTROL_TEXTS, DESCRIBE_UI_PRESET_TOOL, DOCUMENT_COMPONENTS, type DocumentComponentName, type EchartHandle, type EvaluateFieldConditionOptions, type FieldCondition, type FieldConditionResult, type FieldOption, type FormModel, type InteractionSpecLabels, type InteractionTexts, type JsonRenderSpec, type LoadedOpenUiPeers, MAX_CONDITION_DEPTH, type NormalizedColumnWidths, type OpenUiRendererProps, type OpenUiRuntime, PLANNED_INCREMENT, RENDER_UI_TOOL, SPEC_TABLE_MIN_COLUMN_VAR, SPEC_TABLE_MIN_COLUMN_WIDTH, type SpecColumnMeta, type SurfaceFormTexts, type SurfaceHostControlTexts, UI_CATALOG_GROUPS, UI_CATALOG_PROMPT_BUDGET_BYTES, UI_PRESETS, UI_PRESET_NAMES, type UiActionDef, type UiCatalog, type UiCatalogInput, type UiCatalogPromptOptions, type UiCatalogToolSourceOptions, type UiComponentDef, type UiFormScope, type UiPreset, type UiPresetName, type UiSpecDegradation, type UiSpecDegradationCode, type UiSpecIssue, type UiSpecNode, type UiSpecSanitization, type UiSpecValidation, type UiSurfaceActionDispatch, VERCEL_INTERACTION_TOOL_NAME, VIEWER_COMPONENT_ATTR, VIEWER_FALLBACK_ATTR, VIEWER_PROPS_ATTR, type VercelToolInvocation, VercelUiBridge, type ViewerComponentsHandle, type ViewerComponentsOptions, WEBSKILL_A2UI_CATALOG_ID, WEBSKILL_STYLES_CSS, WEBSKILL_SURFACE_ACTION, WebFormBridge, type ZodRuntime, a2uiComponentSchema, a2uiComponentShapes, applySuggestion, buildA2uiCatalogDefinition, buildRenderResult, chartSpecFromProps, chartToTable, collectFormScopes, collectScopedValues, collectSpecActions, collectValues, createUiCatalogToolSource, defineUiCatalog, ensureStyles, evaluateFieldCondition, fromA2uiSpecAction, fromA2uiSurfaceAction, fromUiSurfaceActionDispatch, fromVercelToolResult, gaugePercent, interactionToFormModel, interactionToUiSpec, loadOpenUiPeers, loadWebSkillLitCatalog, mountEchart, mountViewerComponents, normalizeColumnWidths, normalizeFieldOptions, qualifyFieldName, renderBlocks, renderMiniChart, renderMiniMarkdown, renderRenderResult, resolveChartFontSizes, resolveColumnWidths, resolveInteractionTexts, resolveSurfaceFormTexts, resolveSurfaceHostControlTexts, shapeInteractionValue, toA2uiSpecMessages, toA2uiSurfaceAction, toEchartsOption, toJsonRenderSpec, toOpenUiSpecLang, toUiSurfaceActionDispatch, toVercelToolInvocation, uiCatalog, uiPreset };
@@ -1,6 +1,6 @@
1
1
  import { t as WebSkillError } from "./errors-BDZNpC13.js";
2
- import { b as parseSkillMarkdown, i as buildCatalog, n as SkillDiscovery, t as validateSkills } from "./skill-CAJMsLod.js";
3
- import { f as WebSkillRuntime } from "./approval-DWQlDPbY.js";
2
+ import { b as parseSkillMarkdown, i as buildCatalog, n as SkillDiscovery, t as validateSkills } from "./skill-WSUDp6A1.js";
3
+ import { f as WebSkillRuntime } from "./approval-7CuZS3Z4.js";
4
4
 
5
5
  //#region ../runtime/src/facade/webSkillApi.ts
6
6
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webskill/sdk",
3
- "version": "0.22.0",
3
+ "version": "0.23.0",
4
4
  "description": "WebSkill — browser/Node agent skill runtime (skills, tools, MCP, governance, UI)",
5
5
  "license": "MIT",
6
6
  "type": "module",