@webskill/sdk 0.17.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/agent.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import { E as DEFAULT_MAX_DATA_SOURCE_BYTES } from "./index-BDyXe-a5.js";
2
- import { $ as NestedFrameRef, $t as TAB_WORKSET_MIN_MAX, A as DelegationRequest, An as withDelegationOrigin, At as PerceptionAuditSink, B as DownloadedFileReader, Bt as SkillGenerationMessages, C as DataSourcePolicyOptions, Cn as createSkillGenerationToolSource, Ct as PagePerceptionPolicy, D as DelegationBudget, Dn as frameSteps, Dt as ParentBudget, E as DataSourceTransport, En as frameLabel, Et as PagePerceptionToolSourceOptions, F as DownloadedFileEntry, Ft as PerceptionScope, G as FrameScope, Gt as SkillGeneratorOptions, H as DownloadedFileToolSourceOptions, Ht as SkillGenerationPolicy, I as DownloadedFileListing, It as PerceptionScopeInput, J as HttpDataSourceOptions, Jt as SubAgentRunInput, K as GENERATE_SKILL_TOOL, Kt as SkillTraceEvidence, L as DownloadedFilePolicy, Lt as READ_DOWNLOADED_FILE_TOOL, M as DelegationToolSourceOptions, Mt as PerceptionPagingBudget, N as DownloadedFileAction, Nt as PerceptionRecord, O as DelegationOrchestrator, On as toActionFrameScopes, Ot as PerceivedImage, P as DownloadedFileConsent, Pt as PerceptionResult, Q as MANAGE_TODO_TOOL, Qt as TAB_WORKSET_MAX_MAX, R as DownloadedFilePolicyOptions, Rt as SKILL_GENERATION_SYSTEM_PROMPT, S as DataSourcePolicy, Sn as createPagePerceptionToolSource, St as PageAuditSink, T as DataSourceRecord, Tn as createTodoToolSource, Tt as PagePerceptionReader, U as FOCUS_PAGE_TAB_TOOL, Ut as SkillGenerationToolSourceOptions, V as DownloadedFileRecord, Vt as SkillGenerationOutcome, W as FrameNote, Wt as SkillGenerator, X as LIST_DOWNLOADED_FILES_TOOL, Xt as SubtreeRejection, Y as ImageCaptureBudget, Yt as SubAgentRunner, Z as LIST_PAGE_TABS_TOOL, Zt as TAB_WORKSET_DEFAULT_MAX, _ as DataSourceCandidatePolicyOptions, _n as clampWorksetMax, _t as PageActionScope, a as ActionTabWindow, an as TabWorksetPort, at as PAGE_DOCUMENT_REF, b as DataSourceDef, bn as createHttpDataSourceTransport, bt as PageActionToolSourceOptions, c as DELEGATE_TASK_TOOL, cn as TodoItem, ct as PERCEPTION_SYSTEM_PROMPT, d as DOWNLOAD_WAIT_MAX_MS, dn as TodoStatus, dt as PageActionKind, en as TAB_WORKSET_SYSTEM_PROMPT, et as OpenedPageInfo, f as DOWNLOAD_WAIT_MIN_MS, fn as TodoStore, ft as PageActionOutcome, g as DataSourceCandidatePolicy, gn as clampDownloadWaitMs, gt as PageActionRequest, h as DataSourceCandidateAuditSink, hn as WorksetTabView, ht as PageActionRecord, i as ActionTabWatcher, in as TabWorksetPolicyOptions, it as PAGE_ACTION_TOOL, j as DelegationResult, jt as PerceptionCaptureOptions, k as DelegationOrchestratorOptions, kn as toFrameScopes, kt as PerceivedNode, l as DELEGATION_SYSTEM_PROMPT, ln as TodoList, lt as PageActionConsent, m as DataSourceCandidate, mn as WorksetTab, mt as PageActionPolicyOptions, n as ActionDownloadWindow, nn as TabAdmission, nt as PAGE_ACTION_KINDS, o as CLOSE_PAGE_TAB_TOOL, on as TabWorksetToolSourceOptions, ot as PERCEIVE_PAGE_TOOL, p as DataSourceAuditSink, pn as TodoToolSourceOptions, pt as PageActionPolicy, q as GeneratedSkillDraft, qt as SkillTraceEvidenceStep, r as ActionFrameScope, rn as TabWorksetPolicy, rt as PAGE_ACTION_SYSTEM_PROMPT, s as ConsentUi, sn as TodoEvent, st as PERCEPTION_PAGING_DEFAULTS, t as ActionDownloadWatcher, tn as TODO_SYSTEM_PROMPT, tt as OpenedTabSignal, u as DOWNLOAD_WAIT_DEFAULT_MS, un as TodoListener, ut as PageActionExecutor, v as DataSourceCandidateRecord, vn as createDelegationToolSource, vt as PageActionScopeInput, w as DataSourceProvenance, wn as createTabWorksetToolSource, wt as PagePerceptionPolicyOptions, x as DataSourceKind, xn as createPageActionToolSource, xt as PageActionUi, y as DataSourceCandidateStore, yn as createDownloadedFileToolSource, yt as PageActionTarget, z as DownloadedFileReadResult, zt as SkillCandidateSink } from "./index-1sQZ4VBN.js";
2
+ import { $ as NestedFrameRef, $t as TAB_WORKSET_MIN_MAX, A as DelegationRequest, An as withDelegationOrigin, At as PerceptionAuditSink, B as DownloadedFileReader, Bt as SkillGenerationMessages, C as DataSourcePolicyOptions, Cn as createSkillGenerationToolSource, Ct as PagePerceptionPolicy, D as DelegationBudget, Dn as frameSteps, Dt as ParentBudget, E as DataSourceTransport, En as frameLabel, Et as PagePerceptionToolSourceOptions, F as DownloadedFileEntry, Ft as PerceptionScope, G as FrameScope, Gt as SkillGeneratorOptions, H as DownloadedFileToolSourceOptions, Ht as SkillGenerationPolicy, I as DownloadedFileListing, It as PerceptionScopeInput, J as HttpDataSourceOptions, Jt as SubAgentRunInput, K as GENERATE_SKILL_TOOL, Kt as SkillTraceEvidence, L as DownloadedFilePolicy, Lt as READ_DOWNLOADED_FILE_TOOL, M as DelegationToolSourceOptions, Mt as PerceptionPagingBudget, N as DownloadedFileAction, Nt as PerceptionRecord, O as DelegationOrchestrator, On as toActionFrameScopes, Ot as PerceivedImage, P as DownloadedFileConsent, Pt as PerceptionResult, Q as MANAGE_TODO_TOOL, Qt as TAB_WORKSET_MAX_MAX, R as DownloadedFilePolicyOptions, Rt as SKILL_GENERATION_SYSTEM_PROMPT, S as DataSourcePolicy, Sn as createPagePerceptionToolSource, St as PageAuditSink, T as DataSourceRecord, Tn as createTodoToolSource, Tt as PagePerceptionReader, U as FOCUS_PAGE_TAB_TOOL, Ut as SkillGenerationToolSourceOptions, V as DownloadedFileRecord, Vt as SkillGenerationOutcome, W as FrameNote, Wt as SkillGenerator, X as LIST_DOWNLOADED_FILES_TOOL, Xt as SubtreeRejection, Y as ImageCaptureBudget, Yt as SubAgentRunner, Z as LIST_PAGE_TABS_TOOL, Zt as TAB_WORKSET_DEFAULT_MAX, _ as DataSourceCandidatePolicyOptions, _n as clampWorksetMax, _t as PageActionScope, a as ActionTabWindow, an as TabWorksetPort, at as PAGE_DOCUMENT_REF, b as DataSourceDef, bn as createHttpDataSourceTransport, bt as PageActionToolSourceOptions, c as DELEGATE_TASK_TOOL, cn as TodoItem, ct as PERCEPTION_SYSTEM_PROMPT, d as DOWNLOAD_WAIT_MAX_MS, dn as TodoStatus, dt as PageActionKind, en as TAB_WORKSET_SYSTEM_PROMPT, et as OpenedPageInfo, f as DOWNLOAD_WAIT_MIN_MS, fn as TodoStore, ft as PageActionOutcome, g as DataSourceCandidatePolicy, gn as clampDownloadWaitMs, gt as PageActionRequest, h as DataSourceCandidateAuditSink, hn as WorksetTabView, ht as PageActionRecord, i as ActionTabWatcher, in as TabWorksetPolicyOptions, it as PAGE_ACTION_TOOL, j as DelegationResult, jt as PerceptionCaptureOptions, k as DelegationOrchestratorOptions, kn as toFrameScopes, kt as PerceivedNode, l as DELEGATION_SYSTEM_PROMPT, ln as TodoList, lt as PageActionConsent, m as DataSourceCandidate, mn as WorksetTab, mt as PageActionPolicyOptions, n as ActionDownloadWindow, nn as TabAdmission, nt as PAGE_ACTION_KINDS, o as CLOSE_PAGE_TAB_TOOL, on as TabWorksetToolSourceOptions, ot as PERCEIVE_PAGE_TOOL, p as DataSourceAuditSink, pn as TodoToolSourceOptions, pt as PageActionPolicy, q as GeneratedSkillDraft, qt as SkillTraceEvidenceStep, r as ActionFrameScope, rn as TabWorksetPolicy, rt as PAGE_ACTION_SYSTEM_PROMPT, s as ConsentUi, sn as TodoEvent, st as PERCEPTION_PAGING_DEFAULTS, t as ActionDownloadWatcher, tn as TODO_SYSTEM_PROMPT, tt as OpenedTabSignal, u as DOWNLOAD_WAIT_DEFAULT_MS, un as TodoListener, ut as PageActionExecutor, v as DataSourceCandidateRecord, vn as createDelegationToolSource, vt as PageActionScopeInput, w as DataSourceProvenance, wn as createTabWorksetToolSource, wt as PagePerceptionPolicyOptions, x as DataSourceKind, xn as createPageActionToolSource, xt as PageActionUi, y as DataSourceCandidateStore, yn as createDownloadedFileToolSource, yt as PageActionTarget, z as DownloadedFileReadResult, zt as SkillCandidateSink } from "./index-DQ3-6GFu.js";
3
3
  export { type ActionDownloadWatcher, type ActionDownloadWindow, type ActionFrameScope, type ActionTabWatcher, type ActionTabWindow, CLOSE_PAGE_TAB_TOOL, type ConsentUi, DEFAULT_MAX_DATA_SOURCE_BYTES, DELEGATE_TASK_TOOL, DELEGATION_SYSTEM_PROMPT, DOWNLOAD_WAIT_DEFAULT_MS, DOWNLOAD_WAIT_MAX_MS, DOWNLOAD_WAIT_MIN_MS, type DataSourceAuditSink, type DataSourceCandidate, type DataSourceCandidateAuditSink, DataSourceCandidatePolicy, type DataSourceCandidatePolicyOptions, type DataSourceCandidateRecord, type DataSourceCandidateStore, type DataSourceDef, type DataSourceKind, DataSourcePolicy, type DataSourcePolicyOptions, type DataSourceProvenance, type DataSourceRecord, type DataSourceTransport, type DelegationBudget, DelegationOrchestrator, type DelegationOrchestratorOptions, type DelegationRequest, type DelegationResult, type DelegationToolSourceOptions, type DownloadedFileAction, type DownloadedFileConsent, type DownloadedFileEntry, type DownloadedFileListing, DownloadedFilePolicy, type DownloadedFilePolicyOptions, type DownloadedFileReadResult, type DownloadedFileReader, type DownloadedFileRecord, type DownloadedFileToolSourceOptions, FOCUS_PAGE_TAB_TOOL, type FrameNote, type FrameScope, GENERATE_SKILL_TOOL, type GeneratedSkillDraft, type HttpDataSourceOptions, type ImageCaptureBudget, LIST_DOWNLOADED_FILES_TOOL, LIST_PAGE_TABS_TOOL, MANAGE_TODO_TOOL, type NestedFrameRef, type OpenedPageInfo, type OpenedTabSignal, PAGE_ACTION_KINDS, PAGE_ACTION_SYSTEM_PROMPT, PAGE_ACTION_TOOL, PAGE_DOCUMENT_REF, PERCEIVE_PAGE_TOOL, PERCEPTION_PAGING_DEFAULTS, PERCEPTION_SYSTEM_PROMPT, type PageActionConsent, type PageActionExecutor, type PageActionKind, type PageActionOutcome, PageActionPolicy, type PageActionPolicyOptions, type PageActionRecord, type PageActionRequest, type PageActionScope, type PageActionScopeInput, type PageActionTarget, type PageActionToolSourceOptions, type PageActionUi, type PageAuditSink, PagePerceptionPolicy, type PagePerceptionPolicyOptions, type PagePerceptionReader, type PagePerceptionToolSourceOptions, type ParentBudget, type PerceivedImage, type PerceivedNode, type PerceptionAuditSink, type PerceptionCaptureOptions, type PerceptionPagingBudget, type PerceptionRecord, type PerceptionResult, type PerceptionScope, type PerceptionScopeInput, READ_DOWNLOADED_FILE_TOOL, SKILL_GENERATION_SYSTEM_PROMPT, type SkillCandidateSink, type SkillGenerationMessages, type SkillGenerationOutcome, type SkillGenerationPolicy, type SkillGenerationToolSourceOptions, SkillGenerator, type SkillGeneratorOptions, type SkillTraceEvidence, type SkillTraceEvidenceStep, type SubAgentRunInput, type SubAgentRunner, type SubtreeRejection, TAB_WORKSET_DEFAULT_MAX, TAB_WORKSET_MAX_MAX, TAB_WORKSET_MIN_MAX, TAB_WORKSET_SYSTEM_PROMPT, TODO_SYSTEM_PROMPT, type TabAdmission, TabWorksetPolicy, type TabWorksetPolicyOptions, type TabWorksetPort, type TabWorksetToolSourceOptions, type TodoEvent, type TodoItem, type TodoList, type TodoListener, type TodoStatus, TodoStore, type TodoToolSourceOptions, type WorksetTab, type WorksetTabView, clampDownloadWaitMs, clampWorksetMax, createDelegationToolSource, createDownloadedFileToolSource, createHttpDataSourceTransport, createPageActionToolSource, createPagePerceptionToolSource, createSkillGenerationToolSource, createTabWorksetToolSource, createTodoToolSource, frameLabel, frameSteps, toActionFrameScopes, toFrameScopes, withDelegationOrigin };
package/dist/agent.js CHANGED
@@ -3,7 +3,7 @@ import { b as parseSkillMarkdown, y as isValidSkillName } from "./skill-CAJMsLod
3
3
  import { t as assertRemoteUrlAllowed } from "./urlSafety-CiSuCJvX.js";
4
4
  import { c as formatAttachmentText, l as UNTRUSTED_LINE_LIMIT, o as XLSX_MIME, s as classifyAttachment, u as sanitizeUntrustedLine } from "./kind-DxgS8LM-.js";
5
5
  import { o as toBase64, s as DEFAULT_MAX_DATA_SOURCE_BYTES } from "./linkedDocument-xNXF-z8n.js";
6
- import { a as frameLabel, i as toFrameScopes, n as PAGE_DOCUMENT_REF, o as frameSteps, r as toActionFrameScopes, t as PAGE_ACTION_KINDS } from "./types-BuacBov_.js";
6
+ import { a as frameLabel, i as toFrameScopes, n as PAGE_DOCUMENT_REF, o as frameSteps, r as toActionFrameScopes, t as PAGE_ACTION_KINDS } from "./types-DOJI5YC3.js";
7
7
 
8
8
  //#region ../agent/src/todo/store.ts
9
9
  const STATUSES = [
@@ -1274,7 +1274,7 @@ const PERCEPTION_SYSTEM_PROMPT = [
1274
1274
  //#endregion
1275
1275
  //#region ../agent/src/perception/toolSource.ts
1276
1276
  const PERCEIVE_PAGE_TOOL = "perceive_page";
1277
- const DESCRIPTION$1 = "Read the parts of the current page the host made readable, as a structured accessibility outline. Read-only: it cannot click, type, submit, navigate or scroll.";
1277
+ const DESCRIPTION$1 = "Read the parts of the current page the host made readable, as a structured accessibility outline. Read-only: it cannot click, type, submit or navigate.";
1278
1278
  /**
1279
1279
  * 两个参数,且它们都扩不出一寸新范围(AC-10.8 的判据由 0.14.0 分册 22 §3 修订)。
1280
1280
  *
@@ -2000,7 +2000,7 @@ var PageActionPolicy = class {
2000
2000
  const where = target.frame === void 0 ? "on the page" : `in the embedded frame "${target.frame}"`;
2001
2001
  const scopeNote = target.elevated === true ? " This dialog is outside the usual allowlist; it was opened by this task." : "";
2002
2002
  const scopeLabel = rememberable ? this.#options.consent?.describeScope?.(target, request.action) : void 0;
2003
- const message = request.action === "back" ? `Allow the assistant to go back to the previous page${target.name === void 0 ? "" : ` on "${target.name}"`}?${scopeNote}` : `Allow the assistant to ${request.action} "${target.name ?? target.role}" ${where}?${scopeNote}`;
2003
+ const message = request.action === "back" ? `Allow the assistant to go back to the previous page${target.name === void 0 ? "" : ` on "${target.name}"`}?${scopeNote}` : request.action === "scroll" ? `Allow the assistant to scroll ${request.value === "up" ? "up" : "down"} the area around "${target.name ?? target.role}" ${where}?${scopeNote}` : `Allow the assistant to ${request.action} "${target.name ?? target.role}" ${where}?${scopeNote}`;
2004
2004
  const response = await this.#options.ui.request({
2005
2005
  type: "authorize",
2006
2006
  id: `page-action-${this.#seq}`,
@@ -2016,7 +2016,8 @@ var PageActionPolicy = class {
2016
2016
  },
2017
2017
  ...rememberable ? { rememberable: true } : {},
2018
2018
  ...scopeLabel !== void 0 ? { rememberLabel: scopeLabel } : {},
2019
- ...request.action === "fill" && request.value !== void 0 ? { value: target.secret === true ? "••••••" : request.value } : {}
2019
+ ...request.action === "fill" && request.value !== void 0 ? { value: target.secret === true ? "••••••" : request.value } : {},
2020
+ ...request.action === "scroll" ? { direction: request.value === "up" ? "up" : "down" } : {}
2020
2021
  }
2021
2022
  });
2022
2023
  if (response.cancelled === true || response.value === false) return false;
@@ -2046,6 +2047,10 @@ var PageActionPolicy = class {
2046
2047
  approved,
2047
2048
  ok: outcome.ok,
2048
2049
  ...request.action === "fill" && request.value !== void 0 && !secret ? { value: request.value } : {},
2050
+ ...request.action === "scroll" && outcome.scrolled !== void 0 ? { scrolled: {
2051
+ direction: request.value === "up" ? "up" : "down",
2052
+ ...outcome.scrolled
2053
+ } } : {},
2049
2054
  ...outcome.reason !== void 0 ? { reason: outcome.reason } : {}
2050
2055
  };
2051
2056
  this.#records = [record, ...this.#records].slice(0, 50);
@@ -2093,7 +2098,8 @@ const PAGE_ACTION_SYSTEM_PROMPT = [
2093
2098
  "Every action asks the user to confirm it first, so do not chain actions speculatively: act only when the user asked for something that requires it.",
2094
2099
  "A reference expires as soon as the page is perceived again; perceive first, then act.",
2095
2100
  "After an action, the result tells you where it led. \"openedTab\" means a new page opened — switch to it with focus_page_tab to read it. \"navigated\" means this page itself moved to a new address. \"elevatedModal\" means a dialog opened on this page. If none of the three appear, the page did not change.",
2096
- "Use the \"back\" action to return to the previous page in this page's history. It takes no \"ref\" and no \"value\", and it only affects the page you are currently on. After going back, always perceive_page again: every reference from before the action is dead."
2101
+ "Use the \"back\" action to return to the previous page in this page's history. It takes no \"ref\" and no \"value\", and it only affects the page you are currently on. After going back, always perceive_page again: every reference from before the action is dead.",
2102
+ "Use the \"scroll\" action only when the page itself says there is more than you can see (for example a list that says it has 20 rows but shows 13). Pass the \"ref\" of any element inside the region you want to scroll and a \"value\" of \"down\" or \"up\"; the region is found for you, so do not look for a reference to the scrollbar or the container. The result carries \"scrolled\": when \"atEnd\" is true there is nothing further in that direction — stop scrolling and answer with what you have. Perceive the page again after each scroll: rows that left the screen no longer exist and their references are dead."
2097
2103
  ].join("\n");
2098
2104
 
2099
2105
  //#endregion
@@ -2118,7 +2124,7 @@ const INPUT_SCHEMA = {
2118
2124
  },
2119
2125
  value: {
2120
2126
  type: "string",
2121
- description: "Text for \"fill\", the option name for \"select\", or \"true\"/\"false\" for \"set\""
2127
+ description: "Text for \"fill\", the option name for \"select\", \"true\"/\"false\" for \"set\", or \"down\"/\"up\" for \"scroll\""
2122
2128
  }
2123
2129
  },
2124
2130
  required: ["action"],
@@ -2209,6 +2215,7 @@ function createPageActionToolSource(options) {
2209
2215
  "select",
2210
2216
  "set"
2211
2217
  ].includes(action) && typeof value !== "string") return toolError$2("VALIDATION_FAILED", `act_on_page needs a "value" string when the action is "${action}".`);
2218
+ if (action === "scroll" && value !== "down" && value !== "up") return toolError$2("VALIDATION_FAILED", "act_on_page with \"scroll\" needs a \"value\" of \"down\" or \"up\".");
2212
2219
  return await run({
2213
2220
  ref,
2214
2221
  action,
@@ -2,7 +2,7 @@ import { n as messageOf, t as WebSkillError } from "./errors-BDZNpC13.js";
2
2
  import { b as parseSkillMarkdown, i as buildCatalog, n as SkillDiscovery, r as SkillReader } from "./skill-CAJMsLod.js";
3
3
  import { a as atomicWriteText, r as resolveInsideRoot, t as assertSafePathSegment } from "./pathSecurity-B1owvJAF.js";
4
4
  import { t as assertRemoteUrlAllowed } from "./urlSafety-CiSuCJvX.js";
5
- import { c as findUnpairedToolCalls, d as partsToText, f as promptText, l as interruptedToolResult, p as textParts, u as sealToolCallPairs } from "./llm-B7lLH0ZI.js";
5
+ import { c as findUnpairedToolCalls, d as partsToText, f as promptText, l as interruptedToolResult, p as textParts, u as sealToolCallPairs } from "./llm-eIQNO9tr.js";
6
6
  import { a as fromBase64, c as DEFAULT_MAX_DOCUMENT_BYTES, d as TEXT_BUDGETED_CONTENT_TYPES, i as UNSUPPORTED_DOCUMENT_MESSAGE, l as DEFAULT_MAX_DOCUMENT_TEXT_BYTES, n as READ_LINKED_DOCUMENT_TOOL_NAME, o as toBase64, r as SUPPORTED_DOCUMENT_MIME, t as READ_LINKED_DOCUMENT_TOOL } from "./linkedDocument-xNXF-z8n.js";
7
7
  import { t as mergeCatalogEntries } from "./external-_ZRQe-V9.js";
8
8
  import { i as isArtifactCardHidden, n as extractChartSpec, r as admitArtifactMetadata, t as buildRenderResult } from "./renderResult-D9Q-Vu2x.js";
@@ -657,6 +657,27 @@ function sampleBehaviorRecords(records, limits = DEFAULT_USER_PROFILE_LIMITS) {
657
657
  */
658
658
  const PLAIN_CHAT_SYSTEM_PROMPT = "You are a helpful assistant. Answer the user's question directly and concisely. You have no tools available; do not describe or simulate tool calls.";
659
659
 
660
+ //#endregion
661
+ //#region ../runtime/src/routing/currentTimePrompt.ts
662
+ /**
663
+ * 每个 run 注入的「现在几点」。
664
+ *
665
+ * 做成提示词而不是工具是有意的:模型不会为它**自以为知道**的事去调工具——
666
+ * 问「下月 1 日」时它直接拿训练截止日期算,或者反过来开一张表单问用户今天几号。
667
+ * 两种都不是缺一个工具,是缺一个事实。日期是上下文不是动作,每轮都要,代价又是零。
668
+ *
669
+ * 时区取运行环境的(`Intl` 在 Node 与浏览器都在),因为「下月 1 日」是按用户所在时区算的。
670
+ */
671
+ function renderCurrentTimePrompt(nowIso) {
672
+ const now = new Date(nowIso);
673
+ if (Number.isNaN(now.getTime())) return "";
674
+ const { timeZone } = Intl.DateTimeFormat().resolvedOptions();
675
+ return `Current date and time: ${new Intl.DateTimeFormat("en-US", {
676
+ dateStyle: "full",
677
+ timeStyle: "long"
678
+ }).format(now)} (time zone ${timeZone}, ISO ${now.toISOString()}).\nResolve every relative date the user mentions ("tomorrow", "next month", "in three days", "how long until this deadline") against this value, and do so silently. Never ask the user what today's date is.`;
679
+ }
680
+
660
681
  //#endregion
661
682
  //#region ../runtime/src/routing/onDemandToolsHint.ts
662
683
  /**
@@ -1289,11 +1310,11 @@ var AgentLoop = class {
1289
1310
  return false;
1290
1311
  }
1291
1312
  });
1292
- const systemPrompt = this.#config.toolCallingDisabled ? PLAIN_CHAT_SYSTEM_PROMPT : [
1313
+ const systemPrompt = [this.#config.toolCallingDisabled ? PLAIN_CHAT_SYSTEM_PROMPT : [
1293
1314
  route.systemPrompt,
1294
1315
  ...externalSystemPrompts,
1295
1316
  ...hasOnDemand ? [ON_DEMAND_TOOLS_HINT] : []
1296
- ].join("\n\n");
1317
+ ].join("\n\n"), renderCurrentTimePrompt(startedAt)].filter((part) => part !== "").join("\n\n");
1297
1318
  const profileMessage = await this.#userProfileMessage(state);
1298
1319
  state.messages = [
1299
1320
  {
package/dist/browser.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Ct as SkillsLockfile, Et as TrustedKeyStore, H as FileStat, Mt as WebSkillError, N as ArchiveLimits, S as UiBridge, U as FileSystemProvider, _t as SkillManifest, b as RenderResultRequest, c as InteractionResponse, jt as VerifyResult, kt as UnsignedPolicy, l as LlmClient, m as LlmStreamEvent, o as InteractionPolicy, p as LlmResponse, pt as SkillInstallSource, s as InteractionRequest, u as LlmCompleteInput, v as MemoryStore } from "./types-Btpdd1y--BcxQ10Fa.js";
2
2
  import { Kt as ScriptExecutionContext, M as DocumentSurfaceHost, R as ExternalSkillProvider, S as BridgeResponse, Un as WebSkillApi, Yn as bridgeError, ct as NetworkPolicy, gn as ToolDefinition, m as ApprovalScope, ot as LinkedDocumentReader, qt as ScriptExecutor, x as BridgeRequest, y as BridgeCapabilities, yn as ToolResult, yr as parseBridgeRequest, z as ExternalToolSource } from "./index-BDyXe-a5.js";
3
- import { $ as NestedFrameRef, Ct as PagePerceptionPolicy, It as PerceptionScopeInput, Pt as PerceptionResult, Tt as PagePerceptionReader, Xt as SubtreeRejection, ft as PageActionOutcome, gt as PageActionRequest, jt as PerceptionCaptureOptions, kt as PerceivedNode, ut as PageActionExecutor, vt as PageActionScopeInput, yt as PageActionTarget } from "./index-1sQZ4VBN.js";
3
+ import { $ as NestedFrameRef, Ct as PagePerceptionPolicy, It as PerceptionScopeInput, Pt as PerceptionResult, Tt as PagePerceptionReader, Xt as SubtreeRejection, ft as PageActionOutcome, gt as PageActionRequest, jt as PerceptionCaptureOptions, kt as PerceivedNode, ut as PageActionExecutor, vt as PageActionScopeInput, yt as PageActionTarget } from "./index-DQ3-6GFu.js";
4
4
  //#region ../browser/dist/index.d.ts
5
5
  //#region src/fs/featureDetection.d.ts
6
6
  /** 检测当前环境是否可用 OPFS(navigator.storage.getDirectory) */
@@ -146,6 +146,32 @@ declare function extractZipWeb(fs: FileSystemProvider, data: Uint8Array, destRoo
146
146
  /** WebCrypto sha256(浏览器/Worker 通用;Node 20+ 全局 crypto 同样可用) */
147
147
  declare function sha256HexWeb(data: Uint8Array | string): Promise<string>;
148
148
  //#endregion
149
+ //#region src/skillManagement/seedSkillsFromHttp.d.ts
150
+ /**
151
+ * 把随应用发布的内置技能(`public/skills/builtin/*`)抓进技能存储(0.19.0 分册 13)。
152
+ *
153
+ * 幂等靠 `stamp`:戳存在即整体跳过,一次请求都不发。每次刷新都重写会覆盖用户
154
+ * 对内置技能的改动;反过来,改了技能内容却不改戳,已经打开过应用的浏览器永远
155
+ * 拿不到新内容——戳的递增是接入方的责任(FR-13.1 / §4)。
156
+ */
157
+ /** 技能目录名 → 该技能的文件清单。HTTP 无法列目录,清单必须显式给出。 */
158
+ type BuiltinSkillManifest = Readonly<Record<string, readonly string[]>>;
159
+ interface SeedSkillsFromHttpOptions {
160
+ manifest: BuiltinSkillManifest;
161
+ /** 幂等戳的完整路径,例如 `/skills/builtin/.seeded-v6` */
162
+ stamp: string;
163
+ /** 应用的部署前缀(vite 的 `import.meta.env.BASE_URL`);缺省 `/` */
164
+ baseUrl?: string;
165
+ /** HTTP 侧的技能根,相对 `baseUrl`;缺省 `skills/builtin` */
166
+ sourceRoot?: string;
167
+ /** 存储侧的技能根;缺省 `/skills/builtin` */
168
+ targetRoot?: string;
169
+ /** 覆盖二进制扩展名名单(不含点号,小写) */
170
+ binaryExtensions?: readonly string[];
171
+ fetch?: typeof globalThis.fetch;
172
+ }
173
+ declare function seedSkillsFromHttp(fs: FileSystemProvider, options: SeedSkillsFromHttpOptions): Promise<void>;
174
+ //#endregion
149
175
  //#region src/executor/workerScriptExecutor.d.ts
150
176
  /** 主线程持有的 Worker 最小接口(vitest 可用 loopback 替身) */
151
177
  interface WorkerLike {
@@ -583,6 +609,14 @@ interface DomPageActionOptions {
583
609
  * 其余动作不用它——它们的文档从元素自带的 `ownerDocument` 取,跨帧时才不会拿错。
584
610
  */
585
611
  document?: Document;
612
+ /**
613
+ * 滚动后等待页面稳定的上限(毫秒,0.18.0 FR-10.6)。
614
+ * SDK 夹在 `SCROLL_SETTLE_BOUNDS` 之间;不注入即用缺省值。
615
+ *
616
+ * **模型无法影响它**:这是装配期参数,工具入参里没有任何相关字段。
617
+ * 重 ERP 的首屏渲染可能超过缺省上限,宿主据此上调。
618
+ */
619
+ scrollSettleMs?: () => number | undefined;
586
620
  }
587
621
  /**
588
622
  * @experimental
@@ -1588,4 +1622,4 @@ declare function watchBlockedResources(host: ViewerBlockedHost, notice: ViewerBl
1588
1622
  /** 提示文案的单一来源;判据直接引用,不各写一份字面量 */
1589
1623
  declare function blockedMessage(origins: readonly string[]): string;
1590
1624
  //#endregion
1591
- export { type BlockedEventLike, type BridgeCapabilities, type BridgeRequest, type BridgeResponse, type BrowserHostBundle, type BrowserHostOptions, type BrowserHostOverrides, BrowserSkillManager, BrowserWorkerScriptExecutor, type CameraAvailability, type CameraOptions, type CameraSession, type CaptureFailure, type CaptureLevel, type CapturePhotoOptions, type CapturedImage, type ChromeBuiltinAvailability, ChromeBuiltinLlmClient, type CompressResult, type ConfiguredLlmClient, DEFAULT_CAMERA_MAX_DIMENSION, DEFAULT_FRAME_BUDGET, DEFAULT_MAX_VIEWER_PAYLOAD_BYTES, DOCUMENT_SURFACE_AUDIT_EVENT, DOCX_UNEXTRACTED, type DictationAvailability, type DictationOptions, type DictationSession, type DocumentLocationView, type DocumentSurfaceAudit, type DocumentSurfaceOptions, type DomPageActionExecutor, type DomPageActionOptions, type DomPerceptionReader, type DomPerceptionReaderOptions, type FetchLinkedDocumentOptions, type FrameBudget, type FrameDelivery, type FrameDispatcher, type FrameResolveContext, type FrameRouter, type FrameRouterOptions, HOST_PORT_MATRIX, type HandleKind, type HostChatbotAdapterShape, type HostConnectFacadeShape, type HostConsoleBackendShape, type HostKind, type HostSurface, type IframeSandboxOptions, IframeWorkerLike, type InspectHostWiringInput, type LlmClientConfig, type LlmEntryConfig, type MainToWorkerMessage, type OpenDocumentInput, OpfsProvider, type PageAgentHandler, type PageAgentHandlerOptions, type PageAgentReply, type PageAgentRequest, type PageAgentTargetEntry, type PageAgentTransport, type PageDocumentIdentity, type PortApplicability, type PortReport, type PortSpec, type PortStatus, type RemotePageActionExecutorOptions, type RemotePerceptionReaderOptions, type RemoteTargetRegistry, type RemoteTargetRegistryOptions, type RoleHint, SANDBOX_PAGE_SCRIPT_SOURCE, SHARD_SOFT_LIMIT, type SandboxMode, type SerializedError, type TargetResolution, TsTranspiler, type TypeScriptSupportOptions, VIEWER_SANDBOX_TOKENS, type ViewerBlockedHost, type ViewerBlockedNotice, type ViewerBlockedResult, type ViewerCspOptions, type ViewerDocument, type ViewerShellHost, type ViewerShellMount, type ViewerShellResult, WORKER_BOOTSTRAP_SOURCE, type WindowLike, type WorkerEvent, type WorkerFactory, type WorkerLike, type WorkerRequest, WorkerRuntimeClient, type WorkerRuntimeClientDeps, type WorkerRuntimeHostOverrides, type WorkerScopeLike, WorkerUiBridge, XLSX_UNEXTRACTED, blockedMessage, bridgeError, captureElementImage, capturePhoto, checkCameraAvailability, checkDictationAvailability, compressImageToBudget, createBrowserChatbotHost, createDocumentSurfaceHost, createDomPageActionExecutor, createDomPerceptionReader, createEncryptedMemoryStore, createFetchLinkedDocumentReader, createFrameRouter, createIframeWorker, createLlmClient, createPageAgentHandler, createRemotePageActionExecutor, createRemotePerceptionReader, createRemoteTargetRegistry, deleteMemoryEncryptionKey, documentKey, explainResolution, extractDocxText, extractXlsxText, extractZipWeb, generateMemoryEncryptionKey, inspectHostWiring, installWebSkillNavigator, isCapturableElement, isCaptureFailure, isEncryptedMemoryValue, isOpfsAvailable, missingPorts, openCamera, openDocumentSurface, openMemoryEncryptionKey, parseBridgeRequest, parseMainMessage, parseWorkerEvent, probeChromeBuiltinAvailability, sha256HexWeb, startDictation, startViewerShell, startWorkerRuntimeHost, viewerCspHeader, watchBlockedResources };
1625
+ export { type BlockedEventLike, type BridgeCapabilities, type BridgeRequest, type BridgeResponse, type BrowserHostBundle, type BrowserHostOptions, type BrowserHostOverrides, BrowserSkillManager, BrowserWorkerScriptExecutor, type BuiltinSkillManifest, type CameraAvailability, type CameraOptions, type CameraSession, type CaptureFailure, type CaptureLevel, type CapturePhotoOptions, type CapturedImage, type ChromeBuiltinAvailability, ChromeBuiltinLlmClient, type CompressResult, type ConfiguredLlmClient, DEFAULT_CAMERA_MAX_DIMENSION, DEFAULT_FRAME_BUDGET, DEFAULT_MAX_VIEWER_PAYLOAD_BYTES, DOCUMENT_SURFACE_AUDIT_EVENT, DOCX_UNEXTRACTED, type DictationAvailability, type DictationOptions, type DictationSession, type DocumentLocationView, type DocumentSurfaceAudit, type DocumentSurfaceOptions, type DomPageActionExecutor, type DomPageActionOptions, type DomPerceptionReader, type DomPerceptionReaderOptions, type FetchLinkedDocumentOptions, type FrameBudget, type FrameDelivery, type FrameDispatcher, type FrameResolveContext, type FrameRouter, type FrameRouterOptions, HOST_PORT_MATRIX, type HandleKind, type HostChatbotAdapterShape, type HostConnectFacadeShape, type HostConsoleBackendShape, type HostKind, type HostSurface, type IframeSandboxOptions, IframeWorkerLike, type InspectHostWiringInput, type LlmClientConfig, type LlmEntryConfig, type MainToWorkerMessage, type OpenDocumentInput, OpfsProvider, type PageAgentHandler, type PageAgentHandlerOptions, type PageAgentReply, type PageAgentRequest, type PageAgentTargetEntry, type PageAgentTransport, type PageDocumentIdentity, type PortApplicability, type PortReport, type PortSpec, type PortStatus, type RemotePageActionExecutorOptions, type RemotePerceptionReaderOptions, type RemoteTargetRegistry, type RemoteTargetRegistryOptions, type RoleHint, SANDBOX_PAGE_SCRIPT_SOURCE, SHARD_SOFT_LIMIT, type SandboxMode, type SeedSkillsFromHttpOptions, type SerializedError, type TargetResolution, TsTranspiler, type TypeScriptSupportOptions, VIEWER_SANDBOX_TOKENS, type ViewerBlockedHost, type ViewerBlockedNotice, type ViewerBlockedResult, type ViewerCspOptions, type ViewerDocument, type ViewerShellHost, type ViewerShellMount, type ViewerShellResult, WORKER_BOOTSTRAP_SOURCE, type WindowLike, type WorkerEvent, type WorkerFactory, type WorkerLike, type WorkerRequest, WorkerRuntimeClient, type WorkerRuntimeClientDeps, type WorkerRuntimeHostOverrides, type WorkerScopeLike, WorkerUiBridge, XLSX_UNEXTRACTED, blockedMessage, bridgeError, captureElementImage, capturePhoto, checkCameraAvailability, checkDictationAvailability, compressImageToBudget, createBrowserChatbotHost, createDocumentSurfaceHost, createDomPageActionExecutor, createDomPerceptionReader, createEncryptedMemoryStore, createFetchLinkedDocumentReader, createFrameRouter, createIframeWorker, createLlmClient, createPageAgentHandler, createRemotePageActionExecutor, createRemotePerceptionReader, createRemoteTargetRegistry, deleteMemoryEncryptionKey, documentKey, explainResolution, extractDocxText, extractXlsxText, extractZipWeb, generateMemoryEncryptionKey, inspectHostWiring, installWebSkillNavigator, isCapturableElement, isCaptureFailure, isEncryptedMemoryValue, isOpfsAvailable, missingPorts, openCamera, openDocumentSurface, openMemoryEncryptionKey, parseBridgeRequest, parseMainMessage, parseWorkerEvent, probeChromeBuiltinAvailability, seedSkillsFromHttp, sha256HexWeb, startDictation, startViewerShell, startWorkerRuntimeHost, viewerCspHeader, watchBlockedResources };
package/dist/browser.js CHANGED
@@ -2,11 +2,11 @@ import { n as messageOf, t as WebSkillError } from "./errors-BDZNpC13.js";
2
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, i as buildCatalog, k as SKILLS_LOCKFILE, m as parseSkillPackManifest, n as SkillDiscovery, o as readResponseWithLimit, p as exportSkills, t as validateSkills, u as detectSkillArchiveShapeFromFs, w as readSkillSignature, y as isValidSkillName } from "./skill-CAJMsLod.js";
3
3
  import { a as atomicWriteText, o as isAtomicTempPath, r as resolveInsideRoot } from "./pathSecurity-B1owvJAF.js";
4
4
  import { t as assertRemoteUrlAllowed } from "./urlSafety-CiSuCJvX.js";
5
- import { a as networkPolicyLibSource, c as bridgeError, d as FsMemoryStore, g as FsRunSnapshotStore, l as parseBridgeRequest, nt as ProgressiveRouter, p as AgentLoop, r as normalizeToolError, s as UPLOAD_FILES_UNAVAILABLE, t as CapabilityApproval, u as FsArtifactStore } from "./approval-CBPnGPIm.js";
6
- import { a as GoogleGenAiClient, o as AnthropicClient, s as OpenAiCompatibleClient, t as MockLlmClient } from "./llm-B7lLH0ZI.js";
5
+ import { a as networkPolicyLibSource, c as bridgeError, d as FsMemoryStore, g as FsRunSnapshotStore, l as parseBridgeRequest, nt as ProgressiveRouter, p as AgentLoop, r as normalizeToolError, s as UPLOAD_FILES_UNAVAILABLE, t as CapabilityApproval, u as FsArtifactStore } from "./approval-Bbh_Apwg.js";
6
+ import { a as GoogleGenAiClient, o as AnthropicClient, s as OpenAiCompatibleClient, t as MockLlmClient } from "./llm-eIQNO9tr.js";
7
7
  import { n as normalizeToolContent, t as mergeCatalogEntries } from "./external-_ZRQe-V9.js";
8
- import { t as createWebSkillApi } from "./webSkillApi-Ce2OO5S5.js";
9
- import { a as frameLabel, i as toFrameScopes, o as frameSteps, r as toActionFrameScopes } from "./types-BuacBov_.js";
8
+ import { t as createWebSkillApi } from "./webSkillApi-CsvA69qk.js";
9
+ import { a as frameLabel, i as toFrameScopes, o as frameSteps, r as toActionFrameScopes } from "./types-DOJI5YC3.js";
10
10
 
11
11
  //#region ../browser/src/fs/featureDetection.ts
12
12
  /** 检测当前环境是否可用 OPFS(navigator.storage.getDirectory) */
@@ -927,6 +927,72 @@ var BrowserSkillManager = class {
927
927
  }
928
928
  };
929
929
 
930
+ //#endregion
931
+ //#region ../browser/src/skillManagement/seedSkillsFromHttp.ts
932
+ /** 按扩展名走 `writeBinary` 的默认名单(FR-13.2) */
933
+ const DEFAULT_BINARY_EXTENSIONS = [
934
+ "png",
935
+ "jpg",
936
+ "jpeg",
937
+ "gif",
938
+ "webp",
939
+ "ico",
940
+ "woff",
941
+ "woff2",
942
+ "ttf",
943
+ "otf",
944
+ "pdf"
945
+ ];
946
+ const trimTrailingSlash = (value) => value.replace(/\/+$/, "");
947
+ const joinUrl = (baseUrl, path) => `${baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`}${path.replace(/^\/+/, "")}`;
948
+ const extensionOf = (file) => {
949
+ const dot = file.lastIndexOf(".");
950
+ return dot === -1 ? "" : file.slice(dot + 1).toLowerCase();
951
+ };
952
+ /**
953
+ * 清掉上一版留在存储里、这一版清单已不再包含的文件。
954
+ * 只照清单重抓不够:删掉的脚本会以旧内容继续注册成工具,而 SKILL.md 已经不再提它,
955
+ * 模型拿到的是一份自相矛盾的技能。作用域严格限定在本技能目录内(FR-13.4)。
956
+ */
957
+ async function pruneStaleFiles(fs, skillRoot, files) {
958
+ const keep = new Set(files);
959
+ const walk = async (dir, prefix) => {
960
+ for (const entry of await fs.list(dir).catch(() => [])) {
961
+ const name = entry.path.slice(entry.path.lastIndexOf("/") + 1);
962
+ const rel = prefix === "" ? name : `${prefix}/${name}`;
963
+ if (entry.type === "directory") await walk(`${dir}/${name}`, rel);
964
+ else if (!keep.has(rel)) await fs.remove(`${dir}/${name}`).catch(() => void 0);
965
+ }
966
+ };
967
+ await walk(skillRoot, "");
968
+ }
969
+ async function seedSkillsFromHttp(fs, options) {
970
+ if (await fs.exists(options.stamp)) return;
971
+ const baseUrl = options.baseUrl ?? "/";
972
+ const sourceRoot = trimTrailingSlash(options.sourceRoot ?? "skills/builtin");
973
+ const targetRoot = trimTrailingSlash(options.targetRoot ?? "/skills/builtin");
974
+ const binary = new Set(options.binaryExtensions ?? DEFAULT_BINARY_EXTENSIONS);
975
+ const fetchImpl = options.fetch ?? globalThis.fetch;
976
+ for (const [skill, files] of Object.entries(options.manifest)) {
977
+ const skillRoot = `${targetRoot}/${skill}`;
978
+ await fs.mkdir(skillRoot).catch(() => void 0);
979
+ for (const file of files) {
980
+ const url = joinUrl(baseUrl, `${sourceRoot}/${skill}/${file}`);
981
+ const response = await fetchImpl(url);
982
+ if (!response.ok) throw new Error(`Builtin skill asset missing: ${url} (HTTP ${response.status})`);
983
+ if (binary.has(extensionOf(file))) {
984
+ await fs.writeBinary(`${skillRoot}/${file}`, new Uint8Array(await response.arrayBuffer()));
985
+ continue;
986
+ }
987
+ const text = await response.text();
988
+ if (file === "SKILL.md" && !text.startsWith("---")) throw new Error(`Builtin skill asset is not a SKILL.md contract: ${url}`);
989
+ await fs.writeText(`${skillRoot}/${file}`, text);
990
+ }
991
+ await pruneStaleFiles(fs, skillRoot, files);
992
+ }
993
+ await fs.writeText(options.stamp, (/* @__PURE__ */ new Date()).toISOString());
994
+ }
995
+
930
996
  //#endregion
931
997
  //#region ../browser/src/executor/iframeSandbox.ts
932
998
  const ENVELOPE = "__webskill_sandbox__";
@@ -3198,6 +3264,31 @@ function documentKey(view) {
3198
3264
  //#endregion
3199
3265
  //#region ../browser/src/dom/pageAction.ts
3200
3266
  const FILLABLE_TAGS = /* @__PURE__ */ new Set(["INPUT", "TEXTAREA"]);
3267
+ /**
3268
+ * 滚动稳定化的等待边界(毫秒);宿主注入值被夹在这之间。
3269
+ * 刻意**不导出**:本册只登记了一处新增公开契约(`scrollSettleMs`),
3270
+ * 多导出一个常量就是多一处要维护的公开面,而宿主注入超界值本来就会被夹住。
3271
+ */
3272
+ const SCROLL_SETTLE_BOUNDS = {
3273
+ min: 300,
3274
+ max: 5e3,
3275
+ default: 800
3276
+ };
3277
+ /**
3278
+ * 滚动后等待渲染的两个时长。
3279
+ *
3280
+ * 只有「静默窗口」是不够的,而且这里的顺序容易搞反:虚拟列表在 `scroll` 事件后要经过
3281
+ * 一次 rAF、甚至一段节流才**开始**重渲染,那之前观察器一直是静默的。
3282
+ * 若把「一直没动静」直接判成「渲染完了」,就会在渲染开始之前返回,读到滚动前的旧行——
3283
+ * 而且页面越慢越容易中招,正好是最需要滚动的那类页面。
3284
+ *
3285
+ * 所以两段分开:**还没见过任何变更**时按「等首次变更」的宽限期算,
3286
+ * 见过之后才按静默窗口算。宽限期取 250ms 是为了盖住常见的 100ms 节流加一帧渲染。
3287
+ */
3288
+ const SCROLL_SETTLE_FIRST_CHANGE_MS = 250;
3289
+ const SCROLL_SETTLE_QUIET_MS = 80;
3290
+ /** 两屏之间的重叠身位(像素)。必须大于 0,否则横跨视口边界的那一行会在两次感知之间消失 */
3291
+ const SCROLL_OVERLAP_PX = 64;
3201
3292
  /** 只看显式声明,不看尺寸:jsdom 有 getComputedStyle 但没有布局 */
3202
3293
  function hidden(element) {
3203
3294
  if (element.hasAttribute("hidden")) return true;
@@ -3445,6 +3536,75 @@ function attachFiles(input, files) {
3445
3536
  input.dispatchEvent(new Event("input", { bubbles: true }));
3446
3537
  input.dispatchEvent(new Event("change", { bubbles: true }));
3447
3538
  }
3539
+ const scrolls = (overflow) => overflow === "auto" || overflow === "scroll" || overflow === "overlay";
3540
+ /**
3541
+ * 滚动落点(FR-10.3):从被指认元素**自身**起沿祖先链上溯,取第一个真正能滚的容器。
3542
+ *
3543
+ * 判据是两个条件的**合取**,第二个不能省:现代布局里 `overflow-y: auto` 的祖先
3544
+ * 常有好几层(卡片、面板、栅格),其中绝大多数内容并没有溢出。只看 overflow 会命中
3545
+ * 最近的那个 `auto`,往它的 `scrollTop` 写值没有任何效果——表现是操作报成功、
3546
+ * 页面没动、也没有新行,即向模型报了一次假成功。
3547
+ *
3548
+ * 判据里不含任何组件库特征(class 名、data 属性、组件实例):这是「通用」二字的判据。
3549
+ *
3550
+ * 根滚动容器单独兜底而不是靠链上命中:`documentElement` 的 `overflow-y` 计算值
3551
+ * 通常是 `visible`(滚动被传播到视口),不会被上面的判据命中,但文档确实可滚。
3552
+ * 顺序必须是先链后兜底——嵌套场景下先命中的必须是内层列表。
3553
+ */
3554
+ function scrollTargetOf(element) {
3555
+ const doc = element.ownerDocument;
3556
+ const view = doc.defaultView;
3557
+ if (view === null) return void 0;
3558
+ for (let node = element; node !== null; node = node.parentElement) {
3559
+ const style = view.getComputedStyle(node);
3560
+ if (scrolls(style.overflowY) && node.scrollHeight > node.clientHeight) return {
3561
+ container: node,
3562
+ isRoot: false
3563
+ };
3564
+ }
3565
+ const root = doc.scrollingElement ?? doc.documentElement;
3566
+ if (root !== null && root.scrollHeight > root.clientHeight) return {
3567
+ container: root,
3568
+ isRoot: true
3569
+ };
3570
+ }
3571
+ function clampScrollSettleMs(value) {
3572
+ if (typeof value !== "number" || !Number.isFinite(value)) return SCROLL_SETTLE_BOUNDS.default;
3573
+ return Math.min(Math.max(Math.round(value), SCROLL_SETTLE_BOUNDS.min), SCROLL_SETTLE_BOUNDS.max);
3574
+ }
3575
+ /**
3576
+ * 等落点容器的子树安静下来(FR-10.6)。
3577
+ *
3578
+ * 观察器必须在**写 `scrollTop` 之前**挂上:写值到第一次变更之间不能有空档,
3579
+ * 否则渲染快的页面会在挂上观察器之前就完成变更,然后被静默窗口判成「没动静」。
3580
+ *
3581
+ * 只观察落点子树,不观察整个文档:ERP 页面上到处是无关的轮询与徽标刷新,
3582
+ * 观察全文档等于永远等不到静默。
3583
+ */
3584
+ function watchQuiescence(container) {
3585
+ const Observer = container.ownerDocument.defaultView?.MutationObserver;
3586
+ let lastChange;
3587
+ const observer = Observer === void 0 ? void 0 : new Observer(() => lastChange = Date.now());
3588
+ observer?.observe(container, {
3589
+ childList: true,
3590
+ subtree: true
3591
+ });
3592
+ return { settle: async (budgetMs) => {
3593
+ const started = Date.now();
3594
+ try {
3595
+ for (;;) {
3596
+ await new Promise((resolve) => setTimeout(resolve, 20));
3597
+ const now = Date.now();
3598
+ if (now - started >= budgetMs) return;
3599
+ if (lastChange === void 0) {
3600
+ if (now - started >= SCROLL_SETTLE_FIRST_CHANGE_MS) return;
3601
+ } else if (now - lastChange >= SCROLL_SETTLE_QUIET_MS) return;
3602
+ }
3603
+ } finally {
3604
+ observer?.disconnect();
3605
+ }
3606
+ } };
3607
+ }
3448
3608
  /** @experimental */
3449
3609
  function createDomPageActionExecutor(options) {
3450
3610
  const { reader } = options;
@@ -3501,6 +3661,40 @@ function createDomPageActionExecutor(options) {
3501
3661
  documentUrl: view.location.href
3502
3662
  };
3503
3663
  };
3664
+ /**
3665
+ * 滚动一屏(0.18.0 分册 10)。
3666
+ *
3667
+ * 不走 `done()`:滚动不会导航、也不会打开模态,套那段等待只是白等一个预算。
3668
+ * 稳定化是滚动自己的收尾,见 `watchQuiescence`。
3669
+ */
3670
+ const scrollRegion = async (element, target, direction) => {
3671
+ const found = scrollTargetOf(element);
3672
+ if (found === void 0) return {
3673
+ ok: false,
3674
+ target,
3675
+ reason: "This area cannot be scrolled: nothing around this element has a scrollable region."
3676
+ };
3677
+ const { container, isRoot } = found;
3678
+ if (!isRoot && !reader.inActionScope(container)) return {
3679
+ ok: false,
3680
+ target,
3681
+ reason: "The scrollable region around this element is outside the actionable scope."
3682
+ };
3683
+ const step = Math.max(container.clientHeight - SCROLL_OVERLAP_PX, Math.round(container.clientHeight / 2), 1);
3684
+ const before = container.scrollTop;
3685
+ const watch = watchQuiescence(container);
3686
+ container.scrollTop = direction === "down" ? before + step : before - step;
3687
+ await watch.settle(clampScrollSettleMs(options.scrollSettleMs?.()));
3688
+ const after = container.scrollTop;
3689
+ return {
3690
+ ok: true,
3691
+ target,
3692
+ scrolled: {
3693
+ atEnd: direction === "down" ? after >= container.scrollHeight - container.clientHeight - 1 : after <= 0,
3694
+ movedBy: Math.abs(after - before)
3695
+ }
3696
+ };
3697
+ };
3504
3698
  const execute = async (request) => {
3505
3699
  if (request.action === "back") return await goBack();
3506
3700
  const element = reader.resolve(request.ref);
@@ -3571,6 +3765,10 @@ function createDomPageActionExecutor(options) {
3571
3765
  };
3572
3766
  }
3573
3767
  if (request.action === "set") return await done(setToggle(element, request.value ?? "", target));
3768
+ if (request.action === "scroll") {
3769
+ if (request.value !== "down" && request.value !== "up") return fail("Use \"down\" or \"up\".");
3770
+ return await scrollRegion(element, target, request.value);
3771
+ }
3574
3772
  if (request.action === "attach") {
3575
3773
  const files = await options.pickFiles?.();
3576
3774
  if (files === void 0 || files.length === 0) return {
@@ -5591,4 +5789,4 @@ function originOf(blockedURI) {
5591
5789
  }
5592
5790
 
5593
5791
  //#endregion
5594
- export { BrowserSkillManager, BrowserWorkerScriptExecutor, ChromeBuiltinLlmClient, DEFAULT_CAMERA_MAX_DIMENSION, DEFAULT_FRAME_BUDGET, DEFAULT_MAX_VIEWER_PAYLOAD_BYTES, DOCUMENT_SURFACE_AUDIT_EVENT, DOCX_UNEXTRACTED, HOST_PORT_MATRIX, IframeWorkerLike, OpfsProvider, SANDBOX_PAGE_SCRIPT_SOURCE, SHARD_SOFT_LIMIT, TsTranspiler, VIEWER_SANDBOX_TOKENS, WORKER_BOOTSTRAP_SOURCE, WorkerRuntimeClient, WorkerUiBridge, XLSX_UNEXTRACTED, blockedMessage, bridgeError, captureElementImage, capturePhoto, checkCameraAvailability, checkDictationAvailability, compressImageToBudget, createBrowserChatbotHost, createDocumentSurfaceHost, createDomPageActionExecutor, createDomPerceptionReader, createEncryptedMemoryStore, createFetchLinkedDocumentReader, createFrameRouter, createIframeWorker, createLlmClient, createPageAgentHandler, createRemotePageActionExecutor, createRemotePerceptionReader, createRemoteTargetRegistry, deleteMemoryEncryptionKey, documentKey, explainResolution, extractDocxText, extractXlsxText, extractZipWeb, generateMemoryEncryptionKey, inspectHostWiring, installWebSkillNavigator, isCapturableElement, isCaptureFailure, isEncryptedMemoryValue, isOpfsAvailable, missingPorts, openCamera, openDocumentSurface, openMemoryEncryptionKey, parseBridgeRequest, parseMainMessage, parseWorkerEvent, probeChromeBuiltinAvailability, sha256HexWeb, startDictation, startViewerShell, startWorkerRuntimeHost, viewerCspHeader, watchBlockedResources };
5792
+ export { BrowserSkillManager, BrowserWorkerScriptExecutor, ChromeBuiltinLlmClient, DEFAULT_CAMERA_MAX_DIMENSION, DEFAULT_FRAME_BUDGET, DEFAULT_MAX_VIEWER_PAYLOAD_BYTES, DOCUMENT_SURFACE_AUDIT_EVENT, DOCX_UNEXTRACTED, HOST_PORT_MATRIX, IframeWorkerLike, OpfsProvider, SANDBOX_PAGE_SCRIPT_SOURCE, SHARD_SOFT_LIMIT, TsTranspiler, VIEWER_SANDBOX_TOKENS, WORKER_BOOTSTRAP_SOURCE, WorkerRuntimeClient, WorkerUiBridge, XLSX_UNEXTRACTED, blockedMessage, bridgeError, captureElementImage, capturePhoto, checkCameraAvailability, checkDictationAvailability, compressImageToBudget, createBrowserChatbotHost, createDocumentSurfaceHost, createDomPageActionExecutor, createDomPerceptionReader, createEncryptedMemoryStore, createFetchLinkedDocumentReader, createFrameRouter, createIframeWorker, createLlmClient, createPageAgentHandler, createRemotePageActionExecutor, createRemotePerceptionReader, createRemoteTargetRegistry, deleteMemoryEncryptionKey, documentKey, explainResolution, extractDocxText, extractXlsxText, extractZipWeb, generateMemoryEncryptionKey, inspectHostWiring, installWebSkillNavigator, isCapturableElement, isCaptureFailure, isEncryptedMemoryValue, isOpfsAvailable, missingPorts, openCamera, openDocumentSurface, openMemoryEncryptionKey, parseBridgeRequest, parseMainMessage, parseWorkerEvent, probeChromeBuiltinAvailability, seedSkillsFromHttp, sha256HexWeb, startDictation, startViewerShell, startWorkerRuntimeHost, viewerCspHeader, watchBlockedResources };
@@ -1,7 +1,7 @@
1
1
  import { n as messageOf, t as WebSkillError } from "./errors-BDZNpC13.js";
2
2
  import { y as isValidSkillName } from "./skill-CAJMsLod.js";
3
3
  import { a as atomicWriteText, t as assertSafePathSegment } from "./pathSecurity-B1owvJAF.js";
4
- import { d as partsToText, p as textParts } from "./llm-B7lLH0ZI.js";
4
+ import { d as partsToText, p as textParts } from "./llm-eIQNO9tr.js";
5
5
  import { n as AUDIT_EVENT_TYPE_LIST, t as AUDIT_EVENT_TYPES } from "./eventTypes-CwciaqCU.js";
6
6
 
7
7
  //#region ../governance/src/candidate/candidateNormalizer.ts
@@ -1119,15 +1119,15 @@ type PageActionScopeInput = PageActionScope | {
1119
1119
  */
1120
1120
  declare function toActionFrameScopes(scope: PageActionScopeInput): readonly ActionFrameScope[];
1121
1121
  /**
1122
- * 本版的操作集(FR-25.1 / 0.16.0 FR-13.6)。拖拽、滚动仍不在内;
1122
+ * 本版的操作集(FR-25.1 / 0.16.0 FR-13.6 / 0.18.0 FR-10.1)。拖拽仍不在内(D64);
1123
1123
  * 导航只有 `back` 一个,且它**不接受地址**——可达面被浏览器历史封死(SC-1)。
1124
1124
  *
1125
- * `select`/`set`/`attach` 与既有三个走**同一条** policy 路径,
1125
+ * `select`/`set`/`attach`/`scroll` 与既有几个走**同一条** policy 路径,
1126
1126
  * 范围白名单、逐次确认、审计三条硬约束因此天然覆盖到它们——
1127
- * 前提是新动作不绕过 policy 直接调执行器(AC-25.4 守这一点)。
1127
+ * 前提是新动作不绕过 policy 直调执行器(AC-25.4 守这一点)。
1128
1128
  * @experimental
1129
1129
  */
1130
- declare const PAGE_ACTION_KINDS: readonly ["click", "fill", "submit", "select", "set", "attach", "back"];
1130
+ declare const PAGE_ACTION_KINDS: readonly ["click", "fill", "submit", "select", "set", "attach", "scroll", "back"];
1131
1131
  type PageActionKind = (typeof PAGE_ACTION_KINDS)[number];
1132
1132
  /**
1133
1133
  * `back` 的目标占位(0.16.0 分册 13 §4.1)。
@@ -1145,8 +1145,8 @@ interface PageActionRequest {
1145
1145
  action: PageActionKind;
1146
1146
  /**
1147
1147
  * `fill` 填入的文本;`select` 要选中的选项可访问名;
1148
- * `set` 的目标态(`'true'` | `'false'`)。`attach` 不用它——
1149
- * 文件**始终由用户在确认卡里选**,Agent 传不进本地路径(FR-25.5)。
1148
+ * `set` 的目标态(`'true'` | `'false'`);`scroll` 的方向(`'down'` | `'up'`)。
1149
+ * `attach` 不用它——文件**始终由用户在确认卡里选**,Agent 传不进本地路径(FR-25.5)。
1150
1150
  */
1151
1151
  value?: string;
1152
1152
  }
@@ -1197,6 +1197,17 @@ interface PageActionOutcome {
1197
1197
  * 带 `admitted: false` 即开出来了但没接进来(例如工作集触顶)。
1198
1198
  */
1199
1199
  openedTab?: OpenedTabSignal;
1200
+ /**
1201
+ * 本次滚动的位移与边界状态(0.18.0 分册 10 · FR-10.7)。
1202
+ * 非 `scroll` 动作**不带**该字段,与 `navigated` 同口径。
1203
+ *
1204
+ * 两个值都在**稳定化之后**回读:虚拟列表加载新行会改变 `scrollHeight`,
1205
+ * 用滚动前的值算 `atEnd` 会提前报到底,模型于是停在半路。
1206
+ */
1207
+ scrolled?: {
1208
+ atEnd: boolean;
1209
+ movedBy: number;
1210
+ };
1200
1211
  /** 失败原因(英文) */
1201
1212
  reason?: string;
1202
1213
  }
@@ -1247,6 +1258,16 @@ interface PageActionRecord {
1247
1258
  noop?: boolean;
1248
1259
  /** 非密码类控件填入的值;密码类控件**整个字段不存在** */
1249
1260
  value?: string;
1261
+ /**
1262
+ * 本次滚动的方向与实际位移(0.18.0 FR-10.8);非 `scroll` 动作不带。
1263
+ * 位移要进留痕:只记「滚了」而不记「滚了多少」,事后分不出
1264
+ * 「滚到底了」与「根本没滚动」。
1265
+ */
1266
+ scrolled?: {
1267
+ direction: 'down' | 'up';
1268
+ movedBy: number;
1269
+ atEnd: boolean;
1270
+ };
1250
1271
  reason?: string;
1251
1272
  }
1252
1273
  //#endregion
@@ -82,6 +82,8 @@ interface SurfaceFormTexts {
82
82
  useSuggestion: string;
83
83
  /** `OpenDocument` 按钮的缺省文案(0.15.0 分册 13;技能的 `props.label` 优先) */
84
84
  openDocument: string;
85
+ /** select / multi-select 拿到空选项时的说明(代替一个点不动的空下拉) */
86
+ noOptions: string;
85
87
  }
86
88
  /** 可复用的部分取自 DEFAULT_INTERACTION_TEXTS,不另抄一份(AC-G10) */
87
89
  declare const DEFAULT_SURFACE_FORM_TEXTS: SurfaceFormTexts;
@@ -620,6 +622,18 @@ declare function normalizeColumnWidths(raw: readonly number[] | undefined, colum
620
622
  */
621
623
  declare function resolveColumnWidths(weights: readonly number[], available: number, minWidth: number): number[];
622
624
  //#endregion
625
+ //#region src/catalog/fieldOptions.d.ts
626
+ interface FieldOption {
627
+ label: string;
628
+ value: string | number;
629
+ }
630
+ /**
631
+ * 模型给出的选项形状五花八门:裸标量(`['January', 'February']`)、只有 `label`、
632
+ * 只有 `value`。整项丢掉的代价是下拉变空,必填字段再也交不出去,
633
+ * 所以能补的一律补齐;补不出标签的(既无 label 又无 value)才丢。
634
+ */
635
+ declare function normalizeFieldOptions(raw: unknown): FieldOption[];
636
+ //#endregion
623
637
  //#region src/catalog/presets.d.ts
624
638
  /** 场景预设名(FR-6.4) */
625
639
  type UiPresetName = 'charts' | 'cards' | 'dashboards' | 'slides' | 'reports';
@@ -969,4 +983,4 @@ interface LoadedOpenUiPeers {
969
983
  */
970
984
  declare function loadOpenUiPeers(): Promise<LoadedOpenUiPeers>;
971
985
  //#endregion
972
- export { UiActionDef as $, qualifyFieldName as $t, EvaluateFieldConditionOptions as A, buildA2uiCatalogDefinition as At, OpenUiRendererProps as B, evaluateFieldCondition as Bt, DEFAULT_INTERACTION_TEXTS as C, WEBSKILL_STYLES_CSS as Ct, DOCUMENT_COMPONENTS as D, a2uiComponentSchema as Dt, DESCRIBE_UI_PRESET_TOOL as E, ZodRuntime as Et, InteractionTexts as F, collectSpecActions as Ft, SPEC_TABLE_MIN_COLUMN_WIDTH as G, gaugePercent as Gt, PLANNED_INCREMENT as H, fromA2uiSurfaceAction as Ht, JsonRenderSpec as I, collectValues as It, SurfaceHostControlTexts as J, loadOpenUiPeers as Jt, SpecColumnMeta as K, interactionToFormModel as Kt, LoadedOpenUiPeers as L, createUiCatalogToolSource as Lt, FieldConditionResult as M, chartToTable as Mt, FormModel as N, collectFormScopes as Nt, DocumentComponentName as O, a2uiComponentShapes as Ot, InteractionSpecLabels as P, collectScopedValues as Pt, UI_PRESET_NAMES as Q, normalizeColumnWidths as Qt, MAX_CONDITION_DEPTH as R, defineUiCatalog as Rt, DEFAULT_CHART_FONT_SIZES as S, WEBSKILL_A2UI_CATALOG_ID as St, DEFAULT_SURFACE_HOST_CONTROL_TEXTS as T, WebFormBridge as Tt, RENDER_UI_TOOL as U, fromUiSurfaceActionDispatch as Ut, OpenUiRuntime as V, fromA2uiSpecAction as Vt, SPEC_TABLE_MIN_COLUMN_VAR as W, fromVercelToolResult as Wt, UI_CATALOG_PROMPT_BUDGET_BYTES as X, mountEchart as Xt, UI_CATALOG_GROUPS as Y, loadWebSkillLitCatalog as Yt, UI_PRESETS as Z, mountViewerComponents as Zt, CHART_PALETTE as _, uiCatalog as _n, VIEWER_PROPS_ATTR as _t, A2UI_SURFACE_ACTION as a, resolveColumnWidths as an, UiFormScope as at, ColumnWidthsRejection as b, ViewerComponentsHandle as bt, A2uiCatalogDefinition as c, resolveSurfaceHostControlTexts as cn, UiSpecDegradation as ct, A2uiMessage as d, toA2uiSurfaceAction as dn, UiSpecSanitization as dt, renderBlocks as en, UiCatalog as et, A2uiSpecActionEvent as f, toEchartsOption as fn, UiSpecValidation as ft, CATALOG_SCHEMA_MAX as g, toVercelToolInvocation as gn, VIEWER_FALLBACK_ATTR as gt, CATALOG_PROMPT_MAX as h, toUiSurfaceActionDispatch as hn, VIEWER_COMPONENT_ATTR as ht, A2UI_SPEC_FORM_PATH as i, resolveChartFontSizes as in, UiComponentDef as it, FieldCondition as j, chartSpecFromProps as jt, EchartHandle as k, applySuggestion as kt, A2uiCatalogHandle as l, shapeInteractionValue as ln, UiSpecDegradationCode as lt, CATALOG_BUDGET_STAGE as m, toOpenUiSpecLang as mn, VERCEL_INTERACTION_TOOL_NAME as mt, A2UI_COMMON_TYPES as n, renderMiniMarkdown as nn, UiCatalogPromptOptions as nt, A2UI_VERSION as o, resolveInteractionTexts as on, UiPreset as ot, A2uiSpecMessageOptions as p, toJsonRenderSpec as pn, UiSurfaceActionDispatch as pt, SurfaceFormTexts as q, interactionToUiSpec as qt, A2UI_SPEC_ACTION as r, renderRenderResult as rn, UiCatalogToolSourceOptions as rt, A2uiCatalogComponent as s, resolveSurfaceFormTexts as sn, UiPresetName as st, A2UI_BASIC_CATALOG_ID as t, renderMiniChart as tn, UiCatalogInput as tt, A2uiComponentShape as u, toA2uiSpecMessages as un, UiSpecIssue as ut, ChartFontSizes as v, uiPreset as vn, VercelToolInvocation as vt, DEFAULT_SURFACE_FORM_TEXTS as w, WEBSKILL_SURFACE_ACTION as wt, ControlModel as x, ViewerComponentsOptions as xt, CollectedValues as y, VercelUiBridge as yt, NormalizedColumnWidths as z, ensureStyles as zt };
986
+ export { UI_PRESET_NAMES as $, normalizeColumnWidths as $t, EvaluateFieldConditionOptions as A, applySuggestion as At, NormalizedColumnWidths as B, ensureStyles as Bt, DEFAULT_INTERACTION_TEXTS as C, WEBSKILL_A2UI_CATALOG_ID as Ct, DOCUMENT_COMPONENTS as D, ZodRuntime as Dt, DESCRIBE_UI_PRESET_TOOL as E, WebFormBridge as Et, InteractionSpecLabels as F, collectScopedValues as Ft, SPEC_TABLE_MIN_COLUMN_VAR as G, fromVercelToolResult as Gt, OpenUiRuntime as H, fromA2uiSpecAction as Ht, InteractionTexts as I, collectSpecActions as It, SurfaceFormTexts as J, interactionToUiSpec as Jt, SPEC_TABLE_MIN_COLUMN_WIDTH as K, gaugePercent as Kt, JsonRenderSpec as L, collectValues as Lt, FieldConditionResult as M, chartSpecFromProps as Mt, FieldOption as N, chartToTable as Nt, DocumentComponentName as O, a2uiComponentSchema as Ot, FormModel as P, collectFormScopes as Pt, UI_PRESETS as Q, mountViewerComponents as Qt, LoadedOpenUiPeers as R, createUiCatalogToolSource as Rt, DEFAULT_CHART_FONT_SIZES as S, ViewerComponentsOptions as St, DEFAULT_SURFACE_HOST_CONTROL_TEXTS as T, WEBSKILL_SURFACE_ACTION as Tt, PLANNED_INCREMENT as U, fromA2uiSurfaceAction as Ut, OpenUiRendererProps as V, evaluateFieldCondition as Vt, RENDER_UI_TOOL as W, fromUiSurfaceActionDispatch as Wt, UI_CATALOG_GROUPS as X, loadWebSkillLitCatalog as Xt, SurfaceHostControlTexts as Y, loadOpenUiPeers as Yt, UI_CATALOG_PROMPT_BUDGET_BYTES as Z, mountEchart as Zt, CHART_PALETTE as _, toUiSurfaceActionDispatch as _n, VIEWER_FALLBACK_ATTR as _t, A2UI_SURFACE_ACTION as a, renderRenderResult as an, UiComponentDef as at, ColumnWidthsRejection as b, uiPreset as bn, VercelUiBridge as bt, A2uiCatalogDefinition as c, resolveInteractionTexts as cn, UiPresetName as ct, A2uiMessage as d, shapeInteractionValue as dn, UiSpecIssue as dt, normalizeFieldOptions as en, UiActionDef as et, A2uiSpecActionEvent as f, toA2uiSpecMessages as fn, UiSpecSanitization as ft, CATALOG_SCHEMA_MAX as g, toOpenUiSpecLang as gn, VIEWER_COMPONENT_ATTR as gt, CATALOG_PROMPT_MAX as h, toJsonRenderSpec as hn, VERCEL_INTERACTION_TOOL_NAME as ht, A2UI_SPEC_FORM_PATH as i, renderMiniMarkdown as in, UiCatalogToolSourceOptions as it, FieldCondition as j, buildA2uiCatalogDefinition as jt, EchartHandle as k, a2uiComponentShapes as kt, A2uiCatalogHandle as l, resolveSurfaceFormTexts as ln, UiSpecDegradation as lt, CATALOG_BUDGET_STAGE as m, toEchartsOption as mn, UiSurfaceActionDispatch as mt, A2UI_COMMON_TYPES as n, renderBlocks as nn, UiCatalogInput as nt, A2UI_VERSION as o, resolveChartFontSizes as on, UiFormScope as ot, A2uiSpecMessageOptions as p, toA2uiSurfaceAction as pn, UiSpecValidation as pt, SpecColumnMeta as q, interactionToFormModel as qt, A2UI_SPEC_ACTION as r, renderMiniChart as rn, UiCatalogPromptOptions as rt, A2uiCatalogComponent as s, resolveColumnWidths as sn, UiPreset as st, A2UI_BASIC_CATALOG_ID as t, qualifyFieldName as tn, UiCatalog as tt, A2uiComponentShape as u, resolveSurfaceHostControlTexts as un, UiSpecDegradationCode as ut, ChartFontSizes as v, toVercelToolInvocation as vn, VIEWER_PROPS_ATTR as vt, DEFAULT_SURFACE_FORM_TEXTS as w, WEBSKILL_STYLES_CSS as wt, ControlModel as x, ViewerComponentsHandle as xt, CollectedValues as y, uiCatalog as yn, VercelToolInvocation as yt, MAX_CONDITION_DEPTH as z, defineUiCatalog as zt };