@mcp-b/webmcp-polyfill 6.0.2 → 6.1.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/LICENSE.webmcp-polyfill +202 -21
- package/README.md +12 -108
- package/dist/index.d.ts +7 -4
- package/dist/index.iife.js +4 -4
- package/dist/index.js +14 -852
- package/dist/index.js.map +1 -1
- package/package.json +4 -7
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["NativeDOMException","#document","#window","#handlers","#knownPeers","#unanswered","#started","#handshakes","#sessions","#receive","#hidden","#announce","#documentAllowed","#participants","#request","#related","#forget","#watch","#learn","#accept","#respond","#childPermission","#sourceAllowed","#parentPermission","#tree","#monitor","installWebMCP","#document","#tools","#frames","#toolchangeListener","#toolchangeHandler","#exposedTools","#executeLocal","#queueToolChange","#requireFrames"],"sources":["../src/upstream/frames.ts","../src/declarative-forms.ts","../src/upstream/index.ts","../src/index.ts"],"sourcesContent":["import type { WebMCP } from \"webmcp-types\";\n\n/** Tool metadata as its owner stores it and as frames exchange it. */\nexport interface ToolMetadata\n extends Pick<WebMCP.RegisteredTool, \"name\" | \"title\" | \"description\"> {\n annotations: WebMCP.ToolAnnotations | undefined;\n // Snapshot at registration; each discovery result parses a fresh copy.\n serializedSchema: string | undefined;\n}\n\n// Lexicographical, the order in which Web IDL reads dictionary members.\nexport const annotationNames = [\n \"consequentialHint\",\n \"debugging\",\n \"readOnlyHint\",\n \"untrustedContentHint\",\n] as const satisfies readonly (keyof WebMCP.ToolAnnotations)[];\n\ninterface Handlers {\n getTools(callerOrigin: string): ToolMetadata[];\n execute(\n callerOrigin: string,\n name: string,\n serializedInput: string,\n signal: AbortSignal,\n ): Promise<string>;\n changed(): Promise<void>;\n}\n\ntype Request =\n | { kind: \"permission\"; childIndex: number; childOrigin: string }\n | { kind: \"getTools\" }\n | { kind: \"execute\"; name: string; input: string }\n | { kind: \"changed\" };\n\ntype ReplyValue = boolean | ToolMetadata[] | string | undefined;\n\ninterface Session {\n peer: Window;\n end(): void;\n}\n\nconst protocol = \"webmcp-polyfill\";\n// Bounds handshakes, discovery, and permission replies; author code has no deadline.\nconst deadline = 500;\nconst NativeDOMException = globalThis.DOMException;\n\nexport class FrameBridge {\n readonly #document: Document;\n readonly #window: Window;\n readonly #handlers: Handlers;\n // Windows whose documents have shown that they run the polyfill. Only these receive requests,\n // so a frame without the polyfill costs no further request deadlines after startup.\n readonly #knownPeers = new Set<Window>();\n // Frames that have not answered this document's first announcement.\n readonly #unanswered = new Set<Window>();\n readonly #started = Promise.withResolvers<void>();\n readonly #handshakes = new Map<string, (event: MessageEvent<unknown>) => void>();\n readonly #sessions = new Set<Session>();\n #monitor: number | undefined;\n #hidden = false;\n\n constructor(view: Window, handlers: Handlers) {\n this.#window = view;\n this.#document = view.document;\n this.#handlers = handlers;\n this.#window.addEventListener(\"message\", (event) => this.#receive(event), true);\n this.#window.addEventListener(\"pagehide\", () => {\n this.#hidden = true;\n for (const session of this.#sessions) {\n session.end();\n }\n });\n this.#window.addEventListener(\"pageshow\", (event) => {\n // Only a restore from the back/forward cache follows pagehide.\n if (event.persisted) {\n this.#hidden = false;\n this.#announce();\n }\n });\n\n for (const frame of this.#announce()) {\n this.#unanswered.add(frame);\n }\n if (this.#unanswered.size === 0) {\n this.#started.resolve();\n } else {\n setTimeout(() => {\n this.#unanswered.clear();\n this.#started.resolve();\n }, deadline);\n }\n }\n\n async allowed(): Promise<boolean> {\n if (this.#hidden) {\n return false;\n }\n return this.#documentAllowed(this.#document);\n }\n\n async getTools(fromOrigins: string[]): Promise<WebMCP.RegisteredTool[]> {\n await this.#started.promise;\n const ownOrigin = this.#window.origin;\n const origins = [ownOrigin, ...fromOrigins];\n const results = await Promise.all(\n this.#participants().map(async (peer) => {\n if (peer === this.#window) {\n return this.#handlers\n .getTools(ownOrigin)\n .map((metadata) => toRegisteredTool(metadata, this.#window, ownOrigin));\n }\n try {\n const reply = await this.#request(peer, origins, { kind: \"getTools\" });\n if (!Array.isArray(reply.value)) {\n throw new TypeError(\"Expected a tool list from the frame\");\n }\n return reply.value.map((value: unknown) =>\n toRegisteredTool(readToolMetadata(value), peer, reply.origin),\n );\n } catch (error) {\n if (!(error instanceof NativeDOMException && error.name === \"UnknownError\")) {\n console.warn(\"WebMCP: could not read tools from a frame.\", error);\n }\n return [];\n }\n }),\n );\n return results.flat();\n }\n\n async execute(\n target: Window,\n expectedOrigin: string,\n name: string,\n serializedInput: string,\n signal?: AbortSignal,\n ): Promise<string> {\n const reply = await this.#request(\n target,\n [expectedOrigin],\n { kind: \"execute\", name, input: serializedInput },\n signal,\n );\n if (typeof reply.value !== \"string\") {\n throw executionError();\n }\n return reply.value;\n }\n\n async notify(exposedTo: string[]): Promise<void> {\n await this.#started.promise;\n const origins = [this.#window.origin, ...exposedTo];\n // One frame at a time: the draft fires toolchange in tree order.\n for (const peer of this.#participants()) {\n if (peer === this.#window) {\n await this.#handlers.changed();\n continue;\n }\n try {\n await this.#request(peer, origins, { kind: \"changed\" });\n } catch {\n // Frames may navigate or disappear while registration changes are delivered.\n }\n }\n }\n\n #request(\n target: Window,\n origins: string[] | undefined,\n request: Request,\n signal?: AbortSignal,\n ): Promise<{ value: unknown; origin: string }> {\n return new Promise((resolve, reject) => {\n signal?.throwIfAborted();\n if (this.#hidden || !this.#related(target)) {\n reject(executionError());\n return;\n }\n\n const id = crypto.randomUUID();\n const { port1, port2 } = new MessageChannel();\n let peerOrigin: string | undefined;\n\n const close = (): void => {\n clearTimeout(timer);\n stopWatching();\n signal?.removeEventListener(\"abort\", abort);\n this.#handshakes.delete(id);\n port1.close();\n };\n const fail = (error: unknown = executionError()): void => {\n port1.postMessage({ kind: \"cancel\" });\n close();\n reject(error);\n };\n const abort = (): void => fail(signal?.reason);\n const expire = (): void => {\n if (peerOrigin === undefined) {\n this.#forget(target);\n }\n fail();\n };\n const connected = (event: MessageEvent<unknown>): void => {\n if (event.source !== target) {\n return;\n }\n this.#handshakes.delete(id);\n if (origins && !origins.includes(event.origin)) {\n fail();\n return;\n }\n peerOrigin = event.origin;\n clearTimeout(timer);\n if (request.kind !== \"execute\" && request.kind !== \"changed\") {\n timer = setTimeout(expire, deadline);\n }\n // The port reaches the document that answered, even if its window navigates afterwards.\n port1.postMessage(request);\n };\n\n let timer = setTimeout(expire, deadline);\n const stopWatching = this.#watch(target, fail);\n port1.onmessage = (event: MessageEvent<unknown>) => {\n const reply = record(event.data);\n // A peer that gave up may say so before its ready message is handled here.\n if (reply?.kind === \"error\") {\n fail();\n return;\n }\n if (reply?.kind !== \"result\" || peerOrigin === undefined) {\n return;\n }\n close();\n resolve({ value: reply.value, origin: peerOrigin });\n };\n port1.onmessageerror = () => fail();\n signal?.addEventListener(\"abort\", abort, { once: true });\n this.#handshakes.set(id, connected);\n // The peer's origin is unknown until it answers, and this message carries only the id.\n try {\n target.postMessage(`${protocol}:connect:${id}`, \"*\", [port2]);\n } catch {\n port2.close();\n fail();\n }\n });\n }\n\n #receive(event: MessageEvent<unknown>): void {\n const message = readWindowMessage(event.data);\n if (!message) {\n return;\n }\n // Protocol traffic must not reach the application's listeners, one-shot ones included.\n event.stopImmediatePropagation();\n const source = event.source;\n if (\n !event.isTrusted ||\n !source ||\n !isWindow(source) ||\n !this.#related(source) ||\n // An opaque origin cannot be named by exposedTo, fromOrigins, or an allow attribute.\n event.origin === \"null\" ||\n this.#hidden\n ) {\n return;\n }\n\n if (message.kind === \"announce\") {\n const isNew = !this.#knownPeers.has(source);\n this.#learn(source);\n source.postMessage(`${protocol}:present`, event.origin);\n // A newcomer's tree walk cannot reach frames inside shadow trees, so the top frame asks\n // every peer to announce again.\n if (!isNew || this.#window !== this.#window.top) {\n return;\n }\n for (const peer of this.#knownPeers) {\n if (peer === source) {\n continue;\n }\n peer.postMessage(`${protocol}:refresh`, \"*\");\n }\n return;\n }\n if (message.kind === \"present\") {\n this.#learn(source);\n return;\n }\n if (message.kind === \"refresh\") {\n if (source === this.#window.top) {\n this.#announce();\n }\n return;\n }\n if (message.kind === \"ready\") {\n this.#handshakes.get(message.id)?.(event);\n return;\n }\n const [port] = event.ports;\n if (message.kind !== \"connect\" || !message.id || !port || event.ports.length !== 1) {\n return;\n }\n this.#learn(source);\n this.#accept(source, event.origin, message.id, port);\n }\n\n #accept(source: Window, origin: string, id: string, port: MessagePort): void {\n const controller = new AbortController();\n let requested = false;\n\n const close = (): void => {\n clearTimeout(timer);\n stopWatching();\n port.close();\n };\n const cancel = (): void => {\n controller.abort();\n close();\n };\n const fail = (): void => {\n port.postMessage({ kind: \"error\" });\n cancel();\n };\n // Tell a requester that was too slow to send its request; it may have no deadline left.\n const timer = setTimeout(fail, deadline);\n const stopWatching = this.#watch(source, fail);\n\n port.onmessageerror = fail;\n port.onmessage = async (event: MessageEvent<unknown>) => {\n const request = record(event.data);\n if (request?.kind === \"cancel\") {\n cancel();\n return;\n }\n if (requested) {\n return;\n }\n requested = true;\n clearTimeout(timer);\n try {\n const value = await this.#respond(source, origin, request, controller.signal);\n port.postMessage({ kind: \"result\", value });\n close();\n } catch {\n fail();\n }\n };\n source.postMessage(`${protocol}:ready:${id}`, origin);\n }\n\n async #respond(\n source: Window,\n origin: string,\n request: Record<string, unknown> | undefined,\n signal: AbortSignal,\n ): Promise<ReplyValue> {\n if (!request || !this.#related(source)) {\n throw executionError();\n }\n if (request.kind === \"permission\") {\n const { childIndex, childOrigin } = request;\n if (\n typeof childIndex !== \"number\" ||\n !Number.isInteger(childIndex) ||\n childIndex < 0 ||\n typeof childOrigin !== \"string\"\n ) {\n throw executionError();\n }\n return this.#childPermission(childIndex, childOrigin);\n }\n if (!(await this.allowed()) || !(await this.#sourceAllowed(source, origin))) {\n throw executionError();\n }\n // The checks above may have waited on other frames.\n if (!this.#related(source)) {\n throw executionError();\n }\n signal.throwIfAborted();\n if (request.kind === \"getTools\") {\n return this.#handlers.getTools(origin);\n }\n if (\n request.kind === \"execute\" &&\n typeof request.name === \"string\" &&\n typeof request.input === \"string\"\n ) {\n return this.#handlers.execute(origin, request.name, request.input, signal);\n }\n if (request.kind === \"changed\") {\n await this.#handlers.changed();\n return undefined;\n }\n throw executionError();\n }\n\n async #childPermission(childIndex: number, childOrigin: string): Promise<boolean> {\n // Windows cannot cross postMessage, so the asker names the child by its index here.\n const child: Window | undefined = this.#window[childIndex];\n return (\n child !== undefined &&\n (await this.allowed()) &&\n childAllowed(this.#document, child, childOrigin)\n );\n }\n\n async #documentAllowed(owner: Document): Promise<boolean> {\n const view = activeWindow(owner);\n if (!view) {\n return false;\n }\n const policy = readToolsPolicy(owner);\n if (policy !== undefined) {\n return policy;\n }\n if (view === view.parent) {\n return true;\n }\n // Firefox has no ancestorOrigins; there the parent is simply tried.\n const parentOrigin = view.location.ancestorOrigins?.[0];\n const parentDocument = readDocument(\n view.parent,\n parentOrigin === undefined || parentOrigin === view.origin,\n );\n if (!parentDocument) {\n return this.#parentPermission(view, view.origin);\n }\n return (\n childAllowed(parentDocument, view, view.origin) &&\n (await this.#documentAllowed(parentDocument))\n );\n }\n\n async #sourceAllowed(source: Window, origin: string): Promise<boolean> {\n const sourceDocument = readDocument(source, origin === this.#window.origin);\n return sourceDocument\n ? this.#documentAllowed(sourceDocument)\n : this.#parentPermission(source, origin);\n }\n\n async #parentPermission(child: Window, origin: string): Promise<boolean> {\n const parent = child.parent;\n if (parent === child) {\n return true;\n }\n let childIndex = -1;\n for (let index = 0; index < parent.length; index++) {\n if (parent[index] === child) {\n childIndex = index;\n break;\n }\n }\n if (childIndex < 0) {\n return false;\n }\n if (parent === this.#window) {\n return (await this.allowed()) && childAllowed(this.#document, child, origin);\n }\n await this.#started.promise;\n // A parent without the polyfill cannot vouch for its frames.\n if (!this.#knownPeers.has(parent)) {\n return false;\n }\n try {\n const reply = await this.#request(parent, undefined, {\n kind: \"permission\",\n childIndex,\n childOrigin: origin,\n });\n // A parent's reply cannot grant permission denied by an ancestor.\n return reply.value === true && (await this.#sourceAllowed(parent, reply.origin));\n } catch {\n return false;\n }\n }\n\n #related(peer: Window): boolean {\n try {\n return !peer.closed && peer !== this.#window && peer.top === this.#window.top;\n } catch {\n return false;\n }\n }\n\n // Depth-first from the top, in document order. Indexed access omits frames inside shadow\n // trees, so known peers and this window's ancestors are also placed under their parents.\n // Peers that have left the tree are dropped on the way, so their windows are not retained.\n #tree(): Window[] {\n if (this.#window.closed) {\n return [];\n }\n for (const peer of this.#knownPeers) {\n if (!this.#related(peer)) {\n this.#knownPeers.delete(peer);\n }\n }\n const candidates = [this.#window, ...this.#knownPeers];\n for (\n let ancestor = this.#window.parent;\n ancestor !== ancestor.parent;\n ancestor = ancestor.parent\n ) {\n candidates.push(ancestor);\n }\n\n const tree = new Set<Window>();\n const pending = [this.#window.top!];\n while (pending.length) {\n const frame = pending.pop()!;\n if (tree.has(frame)) {\n continue;\n }\n tree.add(frame);\n const children: Window[] = [];\n for (let index = 0; index < frame.length; index++) {\n const child = frame[index];\n if (child) {\n children.push(child);\n }\n }\n for (const candidate of candidates) {\n if (candidate !== frame && candidate.parent === frame && !children.includes(candidate)) {\n children.push(candidate);\n }\n }\n // pop() takes from the end, so reversing keeps document order.\n pending.push(...children.reverse());\n }\n return Array.from(tree).filter((frame) => frame === this.#window || this.#related(frame));\n }\n\n #participants(): Window[] {\n return this.#tree().filter((frame) => frame === this.#window || this.#knownPeers.has(frame));\n }\n\n #announce(): Window[] {\n const others = this.#tree().filter((frame) => frame !== this.#window);\n for (const frame of others) {\n frame.postMessage(`${protocol}:announce`, \"*\");\n }\n return others;\n }\n\n #learn(peer: Window): void {\n this.#knownPeers.add(peer);\n this.#unanswered.delete(peer);\n if (this.#unanswered.size === 0) {\n this.#started.resolve();\n }\n }\n\n // A silent window may now hold a document without the polyfill. A live peer answers the\n // announcement and is learned again.\n #forget(peer: Window): void {\n this.#knownPeers.delete(peer);\n if (this.#related(peer)) {\n peer.postMessage(`${protocol}:announce`, \"*\");\n }\n }\n\n // No event reports a removed iframe, so one shared interval polls the open sessions.\n #watch(peer: Window, end: () => void): () => void {\n const session = { peer, end };\n this.#sessions.add(session);\n if (this.#monitor === undefined) {\n this.#monitor = this.#window.setInterval(() => {\n for (const open of this.#sessions) {\n if (!this.#related(open.peer)) {\n open.end();\n }\n }\n }, 100);\n }\n return () => {\n this.#sessions.delete(session);\n if (this.#sessions.size === 0) {\n this.#window.clearInterval(this.#monitor);\n this.#monitor = undefined;\n }\n };\n }\n}\n\nfunction childAllowed(owner: Document, child: Window, origin: string): boolean {\n const ownerOrigin = owner.defaultView?.origin;\n const frame = findFrame(owner, child, origin === ownerOrigin);\n if (!frame) {\n return false;\n }\n const directive = (frame.getAttribute(\"allow\") ?? \"\")\n .split(\";\")\n .map((part) => part.trim().split(/\\s+/u))\n .find(([name]) => name === \"tools\");\n if (!directive) {\n return origin === ownerOrigin;\n }\n // A bare \"tools\" delegates to the origin of the src attribute.\n const sources = directive.length === 1 ? [\"'src'\"] : directive.slice(1);\n if (sources.includes(\"'none'\")) {\n return false;\n }\n // A frame with srcdoc, no src, or an about: URL takes its owner's origin.\n const src = frame.hasAttribute(\"srcdoc\") ? null : frame.getAttribute(\"src\");\n const srcURL = src ? URL.parse(src, owner.baseURI) : null;\n const sourceOrigin = !src || srcURL?.protocol === \"about:\" ? ownerOrigin : srcURL?.origin;\n return sources.some(\n (source) =>\n source === \"*\" ||\n (source === \"'self'\" && origin === ownerOrigin) ||\n (source === \"'src'\" && origin === sourceOrigin) ||\n source === origin,\n );\n}\n\n// WebKit reports a blocked cross-origin access even when the error is caught, so a window is\n// read only when the origins say the read can succeed.\nfunction readDocument(view: Window, sameOrigin: boolean): Document | undefined {\n if (!sameOrigin) {\n return undefined;\n }\n try {\n return view.document;\n } catch {\n return undefined;\n }\n}\n\nfunction findFrame(owner: Document, child: Window, sameOrigin: boolean): Element | undefined {\n if (sameOrigin) {\n try {\n const frame = child.frameElement;\n // Compare documents; instanceof fails when `owner` belongs to another realm.\n if (frame?.ownerDocument === owner) {\n return frame;\n }\n } catch {\n // The claimed origin was wrong; the owner's own DOM still names its frames.\n }\n }\n return searchFrames(owner, child);\n}\n\n// Unlike frameElement, a DOM search cannot enter closed shadow roots.\nfunction searchFrames(root: Document | ShadowRoot, child: Window): Element | undefined {\n const frames = root.querySelectorAll<HTMLIFrameElement | HTMLFrameElement>(\"iframe, frame\");\n for (const frame of frames) {\n if (frame.contentWindow === child) {\n return frame;\n }\n }\n for (const element of root.querySelectorAll(\"*\")) {\n if (!element.shadowRoot) {\n continue;\n }\n const frame = searchFrames(element.shadowRoot, child);\n if (frame) {\n return frame;\n }\n }\n return undefined;\n}\n\nexport function activeWindow(owner: Document): Window | undefined {\n const view = owner.defaultView;\n return view && !view.closed && view.document === owner ? view : undefined;\n}\n\nexport function readToolsPolicy(owner: Document): boolean | undefined {\n // Neither policy interface is in TypeScript's DOM library.\n const source: Document & { permissionsPolicy?: unknown; featurePolicy?: unknown } = owner;\n const policy = record(source.permissionsPolicy ?? source.featurePolicy);\n if (typeof policy?.features !== \"function\" || typeof policy.allowsFeature !== \"function\") {\n return undefined;\n }\n const features: unknown = policy.features();\n return Array.isArray(features) && features.includes(\"tools\")\n ? Boolean(policy.allowsFeature(\"tools\"))\n : undefined;\n}\n\nfunction toRegisteredTool(\n metadata: ToolMetadata,\n owner: Window,\n origin: string,\n): WebMCP.RegisteredTool {\n // SAFETY: the draft keeps whatever JSON toJSON produced; the cast matches RegisteredTool's type.\n const inputSchema =\n metadata.serializedSchema === undefined\n ? undefined\n : (JSON.parse(metadata.serializedSchema) as object);\n\n // Insert present members in Web IDL order.\n return {\n ...(metadata.annotations !== undefined && { annotations: { ...metadata.annotations } }),\n description: metadata.description,\n ...(inputSchema !== undefined && { inputSchema }),\n name: metadata.name,\n origin,\n title: metadata.title,\n window: owner,\n };\n}\n\n// Another frame's reply is untrusted input.\nfunction readToolMetadata(value: unknown): ToolMetadata {\n const tool = record(value);\n if (\n !tool ||\n typeof tool.name !== \"string\" ||\n typeof tool.title !== \"string\" ||\n typeof tool.description !== \"string\" ||\n (tool.serializedSchema !== undefined && typeof tool.serializedSchema !== \"string\")\n ) {\n throw new TypeError(\"Invalid tool metadata from the frame\");\n }\n const metadata: ToolMetadata = {\n name: tool.name,\n title: tool.title,\n description: tool.description,\n annotations: undefined,\n serializedSchema: tool.serializedSchema,\n };\n if (tool.annotations === undefined) {\n return metadata;\n }\n const hints = record(tool.annotations);\n if (!hints) {\n throw new TypeError(\"Invalid tool annotations from the frame\");\n }\n const annotations: WebMCP.ToolAnnotations = {};\n for (const name of annotationNames) {\n const hint = hints[name];\n if (hint === undefined) {\n continue;\n }\n if (typeof hint !== \"boolean\") {\n throw new TypeError(`Invalid ${name} annotation from the frame`);\n }\n annotations[name] = hint;\n }\n metadata.annotations = annotations;\n return metadata;\n}\n\nfunction readWindowMessage(value: unknown): { kind: string; id: string } | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const [namespace, kind = \"\", id = \"\", extra] = value.split(\":\");\n return namespace === protocol && extra === undefined ? { kind, id } : undefined;\n}\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return undefined;\n }\n // SAFETY: the object check permits property reads; each reader validates its members.\n return value as Record<string, unknown>;\n}\n\nfunction isWindow(value: MessageEventSource): value is Window {\n try {\n return \"postMessage\" in value && \"window\" in value;\n } catch {\n return false;\n }\n}\n\nexport function executionError(): DOMException {\n return new NativeDOMException(\"Tool execution failed\", \"UnknownError\");\n}\n","import type { WebMCP } from 'webmcp-types';\nimport { executionError } from './upstream/frames.js';\n\ntype InputSchema = NonNullable<WebMCP.ModelContextTool['inputSchema']>;\ntype WebMcpToolInput = Parameters<WebMCP.ToolExecuteCallback>[0];\n// webmcp-types accepts any schema object. This is the subset generated from form controls.\ninterface FormParameterSchema {\n type: 'string' | 'number' | 'boolean' | 'array';\n description?: string;\n title?: string;\n const?: string;\n enum?: string[];\n anyOf?: FormParameterSchema[];\n items?: FormParameterSchema;\n uniqueItems?: boolean;\n minimum?: number;\n maximum?: number;\n multipleOf?: number;\n pattern?: string;\n format?: string;\n}\n\ntype WebMcpToolResult = Awaited<ReturnType<WebMCP.ToolExecuteCallback>>;\n\ntype DeclarativeControl = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\ntype Submitter = HTMLButtonElement | HTMLInputElement;\n\ninterface DeclarativeToolDefinition {\n name: string;\n title: string;\n description: string;\n inputSchema: InputSchema;\n autosubmit: boolean;\n}\n\ninterface DeclarativeRegistration {\n controller: AbortController;\n fingerprint: string;\n form: HTMLFormElement;\n cancelPending?: (reason: ErrorOptions['cause']) => void;\n}\n\ninterface ActiveSubmission {\n complete(event: SubmitEvent): void;\n direct(): void;\n respond(event: SubmitEvent): void;\n}\n\nconst agentInvokedEvents = new WeakSet<SubmitEvent>();\nconst agentResponses = new WeakMap<SubmitEvent, Promise<WebMcpToolResult>>();\nconst activeSubmissions = new WeakMap<HTMLFormElement, ActiveSubmission>();\n\nfunction isAgentInvokedSubmitEvent(event: SubmitEvent): boolean {\n return (\n event.isTrusted &&\n (agentInvokedEvents.has(event) ||\n (event.eventPhase !== Event.NONE &&\n event.target instanceof HTMLFormElement &&\n activeSubmissions.has(event.target)))\n );\n}\n\nfunction respondWithAgentSubmitEvent(\n event: SubmitEvent,\n agentResponse: Promise<WebMcpToolResult>\n): void {\n if (!isAgentInvokedSubmitEvent(event)) {\n throw new DOMException(\n 'respondWith() is only available during an agent-invoked submit event',\n 'InvalidStateError'\n );\n }\n if (!event.defaultPrevented) {\n throw new DOMException(\n 'respondWith() requires preventDefault() during an agent-invoked submit event',\n 'InvalidStateError'\n );\n }\n if (event.eventPhase === Event.NONE) {\n throw new DOMException(\n 'respondWith() is only available while the submit event is being dispatched',\n 'InvalidStateError'\n );\n }\n agentInvokedEvents.add(event);\n const response = Promise.resolve(agentResponse);\n agentResponses.set(event, response);\n if (event.target instanceof HTMLFormElement) {\n activeSubmissions.get(event.target)?.respond(event);\n }\n}\n\nconst TEXT_INPUT_TYPES = new Set(['email', 'password', 'search', 'tel', 'text', 'url']);\nconst READONLY_INPUT_TYPES = new Set([\n ...TEXT_INPUT_TYPES,\n 'date',\n 'datetime-local',\n 'month',\n 'number',\n 'time',\n 'week',\n]);\n\nfunction isControl(element: Element): element is DeclarativeControl {\n return (\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n );\n}\n\nfunction getFormControls(form: HTMLFormElement): HTMLFormControlsCollection {\n return Object.getOwnPropertyDescriptor(HTMLFormElement.prototype, 'elements')?.get?.call(form);\n}\n\nfunction getFormAttribute(form: HTMLFormElement, name: string): string | null {\n return Element.prototype.getAttribute.call(form, name);\n}\n\nfunction formHasAttribute(form: HTMLFormElement, name: string): boolean {\n return Element.prototype.hasAttribute.call(form, name);\n}\n\nfunction isConnected(node: Node): boolean {\n return Object.getOwnPropertyDescriptor(Node.prototype, 'isConnected')?.get?.call(node);\n}\n\nfunction getOpenShadowRoot(element: Element): ShadowRoot | null {\n return Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot')?.get?.call(element);\n}\n\nfunction checkFormValidity(form: HTMLFormElement): boolean {\n return HTMLFormElement.prototype.checkValidity.call(form);\n}\n\nfunction requestFormSubmit(form: HTMLFormElement, submitter?: Submitter): void {\n HTMLFormElement.prototype.requestSubmit.call(form, submitter);\n}\n\nfunction getControls(form: HTMLFormElement): DeclarativeControl[] {\n return [...getFormControls(form)].filter(\n (element): element is DeclarativeControl =>\n isControl(element) &&\n !element.matches(':disabled') &&\n !(\n 'readOnly' in element &&\n element.readOnly &&\n (element instanceof HTMLTextAreaElement || READONLY_INPUT_TYPES.has(element.type))\n )\n );\n}\n\nfunction controlGroups(form: HTMLFormElement): Map<string, DeclarativeControl[]> {\n const groups = new Map<string, DeclarativeControl[]>();\n for (const control of getControls(form)) {\n const name = control.name.trim();\n const controls = groups.get(name);\n if (controls) controls.push(control);\n else groups.set(name, [control]);\n }\n return groups;\n}\n\nfunction labelText(control: DeclarativeControl): string {\n return [...(control.labels ?? [])]\n .map((label) => {\n const copy = label.cloneNode(true);\n if (!(copy instanceof HTMLElement)) return '';\n copy\n .querySelectorAll('button, input, meter, output, progress, select, textarea')\n .forEach((element) => element.remove());\n return copy.textContent?.trim() ?? '';\n })\n .filter(Boolean)\n .join('; ');\n}\n\nfunction commonFieldset(\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[]\n): HTMLFieldSetElement | undefined {\n for (\n let element = controls[0]?.parentElement;\n element && element !== form;\n element = element.parentElement\n ) {\n if (\n element instanceof HTMLFieldSetElement &&\n controls.every((control) => element.contains(control))\n ) {\n return element;\n }\n }\n return undefined;\n}\n\nfunction parameterDescription(\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[]\n): string | undefined {\n if (controls.length === 1) {\n const control = controls[0];\n if (!control) return undefined;\n return (\n control.getAttribute('toolparamdescription') ||\n labelText(control) ||\n control.getAttribute('aria-description') ||\n undefined\n );\n }\n return commonFieldset(form, controls)?.getAttribute('toolparamdescription') || undefined;\n}\n\nfunction withDescription(\n schema: FormParameterSchema,\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[],\n extra?: string\n): FormParameterSchema {\n const description = parameterDescription(form, controls);\n const combined = description && extra ? `${description} (${extra})` : description || extra;\n return combined ? { ...schema, description: combined } : schema;\n}\n\nfunction validNumberAttribute(input: HTMLInputElement, name: 'max' | 'min'): number | undefined {\n const raw = input.getAttribute(name);\n if (raw === null || raw.trim() === '') return undefined;\n const value = Number(raw);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction validStep(input: HTMLInputElement, fallback: number): number {\n const step = Number(input.getAttribute('step'));\n return Number.isFinite(step) && step > 0 ? step : fallback;\n}\n\nfunction isStepBaseMultiple(stepBase: number, step: number): boolean {\n const quotient = stepBase / step;\n return Math.abs(quotient - Math.round(quotient)) < Number.EPSILON * 16;\n}\n\nfunction withPattern(schema: FormParameterSchema, input: HTMLInputElement): FormParameterSchema {\n const pattern = input.getAttribute('pattern');\n if (pattern === null) return schema;\n try {\n new RegExp(pattern, 'v');\n } catch {\n return schema;\n }\n return { ...schema, pattern };\n}\n\nfunction numberSchema(input: HTMLInputElement): FormParameterSchema {\n const schema: FormParameterSchema = { type: 'number' };\n const minimum = validNumberAttribute(input, 'min');\n const maximum = validNumberAttribute(input, 'max');\n if (minimum !== undefined) schema.minimum = minimum;\n if (maximum !== undefined) schema.maximum = maximum;\n if (input.getAttribute('step') !== 'any') {\n const step = validStep(input, 1);\n const rawValue = Number(input.getAttribute('value'));\n const stepBase = minimum ?? (Number.isFinite(rawValue) ? rawValue : 0);\n if (isStepBaseMultiple(stepBase, step)) schema.multipleOf = step;\n }\n return schema;\n}\n\nfunction temporalFormat(input: HTMLInputElement, datePrefix: string): string {\n const step = validStep(input, 60);\n if (step < 1) return `${datePrefix}(:[0-5][0-9](\\\\.[0-9]{1,3})?)?$`;\n if (step < 60) return `${datePrefix}(:[0-5][0-9])?$`;\n return `${datePrefix}$`;\n}\n\nfunction optionSchemas(options: readonly HTMLOptionElement[]) {\n return {\n anyOf: options.map((option) => ({\n type: 'string' as const,\n const: option.value,\n title: option.textContent ?? '',\n })),\n enum: options.map((option) => option.value),\n };\n}\n\nfunction groupChoiceSchemas(controls: readonly HTMLInputElement[]) {\n return {\n anyOf: controls.map((control) => {\n const title = labelText(control);\n const schema: FormParameterSchema = { type: 'string', const: control.value };\n if (title) schema.title = title;\n return schema;\n }),\n enum: controls.map((control) => control.value),\n };\n}\n\nfunction isInput(control: DeclarativeControl, type: string): control is HTMLInputElement {\n return control instanceof HTMLInputElement && control.type === type;\n}\n\nfunction inputSchema(input: HTMLInputElement): FormParameterSchema | undefined {\n if (TEXT_INPUT_TYPES.has(input.type)) return withPattern({ type: 'string' }, input);\n switch (input.type) {\n case 'hidden':\n return input.getAttribute('toolparamdescription') ? { type: 'string' } : undefined;\n case 'number':\n return withPattern(numberSchema(input), input);\n case 'range': {\n const schema = numberSchema(input);\n schema.minimum ??= 0;\n schema.maximum ??= 100;\n return schema;\n }\n case 'checkbox':\n return { type: 'boolean' };\n case 'date':\n return { type: 'string', format: 'date' };\n case 'month':\n return { type: 'string', format: '^[0-9]{4}-(0[1-9]|1[0-2])$' };\n case 'week':\n return { type: 'string', format: '^[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-3])$' };\n case 'time':\n return { type: 'string', format: temporalFormat(input, '^([01][0-9]|2[0-3]):[0-5][0-9]') };\n case 'datetime-local':\n return {\n type: 'string',\n format: temporalFormat(\n input,\n '^[0-9]{4}-(0[1-9]|1[0-2])-[0-9]{2}T([01][0-9]|2[0-3]):[0-5][0-9]'\n ),\n };\n case 'color':\n return { type: 'string', format: '^#[0-9a-zA-Z]{6}$' };\n default:\n return undefined;\n }\n}\n\nfunction parameterSchema(\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[]\n): FormParameterSchema | undefined {\n const [first] = controls;\n if (!first) return undefined;\n let schema: FormParameterSchema | undefined;\n if (controls.every((control) => isInput(control, 'radio'))) {\n schema = { type: 'string', ...groupChoiceSchemas(controls) };\n } else if (controls.length > 1) {\n if (controls.every((control) => isInput(control, 'checkbox'))) {\n schema = {\n type: 'array',\n items: { type: 'string', ...groupChoiceSchemas(controls) },\n uniqueItems: true,\n };\n }\n } else if (first instanceof HTMLTextAreaElement) {\n schema = { type: 'string' };\n } else if (first instanceof HTMLSelectElement) {\n const choices = optionSchemas([...first.options]);\n schema = first.multiple\n ? { type: 'array', items: { type: 'string', ...choices }, uniqueItems: true }\n : { type: 'string', ...choices };\n } else {\n schema = inputSchema(first);\n }\n const dateHint =\n first.type === 'date' ? \"Dates MUST be provided in 'YYYY-MM-DD' format.\" : undefined;\n return schema && withDescription(schema, form, controls, dateHint);\n}\n\nfunction synthesizeSchema(form: HTMLFormElement): InputSchema {\n const properties: Record<string, FormParameterSchema> = {};\n const required: string[] = [];\n for (const [name, controls] of controlGroups(form)) {\n if (!name) continue;\n const schema = parameterSchema(form, controls);\n if (!schema) continue;\n Object.defineProperty(properties, name, {\n configurable: true,\n enumerable: true,\n value: schema,\n writable: true,\n });\n if (controls.some((control) => control.required)) required.push(name);\n }\n return { type: 'object', properties, required };\n}\n\nfunction toolDefinition(form: HTMLFormElement): DeclarativeToolDefinition {\n return {\n name: getFormAttribute(form, 'toolname') ?? '',\n title: getFormAttribute(form, 'tooltitle') ?? '',\n description: getFormAttribute(form, 'tooldescription') ?? '',\n inputSchema: synthesizeSchema(form),\n autosubmit: formHasAttribute(form, 'toolautosubmit'),\n };\n}\n\nfunction toFormString(value: unknown): string | undefined {\n if (typeof value === 'string' || typeof value === 'boolean') return String(value);\n if (typeof value === 'number' && Number.isFinite(value)) return String(value);\n return undefined;\n}\n\nfunction toFormBoolean(value: unknown): boolean | undefined {\n if (typeof value === 'boolean') return value;\n if (typeof value === 'number' && Number.isInteger(value)) return value !== 0;\n if (typeof value !== 'string') return undefined;\n if (value === '1' || value.toLowerCase() === 'true') return true;\n if (value === '0' || value.toLowerCase() === 'false') return false;\n return undefined;\n}\n\nfunction hasUniqueAllowedValues(value: unknown, allowed: ReadonlySet<string>): value is unknown[] {\n if (!Array.isArray(value)) return false;\n const remaining = new Set(allowed);\n for (const item of value) {\n const string = toFormString(item);\n if (string === undefined || !remaining.delete(string)) return false;\n }\n return true;\n}\n\nfunction inputAcceptsValue(input: HTMLInputElement, value: string): boolean {\n if (value === '') return input.type !== 'number' && input.type !== 'range';\n const probe = input.ownerDocument.createElement('input');\n probe.type = input.type;\n probe.value = value;\n return probe.value !== '';\n}\n\ntype FormParameterValue = string | boolean | number | unknown[];\n\nfunction isFormParameterValue(\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[],\n value: unknown\n): value is FormParameterValue {\n const [first] = controls;\n if (!first || !parameterSchema(form, controls)) return false;\n const string = toFormString(value);\n if (controls.every((control) => isInput(control, 'radio'))) {\n return controls.some((control) => control.value === string);\n }\n // Any other group with a schema is a checkbox group.\n if (controls.length > 1) {\n return hasUniqueAllowedValues(value, new Set(controls.map((control) => control.value)));\n }\n if (first instanceof HTMLSelectElement) {\n const allowed = new Set([...first.options].map((option) => option.value));\n if (first.multiple) return hasUniqueAllowedValues(value, allowed);\n return string !== undefined && allowed.has(string);\n }\n if (first instanceof HTMLTextAreaElement) return string !== undefined;\n if (first.type === 'checkbox') return toFormBoolean(value) !== undefined;\n return string !== undefined && inputAcceptsValue(first, string);\n}\n\nfunction dispatchInputAndChange(control: DeclarativeControl): void {\n control.dispatchEvent(new Event('input', { bubbles: true, composed: true }));\n control.dispatchEvent(new Event('change', { bubbles: true }));\n}\n\n// Prototype setters skip instance overrides such as React's value tracker, so frameworks\n// treat the dispatched events as real changes.\nfunction setValue(control: HTMLInputElement | HTMLTextAreaElement, value: string): void {\n if (control.value === value) return;\n const prototype =\n control instanceof HTMLInputElement\n ? HTMLInputElement.prototype\n : HTMLTextAreaElement.prototype;\n Object.getOwnPropertyDescriptor(prototype, 'value')?.set?.call(control, value);\n dispatchInputAndChange(control);\n}\n\nfunction setChecked(control: HTMLInputElement, checked: boolean): void {\n if (control.checked === checked) return;\n Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'checked')?.set?.call(\n control,\n checked\n );\n dispatchInputAndChange(control);\n}\n\n// Expects a value that isFormParameterValue() accepted.\nfunction fillParameter(controls: readonly DeclarativeControl[], value: FormParameterValue): void {\n const [first] = controls;\n const string = toFormString(value);\n const values = new Set(Array.isArray(value) ? value.map(toFormString) : []);\n if (controls.every((control) => isInput(control, 'radio'))) {\n const control = controls.find((candidate) => candidate.value === string);\n if (control) setChecked(control, true);\n } else if (controls.length > 1) {\n for (const control of controls) {\n if (control instanceof HTMLInputElement) setChecked(control, values.has(control.value));\n }\n } else if (first instanceof HTMLSelectElement) {\n if (first.multiple) {\n let changed = false;\n for (const option of first.options) {\n const next = values.has(option.value);\n if (option.selected === next) continue;\n option.selected = next;\n changed = true;\n }\n if (changed) dispatchInputAndChange(first);\n } else if (string !== undefined && first.value !== string) {\n first.value = string;\n dispatchInputAndChange(first);\n }\n } else if (first && isInput(first, 'checkbox')) {\n const checked = toFormBoolean(value);\n if (checked !== undefined) setChecked(first, checked);\n } else if (first && string !== undefined) {\n setValue(first, string);\n }\n}\n\n// Upstream replaces every callback failure with its own generic error, so no reason\n// thrown or rejected from this layer reaches a caller.\nfunction fillForm(form: HTMLFormElement, input: WebMcpToolInput): void {\n if (Array.isArray(input)) throw executionError();\n const groups = controlGroups(form);\n const parameters: Array<{ controls: DeclarativeControl[]; value: FormParameterValue }> = [];\n for (const [name, value] of Object.entries(input)) {\n const controls = groups.get(name);\n if (!controls || !isFormParameterValue(form, controls, value)) throw executionError();\n parameters.push({ controls, value });\n }\n for (const { controls, value } of parameters) fillParameter(controls, value);\n}\n\nfunction findSubmitter(form: HTMLFormElement): Submitter | undefined {\n return [...getFormControls(form)].find(\n (element): element is Submitter =>\n !element.matches(':disabled') &&\n ((element instanceof HTMLButtonElement && element.type === 'submit') ||\n (element instanceof HTMLInputElement && ['image', 'submit'].includes(element.type)))\n );\n}\n\nfunction lifecycleEvent(type: 'toolactivated' | 'toolcancel', toolName: string): Event {\n const event = new Event(type);\n Object.defineProperty(event, 'toolName', { enumerable: true, value: toolName });\n return event;\n}\n\nfunction waitForSubmission(\n context: WebMCP.ModelContext,\n registration: DeclarativeRegistration,\n definition: DeclarativeToolDefinition,\n submitter: Submitter | undefined,\n signal: AbortSignal\n): Promise<WebMcpToolResult> {\n const { form } = registration;\n registration.cancelPending?.(executionError());\n\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n EventTarget.prototype.removeEventListener.call(form, 'invalid', onInvalid, true);\n signal.removeEventListener('abort', onAbort);\n activeSubmissions.delete(form);\n if (registration.cancelPending === cancel) delete registration.cancelPending;\n };\n const finish = (callback: () => void) => {\n if (settled) return;\n settled = true;\n cleanup();\n callback();\n };\n const cancel = (reason: ErrorOptions['cause']) => finish(() => reject(reason));\n // A submission without respondWith() resolves to null, as in Chromium; an undefined\n // response maps to null as well so that upstream can serialize the result.\n const settleResponse = (response: Promise<WebMcpToolResult>) => {\n // Once the page has responded, unregistering the form no longer cancels the call.\n if (registration.cancelPending === cancel) delete registration.cancelPending;\n response.then(\n (value) => finish(() => resolve(value ?? null)),\n (cause: ErrorOptions['cause']) => finish(() => reject(cause))\n );\n };\n const onInvalid = (event: Event) => {\n if (!event.isTrusted) return;\n queueMicrotask(() => {\n if (!checkFormValidity(form)) cancel(executionError());\n });\n };\n const onAbort = () => {\n finish(() => {\n context.dispatchEvent(lifecycleEvent('toolcancel', definition.name));\n reject(signal.reason);\n });\n };\n\n activeSubmissions.set(form, {\n // A trusted dispatch runs a microtask checkpoint after each listener, so only a\n // task observes the event after the form's own listeners have run (#342).\n complete(event) {\n setTimeout(() => {\n const response = agentResponses.get(event);\n if (response) settleResponse(response);\n else if (event.defaultPrevented) cancel(executionError());\n else finish(() => resolve(null));\n });\n },\n direct() {\n finish(() => resolve(null));\n },\n respond(event) {\n queueMicrotask(() => {\n const response = agentResponses.get(event);\n if (response) settleResponse(response);\n });\n },\n });\n registration.cancelPending = cancel;\n EventTarget.prototype.addEventListener.call(form, 'invalid', onInvalid, true);\n signal.addEventListener('abort', onAbort, { once: true });\n\n if (!definition.autosubmit) {\n submitter?.focus();\n context.dispatchEvent(lifecycleEvent('toolactivated', definition.name));\n return;\n }\n try {\n requestFormSubmit(form, submitter);\n context.dispatchEvent(lifecycleEvent('toolactivated', definition.name));\n } catch (error) {\n cancel(error);\n }\n });\n}\n\n/** Adds declarative tools until the vendored upstream implements them. */\nexport function installWebMCPDeclarativeExtensions(context: WebMCP.ModelContext): void {\n const prototype = SubmitEvent.prototype;\n // Native support and earlier bundle installations already own these hooks.\n if ('agentInvoked' in prototype && 'respondWith' in prototype) return;\n\n if (!('agentInvoked' in prototype)) {\n Object.defineProperty(prototype, 'agentInvoked', {\n configurable: true,\n enumerable: true,\n get(this: SubmitEvent) {\n return isAgentInvokedSubmitEvent(this);\n },\n });\n }\n\n if (!('respondWith' in prototype)) {\n Object.defineProperty(prototype, 'respondWith', {\n configurable: true,\n enumerable: true,\n writable: true,\n value(this: SubmitEvent, agentResponse: Promise<WebMcpToolResult>) {\n respondWithAgentSubmitEvent(this, agentResponse);\n },\n });\n }\n\n const registrations = new Map<HTMLFormElement, DeclarativeRegistration>();\n const blockedDefinitions = new Map<HTMLFormElement, string>();\n const observers = new Map<Document | ShadowRoot, MutationObserver>();\n const onSubmit = (event: Event) => {\n if (\n !(event instanceof SubmitEvent) ||\n !event.isTrusted ||\n !(event.target instanceof HTMLFormElement)\n ) {\n return;\n }\n // Only a form with a running tool call submits on the agent's behalf; marking\n // every trusted submit would report agentInvoked for ordinary user submissions.\n const submission = activeSubmissions.get(event.target);\n if (!submission) return;\n agentInvokedEvents.add(event);\n submission.complete(event);\n };\n\n const onReset = (event: Event) => {\n if (!event.isTrusted || !(event.target instanceof HTMLFormElement)) return;\n const form = event.target;\n // Task, not microtask: see complete().\n setTimeout(() => {\n if (event.defaultPrevented) return;\n registrations.get(form)?.cancelPending?.(executionError());\n });\n };\n\n function stopObservingRoot(root: Document | ShadowRoot): void {\n observers.get(root)?.disconnect();\n observers.delete(root);\n root.removeEventListener('reset', onReset, true);\n root.removeEventListener('submit', onSubmit, true);\n }\n\n function observeRoot(root: Document | ShadowRoot): void {\n if (observers.has(root)) return;\n const observer = new MutationObserver(sync);\n observers.set(root, observer);\n observer.observe(root, {\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true,\n });\n root.addEventListener('reset', onReset, true);\n // ponytail: submit is composed:false, so per-root capture sees every submission; hook\n // window capture too if a page listener ever stops propagation before this one.\n root.addEventListener('submit', onSubmit, true);\n }\n\n function sync(): void {\n observeRoot(document);\n for (const root of observers.keys()) {\n if (root instanceof ShadowRoot && !root.host.isConnected) {\n stopObservingRoot(root);\n }\n }\n\n const candidates = new Set<HTMLFormElement>();\n const selected = new Map<\n HTMLFormElement,\n { definition: DeclarativeToolDefinition; fingerprint: string }\n >();\n const selectedByName = new Map<string, HTMLFormElement>();\n for (const root of observers.keys()) {\n for (const element of root.querySelectorAll('*')) {\n const shadowRoot = getOpenShadowRoot(element);\n if (shadowRoot) observeRoot(shadowRoot);\n\n if (\n !(element instanceof HTMLFormElement) ||\n !formHasAttribute(element, 'toolname') ||\n !formHasAttribute(element, 'tooldescription') ||\n !isConnected(element)\n ) {\n continue;\n }\n const form = element;\n candidates.add(form);\n const definition = toolDefinition(form);\n const fingerprint = JSON.stringify(definition);\n const blockedFingerprint = blockedDefinitions.get(form);\n if (blockedFingerprint === fingerprint) continue;\n blockedDefinitions.delete(form);\n const existingForm = selectedByName.get(definition.name);\n if (existingForm) {\n // A duplicate name stays blocked until its definition changes, then takes over.\n if (blockedFingerprint === undefined) {\n blockedDefinitions.set(form, fingerprint);\n continue;\n }\n const existingSelection = selected.get(existingForm);\n if (existingSelection)\n blockedDefinitions.set(existingForm, existingSelection.fingerprint);\n selected.delete(existingForm);\n }\n selectedByName.set(definition.name, form);\n selected.set(form, { definition, fingerprint });\n }\n }\n for (const form of blockedDefinitions.keys()) {\n if (!candidates.has(form)) blockedDefinitions.delete(form);\n }\n\n for (const [form, registration] of registrations) {\n const fingerprint = selected.get(form)?.fingerprint;\n if (fingerprint !== registration.fingerprint) {\n registration.cancelPending?.(executionError());\n registration.controller.abort();\n registrations.delete(form);\n }\n }\n\n for (const [form, { definition, fingerprint }] of selected) {\n if (registrations.has(form)) continue;\n const controller = new AbortController();\n const registration: DeclarativeRegistration = {\n controller,\n fingerprint,\n form,\n };\n registrations.set(form, registration);\n void context\n .registerTool(\n {\n name: definition.name,\n title: definition.title,\n description: definition.description,\n inputSchema: definition.inputSchema,\n execute(input: WebMcpToolInput, options: WebMCP.ToolExecuteCallbackOptions) {\n const submitter = findSubmitter(form);\n if (!definition.autosubmit && !submitter) throw executionError();\n fillForm(form, input);\n return waitForSubmission(\n context,\n registration,\n definition,\n submitter,\n options.signal\n );\n },\n },\n { signal: controller.signal }\n )\n .catch((cause: ErrorOptions['cause']) => {\n controller.abort();\n // Invalid toolname/tooldescription attributes reject here. Without this the\n // form silently never becomes a tool, with no diagnostic in any channel.\n // Aborts are ordinary teardown, not a failure worth reporting.\n if (cause instanceof DOMException && cause.name === 'AbortError') return;\n console.error(\n `[webmcp] declarative form tool \"${definition.name}\" was not registered:`,\n cause\n );\n });\n }\n }\n\n const attachShadowDescriptor = Object.getOwnPropertyDescriptor(Element.prototype, 'attachShadow');\n if (attachShadowDescriptor?.configurable) {\n const nativeAttachShadow = Element.prototype.attachShadow;\n const attachShadow = function (this: Element, init: ShadowRootInit): ShadowRoot {\n const root = nativeAttachShadow.call(this, init);\n if (\n root.mode === 'open' &&\n Object.getOwnPropertyDescriptor(Node.prototype, 'ownerDocument')?.get?.call(this) ===\n document &&\n isConnected(this)\n ) {\n observeRoot(root);\n }\n return root;\n };\n Object.defineProperty(Element.prototype, 'attachShadow', {\n ...attachShadowDescriptor,\n value: attachShadow,\n });\n }\n\n const submitDescriptor = Object.getOwnPropertyDescriptor(HTMLFormElement.prototype, 'submit');\n if (submitDescriptor?.configurable) {\n const nativeSubmit = HTMLFormElement.prototype.submit;\n const submit = function (this: HTMLFormElement): void {\n nativeSubmit.call(this);\n activeSubmissions.get(this)?.direct();\n };\n Object.defineProperty(HTMLFormElement.prototype, 'submit', {\n ...submitDescriptor,\n value: submit,\n });\n }\n\n // ponytail: a whole-tree rescan keeps DOM ownership obvious; index forms if this\n // becomes measurable on pages with thousands of annotated controls.\n sync();\n}\n","/*!\n * Copyright (c) 2026 WebMCP polyfill contributors\n * SPDX-License-Identifier: MIT\n */\n\nimport type { WebMCP } from \"webmcp-types\";\nimport {\n FrameBridge,\n activeWindow,\n annotationNames,\n executionError,\n readToolsPolicy,\n type ToolMetadata,\n} from \"./frames.js\";\nexport type { WebMCP } from \"webmcp-types\";\n\n// Detached windows may stop exposing these bindings.\nconst NativeDOMException = globalThis.DOMException;\nconst getWindow = Object.getOwnPropertyDescriptor(globalThis, \"window\")?.get;\n\ninterface StoredTool {\n metadata: ToolMetadata;\n execute: WebMCP.ToolExecuteCallback<object>;\n exposedTo: string[];\n}\n\nconst contexts = new WeakMap<Document, ModelContextPolyfill>();\n\n/**\n * Install WebMCP in the current window.\n *\n * Does nothing outside a secure browser context or when `document.modelContext`\n * already exists, including partial native implementations. Call before registering\n * tools in each frame; repeated calls preserve existing contexts and registrations.\n *\n * Installing joins cross-frame discovery: the window listens for the polyfill's messages and\n * announces itself to the other frames of its tree.\n *\n * @throws {TypeError} If the window or Document prototype prevents installation.\n * @example\n * import { installWebMCP } from \"webmcp-polyfill\";\n * installWebMCP();\n *\n * @see https://webmachinelearning.github.io/webmcp/#document-extension\n * @see https://github.com/webmachinelearning/webmcp-polyfill/blob/main/TESTING.md\n */\nexport function installWebMCP(): void {\n if (typeof document === \"undefined\" || !globalThis.isSecureContext) {\n return;\n }\n if (\"modelContext\" in document) {\n return;\n }\n\n const documentPrototype = Document.prototype;\n const getDefaultView = Object.getOwnPropertyDescriptor(documentPrototype, \"defaultView\")!.get!;\n const constructorDescriptor = Object.getOwnPropertyDescriptor(globalThis, \"ModelContext\");\n if (\n !Object.isExtensible(documentPrototype) ||\n (constructorDescriptor && !constructorDescriptor.configurable) ||\n (!constructorDescriptor && !Object.isExtensible(globalThis))\n ) {\n throw new TypeError(\"Cannot install WebMCP on this realm\");\n }\n\n Object.defineProperty(globalThis, \"ModelContext\", {\n value: modelContextConstructor,\n configurable: true,\n writable: true,\n });\n\n // A method is non-constructible; defaultView supplies the native Document brand check.\n const { getModelContext } = {\n getModelContext(this: Document): WebMCP.ModelContext {\n getDefaultView.call(this);\n let context = contexts.get(this);\n if (!context) {\n context = new ModelContextPolyfill(this);\n contexts.set(this, context);\n }\n return context;\n },\n };\n Object.defineProperty(getModelContext, \"name\", { value: \"get modelContext\" });\n Object.defineProperty(documentPrototype, \"modelContext\", {\n configurable: true,\n enumerable: true,\n get: getModelContext,\n });\n // Frames must answer discovery even before their first local API call.\n void document.modelContext;\n}\n\nclass ModelContextPolyfill extends EventTarget implements WebMCP.ModelContext {\n readonly #document: Document;\n readonly #tools = new Map<string, StoredTool>();\n // Only a document that was active when its context was created has a bridge.\n readonly #frames?: FrameBridge;\n #toolchangeHandler: WebMCP.ModelContext[\"ontoolchange\"] = null;\n readonly #toolchangeListener = (event: Event): void => {\n const handler = this.#toolchangeHandler;\n // An EventHandler keeps a non-callable object but never invokes it.\n if (typeof handler !== \"function\") {\n return;\n }\n const result = Reflect.apply(handler, this, [event]);\n if (result === false) {\n Event.prototype.preventDefault.call(event);\n }\n };\n\n constructor(owner: Document) {\n super();\n this.#document = owner;\n const view = activeWindow(owner);\n if (!view) {\n return;\n }\n this.#frames = new FrameBridge(view, {\n getTools: (callerOrigin) => this.#exposedTools(callerOrigin),\n execute: (callerOrigin, name, serializedInput, signal) => {\n const ownerOrigin = requireActiveWindow(owner).origin;\n return this.#executeLocal(name, serializedInput, ownerOrigin, callerOrigin, signal);\n },\n changed: () => this.#queueToolChange(),\n });\n }\n\n get ontoolchange(): WebMCP.ModelContext[\"ontoolchange\"] {\n return this.#toolchangeHandler;\n }\n\n set ontoolchange(handler: WebMCP.ModelContext[\"ontoolchange\"]) {\n // [LegacyTreatNonObjectAsNull]: only a non-object becomes null.\n const nextHandler = isObject(handler) ? handler : null;\n // Replacing a handler preserves its listener position; clearing it removes that position.\n if (!this.#toolchangeHandler && nextHandler) {\n this.addEventListener(\"toolchange\", this.#toolchangeListener);\n }\n if (this.#toolchangeHandler && !nextHandler) {\n this.removeEventListener(\"toolchange\", this.#toolchangeListener);\n }\n this.#toolchangeHandler = nextHandler;\n }\n\n // Default parameters preserve Web IDL's required-argument counts in function.length.\n // Each operation reads #document first, so an invalid receiver throws before arguments are read.\n async registerTool(\n tool: object,\n options: WebMCP.ModelContextRegisterToolOptions = {},\n ): Promise<void> {\n const ownerDocument = this.#document;\n const { name, title, description, annotations, inputSchema, execute } =\n readToolDefinition(tool);\n const settings = readDictionary(options);\n const exposedTo = readOriginSequence(settings.exposedTo);\n const registrationSignal = readAbortSignal(settings.signal);\n\n requireActiveWindow(ownerDocument);\n const requireUnusedName = (): void => {\n if (this.#tools.has(name)) {\n throw new NativeDOMException(\n `A tool named ${name} is already registered`,\n \"InvalidStateError\",\n );\n }\n };\n\n // Duplicate, then name, then description: the draft's order.\n requireUnusedName();\n if (!/^[A-Za-z0-9_.-]{1,128}$/u.test(name)) {\n throw new NativeDOMException(\n `Tool names are 1 to 128 characters of ASCII alphanumerics, \"_\", \"-\" or \".\": ${name}`,\n \"InvalidStateError\",\n );\n }\n if (!description) {\n throw new NativeDOMException(\"A tool description cannot be empty\", \"InvalidStateError\");\n }\n const serializedSchema = inputSchema === undefined ? undefined : serializeJSON(inputSchema);\n registrationSignal?.throwIfAborted();\n const exposedOrigins = parseOrigins(exposedTo);\n\n const storedTool: StoredTool = {\n metadata: { name, title, description, annotations, serializedSchema },\n execute,\n exposedTo: exposedOrigins,\n };\n\n const frames = await this.#requireFrames();\n registrationSignal?.throwIfAborted();\n // Another registration can complete while frame permissions are being checked.\n requireUnusedName();\n\n return new Promise<void>((resolve, reject) => {\n // Abort unregisters the tool and also rejects any pending registration.\n registrationSignal?.addEventListener(\n \"abort\",\n () => {\n this.#tools.delete(name);\n void frames.notify(exposedOrigins);\n reject(registrationSignal.reason);\n },\n { once: true },\n );\n\n this.#tools.set(name, storedTool);\n frames.notify(exposedOrigins).then(resolve, reject);\n });\n }\n\n async getTools(\n options: WebMCP.ModelContextGetToolOptions = {},\n ): Promise<WebMCP.RegisteredTool[]> {\n const ownerDocument = this.#document;\n const settings = readDictionary(options);\n const fromOrigins = readOriginSequence(settings.fromOrigins);\n\n requireActiveWindow(ownerDocument);\n const frames = await this.#requireFrames();\n const requestedOrigins = parseOrigins(fromOrigins);\n\n const tools = await frames.getTools(requestedOrigins);\n\n // Compare code units; localeCompare() would change the draft's sort order.\n tools.sort((left, right) => {\n if (left.name === right.name) {\n return 0;\n }\n return left.name < right.name ? -1 : 1;\n });\n\n // The draft resolves from a queued task.\n return new Promise((resolve) => {\n queueTask(() => resolve(tools));\n });\n }\n\n async executeTool(\n tool: WebMCP.RegisteredTool,\n inputObject: object = {},\n options: WebMCP.ModelContextExecuteToolOptions = {},\n ): Promise<string> {\n const ownerDocument = this.#document;\n const target = readExecutionTarget(tool);\n const settings = readDictionary(options);\n const callerSignal = readAbortSignal(settings.signal);\n\n requireActiveWindow(ownerDocument);\n const expectedOrigin = URL.parse(target.origin)?.origin;\n if (!expectedOrigin || expectedOrigin === \"null\") {\n throw new NativeDOMException(\"Invalid or opaque origin\", \"NotSupportedError\");\n }\n if (!isObject(inputObject)) {\n throw new TypeError(\"inputObject must be an object\");\n }\n\n const serializedInput = serializeJSON(inputObject);\n callerSignal?.throwIfAborted();\n const frames = await this.#requireFrames();\n callerSignal?.throwIfAborted();\n const callerWindow = requireActiveWindow(ownerDocument);\n if (target.window !== callerWindow) {\n return frames.execute(\n target.window,\n expectedOrigin,\n target.name,\n serializedInput,\n callerSignal,\n );\n }\n\n return this.#executeLocal(\n target.name,\n serializedInput,\n expectedOrigin,\n callerWindow.origin,\n callerSignal,\n );\n }\n\n #executeLocal(\n name: string,\n serializedInput: string,\n expectedOrigin: string,\n callerOrigin: string,\n callerSignal?: AbortSignal,\n ): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n callerSignal?.throwIfAborted();\n const callbackController = new AbortController();\n // A callback that already finished must not be aborted by a late cancellation.\n let callbackFinished = false;\n\n const onCallerAbort = (): void => {\n reject(callerSignal!.reason);\n\n // Reject the caller first; the running callback receives a default AbortError.\n queueTask(() => {\n if (!callbackFinished) {\n callbackController.abort();\n }\n });\n };\n\n const rejectExecution = (): void => {\n callbackFinished = true;\n queueTask(() => {\n callerSignal?.removeEventListener(\"abort\", onCallerAbort);\n reject(executionError());\n });\n };\n\n const completeExecution = (value: unknown): void => {\n callbackFinished = true;\n // A cancelled call must not run the author's toJSON during serialization.\n if (callerSignal?.aborted) {\n return;\n }\n\n try {\n const serializedResult = serializeJSON(value);\n queueTask(() => {\n callerSignal?.removeEventListener(\"abort\", onCallerAbort);\n resolve(serializedResult);\n });\n } catch {\n rejectExecution();\n }\n };\n\n const dispatchTool = (): void => {\n if (callerSignal?.aborted) {\n return;\n }\n\n try {\n const ownerWindow = requireActiveWindow(this.#document);\n const storedTool = this.#tools.get(name);\n if (\n !storedTool ||\n expectedOrigin !== ownerWindow.origin ||\n !isExposedTo(storedTool, ownerWindow.origin, callerOrigin)\n ) {\n rejectExecution();\n return;\n }\n\n const input: unknown = JSON.parse(serializedInput);\n if (!isObject(input)) {\n rejectExecution();\n return;\n }\n\n // The callback runs without the registration object as its receiver.\n const execute = storedTool.execute;\n const callbackResult = execute(input, { signal: callbackController.signal });\n Promise.resolve(callbackResult).then(completeExecution, rejectExecution);\n } catch {\n rejectExecution();\n }\n };\n\n callerSignal?.addEventListener(\"abort\", onCallerAbort, { once: true });\n queueTask(dispatchTool);\n });\n }\n\n async #requireFrames(): Promise<FrameBridge> {\n const frames = this.#frames;\n if (!frames || !(await frames.allowed())) {\n throw new NativeDOMException(\"WebMCP is disabled by Permissions Policy\", \"NotAllowedError\");\n }\n requireActiveWindow(this.#document);\n return frames;\n }\n\n #exposedTools(callerOrigin: string): ToolMetadata[] {\n const ownerOrigin = requireActiveWindow(this.#document).origin;\n const exposed = [];\n for (const storedTool of this.#tools.values()) {\n if (!isExposedTo(storedTool, ownerOrigin, callerOrigin)) {\n continue;\n }\n exposed.push(storedTool.metadata);\n }\n return exposed;\n }\n\n #queueToolChange(): Promise<void> {\n return new Promise((resolve) => {\n queueTask(() => {\n this.dispatchEvent(new Event(\"toolchange\"));\n resolve();\n });\n });\n }\n}\n\nfunction isExposedTo(tool: StoredTool, ownerOrigin: string, callerOrigin: string): boolean {\n return ownerOrigin === callerOrigin || tool.exposedTo.includes(callerOrigin);\n}\n\n// Web IDL exposes a non-constructible interface with enumerable prototype members.\nconst modelContextConstructor = function ModelContext(): never {\n throw new TypeError(\"Illegal constructor\");\n};\n// Preserve the public name through minification.\nObject.defineProperty(modelContextConstructor, \"name\", { value: \"ModelContext\" });\nObject.defineProperty(modelContextConstructor, \"prototype\", {\n value: ModelContextPolyfill.prototype,\n writable: false,\n});\nObject.setPrototypeOf(modelContextConstructor, EventTarget);\nObject.defineProperties(ModelContextPolyfill.prototype, {\n constructor: { value: modelContextConstructor, configurable: true, writable: true },\n [Symbol.toStringTag]: { value: \"ModelContext\", configurable: true },\n registerTool: { enumerable: true },\n getTools: { enumerable: true },\n executeTool: { enumerable: true },\n ontoolchange: { enumerable: true },\n});\n\n// Web IDL reads and converts dictionary members in lexicographical order.\nfunction readToolDefinition(value: unknown) {\n const descriptor = readDictionary(value);\n const annotations = readAnnotations(descriptor.annotations);\n const description = toDOMString(requireMember(descriptor.description, \"description\"));\n const callback = requireMember(descriptor.execute, \"execute\");\n if (typeof callback !== \"function\") {\n throw new TypeError(\"execute must be a function\");\n }\n // SAFETY: callability is checked above; inputs and results are converted at invocation.\n const execute = callback as WebMCP.ToolExecuteCallback<object>;\n const inputSchema = readInputSchema(descriptor.inputSchema);\n const name = toDOMString(requireMember(descriptor.name, \"name\"));\n const rawTitle = descriptor.title;\n const title = rawTitle === undefined ? \"\" : toUSVString(rawTitle);\n\n return { name, title, description, annotations, inputSchema, execute };\n}\n\n// Convert the whole RegisteredTool dictionary, even members not used for dispatch.\nfunction readExecutionTarget(value: unknown) {\n const descriptor = readDictionary(value);\n readAnnotations(descriptor.annotations);\n toDOMString(requireMember(descriptor.description, \"description\"));\n readInputSchema(descriptor.inputSchema);\n const name = toDOMString(requireMember(descriptor.name, \"name\"));\n const origin = toUSVString(requireMember(descriptor.origin, \"origin\"));\n const title = descriptor.title;\n if (title !== undefined) {\n toDOMString(title);\n }\n const targetWindow = requireMember(descriptor.window, \"window\");\n if (!isObject(targetWindow)) {\n throw new TypeError(\"window must be a Window\");\n }\n getWindow!.call(targetWindow);\n\n // SAFETY: the native getter above validated the Window brand without changing identity.\n return { name, origin, window: targetWindow as Window };\n}\n\nfunction readInputSchema(value: unknown): object | undefined {\n if (value !== undefined && !isObject(value)) {\n throw new TypeError(\"inputSchema must be an object\");\n }\n return value;\n}\n\nfunction isObject(value: unknown): value is object {\n return (typeof value === \"object\" && value !== null) || typeof value === \"function\";\n}\n\n// https://webidl.spec.whatwg.org/#es-dictionary\nfunction readDictionary(value: unknown): Record<PropertyKey, unknown> {\n if (value == null) {\n return {};\n }\n if (!isObject(value)) {\n throw new TypeError(\"Expected a dictionary\");\n }\n // SAFETY: the object check permits property reads; each member still needs conversion.\n return value as Record<PropertyKey, unknown>;\n}\n\nfunction readAnnotations(value: unknown): WebMCP.ToolAnnotations | undefined {\n if (value === undefined) {\n return undefined;\n }\n const dictionary = readDictionary(value);\n const annotations: WebMCP.ToolAnnotations = {};\n for (const name of annotationNames) {\n annotations[name] = Boolean(dictionary[name]);\n }\n return annotations;\n}\n\n// https://webidl.spec.whatwg.org/#es-DOMString\nfunction toDOMString(value: unknown): string {\n if (typeof value === \"symbol\") {\n throw new TypeError(\"Cannot convert a Symbol to a string\");\n }\n return String(value);\n}\n\n// https://webidl.spec.whatwg.org/#es-USVString\nfunction toUSVString(value: unknown): string {\n return toDOMString(value).toWellFormed();\n}\n\nfunction requireMember(value: unknown, name: string): unknown {\n if (value === undefined) {\n throw new TypeError(`${name} is required`);\n }\n return value;\n}\n\nfunction serializeJSON(value: unknown): string {\n const result = JSON.stringify(value);\n if (result === undefined) {\n throw new TypeError(\"Value is not JSON-serializable\");\n }\n return result;\n}\n\nfunction readAbortSignal(value: unknown): AbortSignal | undefined {\n if (value === undefined) {\n return undefined;\n }\n // SAFETY: any() validates the native brand across realms before we use the signal.\n // Composition also survives stopImmediatePropagation() on the original signal.\n return AbortSignal.any([value as AbortSignal]);\n}\n\n// https://webidl.spec.whatwg.org/#es-sequence\nfunction readOriginSequence(value: unknown): string[] {\n if (value === undefined) {\n return [];\n }\n if (!isObject(value)) {\n throw new TypeError(\"Origins must be a sequence\");\n }\n const getIterator = readDictionary(value)[Symbol.iterator];\n if (typeof getIterator !== \"function\") {\n throw new TypeError(\"Origins must be a sequence\");\n }\n // Use the cached method and original receiver without reading the method's own properties.\n const iterable = {\n [Symbol.iterator]() {\n const iterator: unknown = Reflect.apply(getIterator, value, []);\n if (!isObject(iterator)) {\n throw new TypeError(\"Iterator must be an object\");\n }\n const next = readDictionary(iterator).next;\n if (typeof next !== \"function\") {\n throw new TypeError(\"Iterator next must be a function\");\n }\n // Web IDL does not close the iterator when an item's conversion fails.\n return {\n next() {\n return Reflect.apply(next, iterator, []);\n },\n };\n },\n };\n return Array.from(iterable, toUSVString);\n}\n\nfunction parseOrigins(origins: string[]): string[] {\n return origins.map((value) => {\n // A blob: URL carries its creator's origin.\n const origin = URL.parse(value)?.origin;\n if (origin === undefined) {\n throw new NativeDOMException(\"Invalid origin\", \"SecurityError\");\n }\n // An opaque origin, such as a file: URL's, serializes as \"null\" and does not parse.\n const url = URL.parse(origin);\n if (!url || !isPotentiallyTrustworthy(url)) {\n throw new NativeDOMException(\"Origin is not potentially trustworthy\", \"SecurityError\");\n }\n return origin;\n });\n}\n\n// https://w3c.github.io/webappsec-secure-contexts/#is-origin-trustworthy\n// Scheme and host checks cannot recognize browser-specific trusted origins.\nfunction isPotentiallyTrustworthy({ protocol, hostname }: URL): boolean {\n if ([\"https:\", \"wss:\"].includes(protocol)) {\n return true;\n }\n const isLoopback =\n hostname === \"[::1]\" ||\n // URL canonicalizes numeric hosts; exclude domains such as 127.example.test.\n /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/.test(hostname);\n const isLocalhost =\n hostname === \"localhost\" ||\n hostname === \"localhost.\" ||\n hostname.endsWith(\".localhost\") ||\n hostname.endsWith(\".localhost.\");\n return [\"http:\", \"ws:\"].includes(protocol) && (isLoopback || isLocalhost);\n}\n\nfunction requireActiveWindow(owner: Document): Window {\n const view = activeWindow(owner);\n if (!view) {\n throw new NativeDOMException(\"The document is not fully active\", \"InvalidStateError\");\n }\n\n // Synchronous where the browser exposes the policy; FrameBridge.allowed() covers the rest.\n if (readToolsPolicy(owner) === false) {\n throw new NativeDOMException(\"WebMCP is disabled by Permissions Policy\", \"NotAllowedError\");\n }\n return view;\n}\n\n// Message tasks approximate the WebMCP task source. Chained zero-delay timers are clamped to\n// 4 ms, and one port keeps the tasks in order. Created on first use so an import stays inert.\nlet taskPort: MessagePort | undefined;\nconst queuedTasks: (() => void)[] = [];\n\nfunction queueTask(callback: () => void): void {\n if (!taskPort) {\n const channel = new MessageChannel();\n channel.port1.onmessage = () => queuedTasks.shift()?.();\n taskPort = channel.port2;\n }\n queuedTasks.push(callback);\n taskPort.postMessage(undefined);\n}\n","import type { WebMCP } from './upstream/index.js';\n\nimport { installWebMCPDeclarativeExtensions } from './declarative-forms.js';\nimport { installWebMCP as installUpstream } from './upstream/index.js';\n\nexport type { WebMCP } from './upstream/index.js';\n\n/**\n * Installs upstream WebMCP and the temporary declarative tools layer.\n * Engines missing an API the vendored core calls are left untouched: upstream defines\n * the document getter before it constructs the context, so a failed construction would\n * leave `document.modelContext` throwing.\n */\nexport function installWebMCP(): void {\n if (typeof document === 'undefined' || !globalThis.isSecureContext) return;\n if (\n typeof Promise.withResolvers !== 'function' ||\n typeof AbortSignal.any !== 'function' ||\n typeof String.prototype.toWellFormed !== 'function' ||\n typeof URL.parse !== 'function'\n ) {\n return;\n }\n installUpstream();\n const context = document.modelContext;\n if (context) installWebMCPDeclarativeExtensions(context);\n}\n\ndeclare global {\n interface SubmitEvent {\n readonly agentInvoked?: boolean;\n respondWith?(agentResponse: Promise<unknown>): void;\n }\n\n /** Web IDL interface object used for branding and `instanceof`. */\n var ModelContext:\n | (Function & {\n readonly prototype: WebMCP.ModelContext;\n [Symbol.hasInstance](\n value: Parameters<Function[typeof Symbol.hasInstance]>[0]\n ): value is WebMCP.ModelContext;\n })\n | undefined;\n}\n"],"mappings":";AAWA,MAAa,kBAAkB;CAC7B;CACA;CACA;CACA;AACF;AA0BA,MAAM,WAAW;AAEjB,MAAM,WAAW;AACjB,MAAMA,uBAAqB,WAAW;AAEtC,IAAa,cAAb,MAAyB;CACvB,AAASC;CACT,AAASC;CACT,AAASC;CAGT,AAASC,8BAAc,IAAI,IAAY;CAEvC,AAASC,8BAAc,IAAI,IAAY;CACvC,AAASC,WAAW,QAAQ,cAAoB;CAChD,AAASC,8BAAc,IAAI,IAAoD;CAC/E,AAASC,4BAAY,IAAI,IAAa;CACtC;CACA,UAAU;CAEV,YAAY,MAAc,UAAoB;EAC5C,KAAKN,UAAU;EACf,KAAKD,YAAY,KAAK;EACtB,KAAKE,YAAY;EACjB,KAAKD,QAAQ,iBAAiB,YAAY,UAAU,KAAKO,SAAS,KAAK,GAAG,IAAI;EAC9E,KAAKP,QAAQ,iBAAiB,kBAAkB;GAC9C,KAAKQ,UAAU;GACf,KAAK,MAAM,WAAW,KAAKF,WACzB,QAAQ,IAAI;EAEhB,CAAC;EACD,KAAKN,QAAQ,iBAAiB,aAAa,UAAU;GAEnD,IAAI,MAAM,WAAW;IACnB,KAAKQ,UAAU;IACf,KAAKC,UAAU;GACjB;EACF,CAAC;EAED,KAAK,MAAM,SAAS,KAAKA,UAAU,GACjC,KAAKN,YAAY,IAAI,KAAK;EAE5B,IAAI,KAAKA,YAAY,SAAS,GAC5B,KAAKC,SAAS,QAAQ;OAEtB,iBAAiB;GACf,KAAKD,YAAY,MAAM;GACvB,KAAKC,SAAS,QAAQ;EACxB,GAAG,QAAQ;CAEf;CAEA,MAAM,UAA4B;EAChC,IAAI,KAAKI,SACP,OAAO;EAET,OAAO,KAAKE,iBAAiB,KAAKX,SAAS;CAC7C;CAEA,MAAM,SAAS,aAAyD;EACtE,MAAM,KAAKK,SAAS;EACpB,MAAM,YAAY,KAAKJ,QAAQ;EAC/B,MAAM,UAAU,CAAC,WAAW,GAAG,WAAW;EAwB1C,QAAO,MAvBe,QAAQ,IAC5B,KAAKW,cAAc,EAAE,IAAI,OAAO,SAAS;GACvC,IAAI,SAAS,KAAKX,SAChB,OAAO,KAAKC,UACT,SAAS,SAAS,EAClB,KAAK,aAAa,iBAAiB,UAAU,KAAKD,SAAS,SAAS,CAAC;GAE1E,IAAI;IACF,MAAM,QAAQ,MAAM,KAAKY,SAAS,MAAM,SAAS,EAAE,MAAM,WAAW,CAAC;IACrE,IAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,GAC5B,MAAM,IAAI,UAAU,qCAAqC;IAE3D,OAAO,MAAM,MAAM,KAAK,UACtB,iBAAiB,iBAAiB,KAAK,GAAG,MAAM,MAAM,MAAM,CAC9D;GACF,SAAS,OAAO;IACd,IAAI,EAAE,iBAAiBd,wBAAsB,MAAM,SAAS,iBAC1D,QAAQ,KAAK,8CAA8C,KAAK;IAElE,OAAO,CAAC;GACV;EACF,CAAC,CACH,GACe,KAAK;CACtB;CAEA,MAAM,QACJ,QACA,gBACA,MACA,iBACA,QACiB;EACjB,MAAM,QAAQ,MAAM,KAAKc,SACvB,QACA,CAAC,cAAc,GACf;GAAE,MAAM;GAAW;GAAM,OAAO;EAAgB,GAChD,MACF;EACA,IAAI,OAAO,MAAM,UAAU,UACzB,MAAM,eAAe;EAEvB,OAAO,MAAM;CACf;CAEA,MAAM,OAAO,WAAoC;EAC/C,MAAM,KAAKR,SAAS;EACpB,MAAM,UAAU,CAAC,KAAKJ,QAAQ,QAAQ,GAAG,SAAS;EAElD,KAAK,MAAM,QAAQ,KAAKW,cAAc,GAAG;GACvC,IAAI,SAAS,KAAKX,SAAS;IACzB,MAAM,KAAKC,UAAU,QAAQ;IAC7B;GACF;GACA,IAAI;IACF,MAAM,KAAKW,SAAS,MAAM,SAAS,EAAE,MAAM,UAAU,CAAC;GACxD,QAAQ,CAER;EACF;CACF;CAEA,SACE,QACA,SACA,SACA,QAC6C;EAC7C,OAAO,IAAI,SAAS,SAAS,WAAW;GACtC,QAAQ,eAAe;GACvB,IAAI,KAAKJ,WAAW,CAAC,KAAKK,SAAS,MAAM,GAAG;IAC1C,OAAO,eAAe,CAAC;IACvB;GACF;GAEA,MAAM,KAAK,OAAO,WAAW;GAC7B,MAAM,EAAE,OAAO,UAAU,IAAI,eAAe;GAC5C,IAAI;GAEJ,MAAM,cAAoB;IACxB,aAAa,KAAK;IAClB,aAAa;IACb,QAAQ,oBAAoB,SAAS,KAAK;IAC1C,KAAKR,YAAY,OAAO,EAAE;IAC1B,MAAM,MAAM;GACd;GACA,MAAM,QAAQ,QAAiB,eAAe,MAAY;IACxD,MAAM,YAAY,EAAE,MAAM,SAAS,CAAC;IACpC,MAAM;IACN,OAAO,KAAK;GACd;GACA,MAAM,cAAoB,KAAK,QAAQ,MAAM;GAC7C,MAAM,eAAqB;IACzB,IAAI,eAAe,QACjB,KAAKS,QAAQ,MAAM;IAErB,KAAK;GACP;GACA,MAAM,aAAa,UAAuC;IACxD,IAAI,MAAM,WAAW,QACnB;IAEF,KAAKT,YAAY,OAAO,EAAE;IAC1B,IAAI,WAAW,CAAC,QAAQ,SAAS,MAAM,MAAM,GAAG;KAC9C,KAAK;KACL;IACF;IACA,aAAa,MAAM;IACnB,aAAa,KAAK;IAClB,IAAI,QAAQ,SAAS,aAAa,QAAQ,SAAS,WACjD,QAAQ,WAAW,QAAQ,QAAQ;IAGrC,MAAM,YAAY,OAAO;GAC3B;GAEA,IAAI,QAAQ,WAAW,QAAQ,QAAQ;GACvC,MAAM,eAAe,KAAKU,OAAO,QAAQ,IAAI;GAC7C,MAAM,aAAa,UAAiC;IAClD,MAAM,QAAQ,OAAO,MAAM,IAAI;IAE/B,IAAI,OAAO,SAAS,SAAS;KAC3B,KAAK;KACL;IACF;IACA,IAAI,OAAO,SAAS,YAAY,eAAe,QAC7C;IAEF,MAAM;IACN,QAAQ;KAAE,OAAO,MAAM;KAAO,QAAQ;IAAW,CAAC;GACpD;GACA,MAAM,uBAAuB,KAAK;GAClC,QAAQ,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;GACvD,KAAKV,YAAY,IAAI,IAAI,SAAS;GAElC,IAAI;IACF,OAAO,YAAY,GAAG,SAAS,WAAW,MAAM,KAAK,CAAC,KAAK,CAAC;GAC9D,QAAQ;IACN,MAAM,MAAM;IACZ,KAAK;GACP;EACF,CAAC;CACH;CAEA,SAAS,OAAoC;EAC3C,MAAM,UAAU,kBAAkB,MAAM,IAAI;EAC5C,IAAI,CAAC,SACH;EAGF,MAAM,yBAAyB;EAC/B,MAAM,SAAS,MAAM;EACrB,IACE,CAAC,MAAM,aACP,CAAC,UACD,CAAC,SAAS,MAAM,KAChB,CAAC,KAAKQ,SAAS,MAAM,KAErB,MAAM,WAAW,UACjB,KAAKL,SAEL;EAGF,IAAI,QAAQ,SAAS,YAAY;GAC/B,MAAM,QAAQ,CAAC,KAAKN,YAAY,IAAI,MAAM;GAC1C,KAAKc,OAAO,MAAM;GAClB,OAAO,YAAY,GAAG,SAAS,WAAW,MAAM,MAAM;GAGtD,IAAI,CAAC,SAAS,KAAKhB,YAAY,KAAKA,QAAQ,KAC1C;GAEF,KAAK,MAAM,QAAQ,KAAKE,aAAa;IACnC,IAAI,SAAS,QACX;IAEF,KAAK,YAAY,GAAG,SAAS,WAAW,GAAG;GAC7C;GACA;EACF;EACA,IAAI,QAAQ,SAAS,WAAW;GAC9B,KAAKc,OAAO,MAAM;GAClB;EACF;EACA,IAAI,QAAQ,SAAS,WAAW;GAC9B,IAAI,WAAW,KAAKhB,QAAQ,KAC1B,KAAKS,UAAU;GAEjB;EACF;EACA,IAAI,QAAQ,SAAS,SAAS;GAC5B,KAAKJ,YAAY,IAAI,QAAQ,EAAE,IAAI,KAAK;GACxC;EACF;EACA,MAAM,CAAC,QAAQ,MAAM;EACrB,IAAI,QAAQ,SAAS,aAAa,CAAC,QAAQ,MAAM,CAAC,QAAQ,MAAM,MAAM,WAAW,GAC/E;EAEF,KAAKW,OAAO,MAAM;EAClB,KAAKC,QAAQ,QAAQ,MAAM,QAAQ,QAAQ,IAAI,IAAI;CACrD;CAEA,QAAQ,QAAgB,QAAgB,IAAY,MAAyB;EAC3E,MAAM,aAAa,IAAI,gBAAgB;EACvC,IAAI,YAAY;EAEhB,MAAM,cAAoB;GACxB,aAAa,KAAK;GAClB,aAAa;GACb,KAAK,MAAM;EACb;EACA,MAAM,eAAqB;GACzB,WAAW,MAAM;GACjB,MAAM;EACR;EACA,MAAM,aAAmB;GACvB,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAC;GAClC,OAAO;EACT;EAEA,MAAM,QAAQ,WAAW,MAAM,QAAQ;EACvC,MAAM,eAAe,KAAKF,OAAO,QAAQ,IAAI;EAE7C,KAAK,iBAAiB;EACtB,KAAK,YAAY,OAAO,UAAiC;GACvD,MAAM,UAAU,OAAO,MAAM,IAAI;GACjC,IAAI,SAAS,SAAS,UAAU;IAC9B,OAAO;IACP;GACF;GACA,IAAI,WACF;GAEF,YAAY;GACZ,aAAa,KAAK;GAClB,IAAI;IACF,MAAM,QAAQ,MAAM,KAAKG,SAAS,QAAQ,QAAQ,SAAS,WAAW,MAAM;IAC5E,KAAK,YAAY;KAAE,MAAM;KAAU;IAAM,CAAC;IAC1C,MAAM;GACR,QAAQ;IACN,KAAK;GACP;EACF;EACA,OAAO,YAAY,GAAG,SAAS,SAAS,MAAM,MAAM;CACtD;CAEA,MAAMA,SACJ,QACA,QACA,SACA,QACqB;EACrB,IAAI,CAAC,WAAW,CAAC,KAAKL,SAAS,MAAM,GACnC,MAAM,eAAe;EAEvB,IAAI,QAAQ,SAAS,cAAc;GACjC,MAAM,EAAE,YAAY,gBAAgB;GACpC,IACE,OAAO,eAAe,YACtB,CAAC,OAAO,UAAU,UAAU,KAC5B,aAAa,KACb,OAAO,gBAAgB,UAEvB,MAAM,eAAe;GAEvB,OAAO,KAAKM,iBAAiB,YAAY,WAAW;EACtD;EACA,IAAI,CAAE,MAAM,KAAK,QAAQ,KAAM,CAAE,MAAM,KAAKC,eAAe,QAAQ,MAAM,GACvE,MAAM,eAAe;EAGvB,IAAI,CAAC,KAAKP,SAAS,MAAM,GACvB,MAAM,eAAe;EAEvB,OAAO,eAAe;EACtB,IAAI,QAAQ,SAAS,YACnB,OAAO,KAAKZ,UAAU,SAAS,MAAM;EAEvC,IACE,QAAQ,SAAS,aACjB,OAAO,QAAQ,SAAS,YACxB,OAAO,QAAQ,UAAU,UAEzB,OAAO,KAAKA,UAAU,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,OAAO,MAAM;EAE3E,IAAI,QAAQ,SAAS,WAAW;GAC9B,MAAM,KAAKA,UAAU,QAAQ;GAC7B;EACF;EACA,MAAM,eAAe;CACvB;CAEA,MAAMkB,iBAAiB,YAAoB,aAAuC;EAEhF,MAAM,QAA4B,KAAKnB,QAAQ;EAC/C,OACE,UAAU,UACT,MAAM,KAAK,QAAQ,KACpB,aAAa,KAAKD,WAAW,OAAO,WAAW;CAEnD;CAEA,MAAMW,iBAAiB,OAAmC;EACxD,MAAM,OAAO,aAAa,KAAK;EAC/B,IAAI,CAAC,MACH,OAAO;EAET,MAAM,SAAS,gBAAgB,KAAK;EACpC,IAAI,WAAW,QACb,OAAO;EAET,IAAI,SAAS,KAAK,QAChB,OAAO;EAGT,MAAM,eAAe,KAAK,SAAS,kBAAkB;EACrD,MAAM,iBAAiB,aACrB,KAAK,QACL,iBAAiB,UAAa,iBAAiB,KAAK,MACtD;EACA,IAAI,CAAC,gBACH,OAAO,KAAKW,kBAAkB,MAAM,KAAK,MAAM;EAEjD,OACE,aAAa,gBAAgB,MAAM,KAAK,MAAM,KAC7C,MAAM,KAAKX,iBAAiB,cAAc;CAE/C;CAEA,MAAMU,eAAe,QAAgB,QAAkC;EACrE,MAAM,iBAAiB,aAAa,QAAQ,WAAW,KAAKpB,QAAQ,MAAM;EAC1E,OAAO,iBACH,KAAKU,iBAAiB,cAAc,IACpC,KAAKW,kBAAkB,QAAQ,MAAM;CAC3C;CAEA,MAAMA,kBAAkB,OAAe,QAAkC;EACvE,MAAM,SAAS,MAAM;EACrB,IAAI,WAAW,OACb,OAAO;EAET,IAAI,aAAa;EACjB,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SACzC,IAAI,OAAO,WAAW,OAAO;GAC3B,aAAa;GACb;EACF;EAEF,IAAI,aAAa,GACf,OAAO;EAET,IAAI,WAAW,KAAKrB,SAClB,OAAQ,MAAM,KAAK,QAAQ,KAAM,aAAa,KAAKD,WAAW,OAAO,MAAM;EAE7E,MAAM,KAAKK,SAAS;EAEpB,IAAI,CAAC,KAAKF,YAAY,IAAI,MAAM,GAC9B,OAAO;EAET,IAAI;GACF,MAAM,QAAQ,MAAM,KAAKU,SAAS,QAAQ,QAAW;IACnD,MAAM;IACN;IACA,aAAa;GACf,CAAC;GAED,OAAO,MAAM,UAAU,QAAS,MAAM,KAAKQ,eAAe,QAAQ,MAAM,MAAM;EAChF,QAAQ;GACN,OAAO;EACT;CACF;CAEA,SAAS,MAAuB;EAC9B,IAAI;GACF,OAAO,CAAC,KAAK,UAAU,SAAS,KAAKpB,WAAW,KAAK,QAAQ,KAAKA,QAAQ;EAC5E,QAAQ;GACN,OAAO;EACT;CACF;CAKA,QAAkB;EAChB,IAAI,KAAKA,QAAQ,QACf,OAAO,CAAC;EAEV,KAAK,MAAM,QAAQ,KAAKE,aACtB,IAAI,CAAC,KAAKW,SAAS,IAAI,GACrB,KAAKX,YAAY,OAAO,IAAI;EAGhC,MAAM,aAAa,CAAC,KAAKF,SAAS,GAAG,KAAKE,WAAW;EACrD,KACE,IAAI,WAAW,KAAKF,QAAQ,QAC5B,aAAa,SAAS,QACtB,WAAW,SAAS,QAEpB,WAAW,KAAK,QAAQ;EAG1B,MAAM,uBAAO,IAAI,IAAY;EAC7B,MAAM,UAAU,CAAC,KAAKA,QAAQ,GAAI;EAClC,OAAO,QAAQ,QAAQ;GACrB,MAAM,QAAQ,QAAQ,IAAI;GAC1B,IAAI,KAAK,IAAI,KAAK,GAChB;GAEF,KAAK,IAAI,KAAK;GACd,MAAM,WAAqB,CAAC;GAC5B,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;IACjD,MAAM,QAAQ,MAAM;IACpB,IAAI,OACF,SAAS,KAAK,KAAK;GAEvB;GACA,KAAK,MAAM,aAAa,YACtB,IAAI,cAAc,SAAS,UAAU,WAAW,SAAS,CAAC,SAAS,SAAS,SAAS,GACnF,SAAS,KAAK,SAAS;GAI3B,QAAQ,KAAK,GAAG,SAAS,QAAQ,CAAC;EACpC;EACA,OAAO,MAAM,KAAK,IAAI,EAAE,QAAQ,UAAU,UAAU,KAAKA,WAAW,KAAKa,SAAS,KAAK,CAAC;CAC1F;CAEA,gBAA0B;EACxB,OAAO,KAAKS,MAAM,EAAE,QAAQ,UAAU,UAAU,KAAKtB,WAAW,KAAKE,YAAY,IAAI,KAAK,CAAC;CAC7F;CAEA,YAAsB;EACpB,MAAM,SAAS,KAAKoB,MAAM,EAAE,QAAQ,UAAU,UAAU,KAAKtB,OAAO;EACpE,KAAK,MAAM,SAAS,QAClB,MAAM,YAAY,GAAG,SAAS,YAAY,GAAG;EAE/C,OAAO;CACT;CAEA,OAAO,MAAoB;EACzB,KAAKE,YAAY,IAAI,IAAI;EACzB,KAAKC,YAAY,OAAO,IAAI;EAC5B,IAAI,KAAKA,YAAY,SAAS,GAC5B,KAAKC,SAAS,QAAQ;CAE1B;CAIA,QAAQ,MAAoB;EAC1B,KAAKF,YAAY,OAAO,IAAI;EAC5B,IAAI,KAAKW,SAAS,IAAI,GACpB,KAAK,YAAY,GAAG,SAAS,YAAY,GAAG;CAEhD;CAGA,OAAO,MAAc,KAA6B;EAChD,MAAM,UAAU;GAAE;GAAM;EAAI;EAC5B,KAAKP,UAAU,IAAI,OAAO;EAC1B,IAAI,KAAKiB,aAAa,QACpB,KAAKA,WAAW,KAAKvB,QAAQ,kBAAkB;GAC7C,KAAK,MAAM,QAAQ,KAAKM,WACtB,IAAI,CAAC,KAAKO,SAAS,KAAK,IAAI,GAC1B,KAAK,IAAI;EAGf,GAAG,GAAG;EAER,aAAa;GACX,KAAKP,UAAU,OAAO,OAAO;GAC7B,IAAI,KAAKA,UAAU,SAAS,GAAG;IAC7B,KAAKN,QAAQ,cAAc,KAAKuB,QAAQ;IACxC,KAAKA,WAAW;GAClB;EACF;CACF;AACF;AAEA,SAAS,aAAa,OAAiB,OAAe,QAAyB;CAC7E,MAAM,cAAc,MAAM,aAAa;CACvC,MAAM,QAAQ,UAAU,OAAO,OAAO,WAAW,WAAW;CAC5D,IAAI,CAAC,OACH,OAAO;CAET,MAAM,aAAa,MAAM,aAAa,OAAO,KAAK,IAC/C,MAAM,GAAG,EACT,KAAK,SAAS,KAAK,KAAK,EAAE,MAAM,MAAM,CAAC,EACvC,MAAM,CAAC,UAAU,SAAS,OAAO;CACpC,IAAI,CAAC,WACH,OAAO,WAAW;CAGpB,MAAM,UAAU,UAAU,WAAW,IAAI,CAAC,OAAO,IAAI,UAAU,MAAM,CAAC;CACtE,IAAI,QAAQ,SAAS,QAAQ,GAC3B,OAAO;CAGT,MAAM,MAAM,MAAM,aAAa,QAAQ,IAAI,OAAO,MAAM,aAAa,KAAK;CAC1E,MAAM,SAAS,MAAM,IAAI,MAAM,KAAK,MAAM,OAAO,IAAI;CACrD,MAAM,eAAe,CAAC,OAAO,QAAQ,aAAa,WAAW,cAAc,QAAQ;CACnF,OAAO,QAAQ,MACZ,WACC,WAAW,OACV,WAAW,YAAY,WAAW,eAClC,WAAW,WAAW,WAAW,gBAClC,WAAW,MACf;AACF;AAIA,SAAS,aAAa,MAAc,YAA2C;CAC7E,IAAI,CAAC,YACH;CAEF,IAAI;EACF,OAAO,KAAK;CACd,QAAQ;EACN;CACF;AACF;AAEA,SAAS,UAAU,OAAiB,OAAe,YAA0C;CAC3F,IAAI,YACF,IAAI;EACF,MAAM,QAAQ,MAAM;EAEpB,IAAI,OAAO,kBAAkB,OAC3B,OAAO;CAEX,QAAQ,CAER;CAEF,OAAO,aAAa,OAAO,KAAK;AAClC;AAGA,SAAS,aAAa,MAA6B,OAAoC;CACrF,MAAM,SAAS,KAAK,iBAAuD,eAAe;CAC1F,KAAK,MAAM,SAAS,QAClB,IAAI,MAAM,kBAAkB,OAC1B,OAAO;CAGX,KAAK,MAAM,WAAW,KAAK,iBAAiB,GAAG,GAAG;EAChD,IAAI,CAAC,QAAQ,YACX;EAEF,MAAM,QAAQ,aAAa,QAAQ,YAAY,KAAK;EACpD,IAAI,OACF,OAAO;CAEX;AAEF;AAEA,SAAgB,aAAa,OAAqC;CAChE,MAAM,OAAO,MAAM;CACnB,OAAO,QAAQ,CAAC,KAAK,UAAU,KAAK,aAAa,QAAQ,OAAO;AAClE;AAEA,SAAgB,gBAAgB,OAAsC;CAEpE,MAAM,SAA8E;CACpF,MAAM,SAAS,OAAO,OAAO,qBAAqB,OAAO,aAAa;CACtE,IAAI,OAAO,QAAQ,aAAa,cAAc,OAAO,OAAO,kBAAkB,YAC5E;CAEF,MAAM,WAAoB,OAAO,SAAS;CAC1C,OAAO,MAAM,QAAQ,QAAQ,KAAK,SAAS,SAAS,OAAO,IACvD,QAAQ,OAAO,cAAc,OAAO,CAAC,IACrC;AACN;AAEA,SAAS,iBACP,UACA,OACA,QACuB;CAEvB,MAAM,cACJ,SAAS,qBAAqB,SAC1B,SACC,KAAK,MAAM,SAAS,gBAAgB;CAG3C,OAAO;EACL,GAAI,SAAS,gBAAgB,UAAa,EAAE,aAAa,EAAE,GAAG,SAAS,YAAY,EAAE;EACrF,aAAa,SAAS;EACtB,GAAI,gBAAgB,UAAa,EAAE,YAAY;EAC/C,MAAM,SAAS;EACf;EACA,OAAO,SAAS;EAChB,QAAQ;CACV;AACF;AAGA,SAAS,iBAAiB,OAA8B;CACtD,MAAM,OAAO,OAAO,KAAK;CACzB,IACE,CAAC,QACD,OAAO,KAAK,SAAS,YACrB,OAAO,KAAK,UAAU,YACtB,OAAO,KAAK,gBAAgB,YAC3B,KAAK,qBAAqB,UAAa,OAAO,KAAK,qBAAqB,UAEzE,MAAM,IAAI,UAAU,sCAAsC;CAE5D,MAAM,WAAyB;EAC7B,MAAM,KAAK;EACX,OAAO,KAAK;EACZ,aAAa,KAAK;EAClB,aAAa;EACb,kBAAkB,KAAK;CACzB;CACA,IAAI,KAAK,gBAAgB,QACvB,OAAO;CAET,MAAM,QAAQ,OAAO,KAAK,WAAW;CACrC,IAAI,CAAC,OACH,MAAM,IAAI,UAAU,yCAAyC;CAE/D,MAAM,cAAsC,CAAC;CAC7C,KAAK,MAAM,QAAQ,iBAAiB;EAClC,MAAM,OAAO,MAAM;EACnB,IAAI,SAAS,QACX;EAEF,IAAI,OAAO,SAAS,WAClB,MAAM,IAAI,UAAU,WAAW,KAAK,2BAA2B;EAEjE,YAAY,QAAQ;CACtB;CACA,SAAS,cAAc;CACvB,OAAO;AACT;AAEA,SAAS,kBAAkB,OAA0D;CACnF,IAAI,OAAO,UAAU,UACnB;CAEF,MAAM,CAAC,WAAW,OAAO,IAAI,KAAK,IAAI,SAAS,MAAM,MAAM,GAAG;CAC9D,OAAO,cAAc,YAAY,UAAU,SAAY;EAAE;EAAM;CAAG,IAAI;AACxE;AAEA,SAAS,OAAO,OAAqD;CACnE,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE;CAGF,OAAO;AACT;AAEA,SAAS,SAAS,OAA4C;CAC5D,IAAI;EACF,OAAO,iBAAiB,SAAS,YAAY;CAC/C,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAgB,iBAA+B;CAC7C,OAAO,IAAIzB,qBAAmB,yBAAyB,cAAc;AACvE;;;;ACptBA,MAAM,qCAAqB,IAAI,QAAqB;AACpD,MAAM,iCAAiB,IAAI,QAAgD;AAC3E,MAAM,oCAAoB,IAAI,QAA2C;AAEzE,SAAS,0BAA0B,OAA6B;CAC9D,OACE,MAAM,cACL,mBAAmB,IAAI,KAAK,KAC1B,MAAM,eAAe,MAAM,QAC1B,MAAM,kBAAkB,mBACxB,kBAAkB,IAAI,MAAM,MAAM;AAE1C;AAEA,SAAS,4BACP,OACA,eACM;CACN,IAAI,CAAC,0BAA0B,KAAK,GAClC,MAAM,IAAI,aACR,wEACA,mBACF;CAEF,IAAI,CAAC,MAAM,kBACT,MAAM,IAAI,aACR,gFACA,mBACF;CAEF,IAAI,MAAM,eAAe,MAAM,MAC7B,MAAM,IAAI,aACR,8EACA,mBACF;CAEF,mBAAmB,IAAI,KAAK;CAC5B,MAAM,WAAW,QAAQ,QAAQ,aAAa;CAC9C,eAAe,IAAI,OAAO,QAAQ;CAClC,IAAI,MAAM,kBAAkB,iBAC1B,kBAAkB,IAAI,MAAM,MAAM,GAAG,QAAQ,KAAK;AAEtD;AAEA,MAAM,mBAAmB,IAAI,IAAI;CAAC;CAAS;CAAY;CAAU;CAAO;CAAQ;AAAK,CAAC;AACtF,MAAM,uBAAuB,IAAI,IAAI;CACnC,GAAG;CACH;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAS,UAAU,SAAiD;CAClE,OACE,mBAAmB,oBACnB,mBAAmB,qBACnB,mBAAmB;AAEvB;AAEA,SAAS,gBAAgB,MAAmD;CAC1E,OAAO,OAAO,yBAAyB,gBAAgB,WAAW,UAAU,GAAG,KAAK,KAAK,IAAI;AAC/F;AAEA,SAAS,iBAAiB,MAAuB,MAA6B;CAC5E,OAAO,QAAQ,UAAU,aAAa,KAAK,MAAM,IAAI;AACvD;AAEA,SAAS,iBAAiB,MAAuB,MAAuB;CACtE,OAAO,QAAQ,UAAU,aAAa,KAAK,MAAM,IAAI;AACvD;AAEA,SAAS,YAAY,MAAqB;CACxC,OAAO,OAAO,yBAAyB,KAAK,WAAW,aAAa,GAAG,KAAK,KAAK,IAAI;AACvF;AAEA,SAAS,kBAAkB,SAAqC;CAC9D,OAAO,OAAO,yBAAyB,QAAQ,WAAW,YAAY,GAAG,KAAK,KAAK,OAAO;AAC5F;AAEA,SAAS,kBAAkB,MAAgC;CACzD,OAAO,gBAAgB,UAAU,cAAc,KAAK,IAAI;AAC1D;AAEA,SAAS,kBAAkB,MAAuB,WAA6B;CAC7E,gBAAgB,UAAU,cAAc,KAAK,MAAM,SAAS;AAC9D;AAEA,SAAS,YAAY,MAA6C;CAChE,OAAO,CAAC,GAAG,gBAAgB,IAAI,CAAC,EAAE,QAC/B,YACC,UAAU,OAAO,KACjB,CAAC,QAAQ,QAAQ,WAAW,KAC5B,EACE,cAAc,WACd,QAAQ,aACP,mBAAmB,uBAAuB,qBAAqB,IAAI,QAAQ,IAAI,GAEtF;AACF;AAEA,SAAS,cAAc,MAA0D;CAC/E,MAAM,yBAAS,IAAI,IAAkC;CACrD,KAAK,MAAM,WAAW,YAAY,IAAI,GAAG;EACvC,MAAM,OAAO,QAAQ,KAAK,KAAK;EAC/B,MAAM,WAAW,OAAO,IAAI,IAAI;EAChC,IAAI,UAAU,SAAS,KAAK,OAAO;OAC9B,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;CACjC;CACA,OAAO;AACT;AAEA,SAAS,UAAU,SAAqC;CACtD,OAAO,CAAC,GAAI,QAAQ,UAAU,CAAC,CAAE,EAC9B,KAAK,UAAU;EACd,MAAM,OAAO,MAAM,UAAU,IAAI;EACjC,IAAI,EAAE,gBAAgB,cAAc,OAAO;EAC3C,KACG,iBAAiB,0DAA0D,EAC3E,SAAS,YAAY,QAAQ,OAAO,CAAC;EACxC,OAAO,KAAK,aAAa,KAAK,KAAK;CACrC,CAAC,EACA,OAAO,OAAO,EACd,KAAK,IAAI;AACd;AAEA,SAAS,eACP,MACA,UACiC;CACjC,KACE,IAAI,UAAU,SAAS,IAAI,eAC3B,WAAW,YAAY,MACvB,UAAU,QAAQ,eAElB,IACE,mBAAmB,uBACnB,SAAS,OAAO,YAAY,QAAQ,SAAS,OAAO,CAAC,GAErD,OAAO;AAIb;AAEA,SAAS,qBACP,MACA,UACoB;CACpB,IAAI,SAAS,WAAW,GAAG;EACzB,MAAM,UAAU,SAAS;EACzB,IAAI,CAAC,SAAS,OAAO;EACrB,OACE,QAAQ,aAAa,sBAAsB,KAC3C,UAAU,OAAO,KACjB,QAAQ,aAAa,kBAAkB,KACvC;CAEJ;CACA,OAAO,eAAe,MAAM,QAAQ,GAAG,aAAa,sBAAsB,KAAK;AACjF;AAEA,SAAS,gBACP,QACA,MACA,UACA,OACqB;CACrB,MAAM,cAAc,qBAAqB,MAAM,QAAQ;CACvD,MAAM,WAAW,eAAe,QAAQ,GAAG,YAAY,IAAI,MAAM,KAAK,eAAe;CACrF,OAAO,WAAW;EAAE,GAAG;EAAQ,aAAa;CAAS,IAAI;AAC3D;AAEA,SAAS,qBAAqB,OAAyB,MAAyC;CAC9F,MAAM,MAAM,MAAM,aAAa,IAAI;CACnC,IAAI,QAAQ,QAAQ,IAAI,KAAK,MAAM,IAAI,OAAO;CAC9C,MAAM,QAAQ,OAAO,GAAG;CACxB,OAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAC1C;AAEA,SAAS,UAAU,OAAyB,UAA0B;CACpE,MAAM,OAAO,OAAO,MAAM,aAAa,MAAM,CAAC;CAC9C,OAAO,OAAO,SAAS,IAAI,KAAK,OAAO,IAAI,OAAO;AACpD;AAEA,SAAS,mBAAmB,UAAkB,MAAuB;CACnE,MAAM,WAAW,WAAW;CAC5B,OAAO,KAAK,IAAI,WAAW,KAAK,MAAM,QAAQ,CAAC,IAAI,OAAO,UAAU;AACtE;AAEA,SAAS,YAAY,QAA6B,OAA8C;CAC9F,MAAM,UAAU,MAAM,aAAa,SAAS;CAC5C,IAAI,YAAY,MAAM,OAAO;CAC7B,IAAI;EACF,IAAI,OAAO,SAAS,GAAG;CACzB,QAAQ;EACN,OAAO;CACT;CACA,OAAO;EAAE,GAAG;EAAQ;CAAQ;AAC9B;AAEA,SAAS,aAAa,OAA8C;CAClE,MAAM,SAA8B,EAAE,MAAM,SAAS;CACrD,MAAM,UAAU,qBAAqB,OAAO,KAAK;CACjD,MAAM,UAAU,qBAAqB,OAAO,KAAK;CACjD,IAAI,YAAY,QAAW,OAAO,UAAU;CAC5C,IAAI,YAAY,QAAW,OAAO,UAAU;CAC5C,IAAI,MAAM,aAAa,MAAM,MAAM,OAAO;EACxC,MAAM,OAAO,UAAU,OAAO,CAAC;EAC/B,MAAM,WAAW,OAAO,MAAM,aAAa,OAAO,CAAC;EAEnD,IAAI,mBADa,YAAY,OAAO,SAAS,QAAQ,IAAI,WAAW,IACnC,IAAI,GAAG,OAAO,aAAa;CAC9D;CACA,OAAO;AACT;AAEA,SAAS,eAAe,OAAyB,YAA4B;CAC3E,MAAM,OAAO,UAAU,OAAO,EAAE;CAChC,IAAI,OAAO,GAAG,OAAO,GAAG,WAAW;CACnC,IAAI,OAAO,IAAI,OAAO,GAAG,WAAW;CACpC,OAAO,GAAG,WAAW;AACvB;AAEA,SAAS,cAAc,SAAuC;CAC5D,OAAO;EACL,OAAO,QAAQ,KAAK,YAAY;GAC9B,MAAM;GACN,OAAO,OAAO;GACd,OAAO,OAAO,eAAe;EAC/B,EAAE;EACF,MAAM,QAAQ,KAAK,WAAW,OAAO,KAAK;CAC5C;AACF;AAEA,SAAS,mBAAmB,UAAuC;CACjE,OAAO;EACL,OAAO,SAAS,KAAK,YAAY;GAC/B,MAAM,QAAQ,UAAU,OAAO;GAC/B,MAAM,SAA8B;IAAE,MAAM;IAAU,OAAO,QAAQ;GAAM;GAC3E,IAAI,OAAO,OAAO,QAAQ;GAC1B,OAAO;EACT,CAAC;EACD,MAAM,SAAS,KAAK,YAAY,QAAQ,KAAK;CAC/C;AACF;AAEA,SAAS,QAAQ,SAA6B,MAA2C;CACvF,OAAO,mBAAmB,oBAAoB,QAAQ,SAAS;AACjE;AAEA,SAAS,YAAY,OAA0D;CAC7E,IAAI,iBAAiB,IAAI,MAAM,IAAI,GAAG,OAAO,YAAY,EAAE,MAAM,SAAS,GAAG,KAAK;CAClF,QAAQ,MAAM,MAAd;EACE,KAAK,UACH,OAAO,MAAM,aAAa,sBAAsB,IAAI,EAAE,MAAM,SAAS,IAAI;EAC3E,KAAK,UACH,OAAO,YAAY,aAAa,KAAK,GAAG,KAAK;EAC/C,KAAK,SAAS;GACZ,MAAM,SAAS,aAAa,KAAK;GACjC,OAAO,YAAY;GACnB,OAAO,YAAY;GACnB,OAAO;EACT;EACA,KAAK,YACH,OAAO,EAAE,MAAM,UAAU;EAC3B,KAAK,QACH,OAAO;GAAE,MAAM;GAAU,QAAQ;EAAO;EAC1C,KAAK,SACH,OAAO;GAAE,MAAM;GAAU,QAAQ;EAA6B;EAChE,KAAK,QACH,OAAO;GAAE,MAAM;GAAU,QAAQ;EAAyC;EAC5E,KAAK,QACH,OAAO;GAAE,MAAM;GAAU,QAAQ,eAAe,OAAO,gCAAgC;EAAE;EAC3F,KAAK,kBACH,OAAO;GACL,MAAM;GACN,QAAQ,eACN,OACA,kEACF;EACF;EACF,KAAK,SACH,OAAO;GAAE,MAAM;GAAU,QAAQ;EAAoB;EACvD,SACE;CACJ;AACF;AAEA,SAAS,gBACP,MACA,UACiC;CACjC,MAAM,CAAC,SAAS;CAChB,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI;CACJ,IAAI,SAAS,OAAO,YAAY,QAAQ,SAAS,OAAO,CAAC,GACvD,SAAS;EAAE,MAAM;EAAU,GAAG,mBAAmB,QAAQ;CAAE;MACtD,IAAI,SAAS,SAAS,GAC3B;MAAI,SAAS,OAAO,YAAY,QAAQ,SAAS,UAAU,CAAC,GAC1D,SAAS;GACP,MAAM;GACN,OAAO;IAAE,MAAM;IAAU,GAAG,mBAAmB,QAAQ;GAAE;GACzD,aAAa;EACf;CACF,OACK,IAAI,iBAAiB,qBAC1B,SAAS,EAAE,MAAM,SAAS;MACrB,IAAI,iBAAiB,mBAAmB;EAC7C,MAAM,UAAU,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC;EAChD,SAAS,MAAM,WACX;GAAE,MAAM;GAAS,OAAO;IAAE,MAAM;IAAU,GAAG;GAAQ;GAAG,aAAa;EAAK,IAC1E;GAAE,MAAM;GAAU,GAAG;EAAQ;CACnC,OACE,SAAS,YAAY,KAAK;CAE5B,MAAM,WACJ,MAAM,SAAS,SAAS,mDAAmD;CAC7E,OAAO,UAAU,gBAAgB,QAAQ,MAAM,UAAU,QAAQ;AACnE;AAEA,SAAS,iBAAiB,MAAoC;CAC5D,MAAM,aAAkD,CAAC;CACzD,MAAM,WAAqB,CAAC;CAC5B,KAAK,MAAM,CAAC,MAAM,aAAa,cAAc,IAAI,GAAG;EAClD,IAAI,CAAC,MAAM;EACX,MAAM,SAAS,gBAAgB,MAAM,QAAQ;EAC7C,IAAI,CAAC,QAAQ;EACb,OAAO,eAAe,YAAY,MAAM;GACtC,cAAc;GACd,YAAY;GACZ,OAAO;GACP,UAAU;EACZ,CAAC;EACD,IAAI,SAAS,MAAM,YAAY,QAAQ,QAAQ,GAAG,SAAS,KAAK,IAAI;CACtE;CACA,OAAO;EAAE,MAAM;EAAU;EAAY;CAAS;AAChD;AAEA,SAAS,eAAe,MAAkD;CACxE,OAAO;EACL,MAAM,iBAAiB,MAAM,UAAU,KAAK;EAC5C,OAAO,iBAAiB,MAAM,WAAW,KAAK;EAC9C,aAAa,iBAAiB,MAAM,iBAAiB,KAAK;EAC1D,aAAa,iBAAiB,IAAI;EAClC,YAAY,iBAAiB,MAAM,gBAAgB;CACrD;AACF;AAEA,SAAS,aAAa,OAAoC;CACxD,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW,OAAO,OAAO,KAAK;CAChF,IAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG,OAAO,OAAO,KAAK;AAE9E;AAEA,SAAS,cAAc,OAAqC;CAC1D,IAAI,OAAO,UAAU,WAAW,OAAO;CACvC,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,GAAG,OAAO,UAAU;CAC3E,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,UAAU,OAAO,MAAM,YAAY,MAAM,QAAQ,OAAO;CAC5D,IAAI,UAAU,OAAO,MAAM,YAAY,MAAM,SAAS,OAAO;AAE/D;AAEA,SAAS,uBAAuB,OAAgB,SAAkD;CAChG,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,OAAO;CAClC,MAAM,YAAY,IAAI,IAAI,OAAO;CACjC,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,SAAS,aAAa,IAAI;EAChC,IAAI,WAAW,UAAa,CAAC,UAAU,OAAO,MAAM,GAAG,OAAO;CAChE;CACA,OAAO;AACT;AAEA,SAAS,kBAAkB,OAAyB,OAAwB;CAC1E,IAAI,UAAU,IAAI,OAAO,MAAM,SAAS,YAAY,MAAM,SAAS;CACnE,MAAM,QAAQ,MAAM,cAAc,cAAc,OAAO;CACvD,MAAM,OAAO,MAAM;CACnB,MAAM,QAAQ;CACd,OAAO,MAAM,UAAU;AACzB;AAIA,SAAS,qBACP,MACA,UACA,OAC6B;CAC7B,MAAM,CAAC,SAAS;CAChB,IAAI,CAAC,SAAS,CAAC,gBAAgB,MAAM,QAAQ,GAAG,OAAO;CACvD,MAAM,SAAS,aAAa,KAAK;CACjC,IAAI,SAAS,OAAO,YAAY,QAAQ,SAAS,OAAO,CAAC,GACvD,OAAO,SAAS,MAAM,YAAY,QAAQ,UAAU,MAAM;CAG5D,IAAI,SAAS,SAAS,GACpB,OAAO,uBAAuB,OAAO,IAAI,IAAI,SAAS,KAAK,YAAY,QAAQ,KAAK,CAAC,CAAC;CAExF,IAAI,iBAAiB,mBAAmB;EACtC,MAAM,UAAU,IAAI,IAAI,CAAC,GAAG,MAAM,OAAO,EAAE,KAAK,WAAW,OAAO,KAAK,CAAC;EACxE,IAAI,MAAM,UAAU,OAAO,uBAAuB,OAAO,OAAO;EAChE,OAAO,WAAW,UAAa,QAAQ,IAAI,MAAM;CACnD;CACA,IAAI,iBAAiB,qBAAqB,OAAO,WAAW;CAC5D,IAAI,MAAM,SAAS,YAAY,OAAO,cAAc,KAAK,MAAM;CAC/D,OAAO,WAAW,UAAa,kBAAkB,OAAO,MAAM;AAChE;AAEA,SAAS,uBAAuB,SAAmC;CACjE,QAAQ,cAAc,IAAI,MAAM,SAAS;EAAE,SAAS;EAAM,UAAU;CAAK,CAAC,CAAC;CAC3E,QAAQ,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,KAAK,CAAC,CAAC;AAC9D;AAIA,SAAS,SAAS,SAAiD,OAAqB;CACtF,IAAI,QAAQ,UAAU,OAAO;CAC7B,MAAM,YACJ,mBAAmB,mBACf,iBAAiB,YACjB,oBAAoB;CAC1B,OAAO,yBAAyB,WAAW,OAAO,GAAG,KAAK,KAAK,SAAS,KAAK;CAC7E,uBAAuB,OAAO;AAChC;AAEA,SAAS,WAAW,SAA2B,SAAwB;CACrE,IAAI,QAAQ,YAAY,SAAS;CACjC,OAAO,yBAAyB,iBAAiB,WAAW,SAAS,GAAG,KAAK,KAC3E,SACA,OACF;CACA,uBAAuB,OAAO;AAChC;AAGA,SAAS,cAAc,UAAyC,OAAiC;CAC/F,MAAM,CAAC,SAAS;CAChB,MAAM,SAAS,aAAa,KAAK;CACjC,MAAM,SAAS,IAAI,IAAI,MAAM,QAAQ,KAAK,IAAI,MAAM,IAAI,YAAY,IAAI,CAAC,CAAC;CAC1E,IAAI,SAAS,OAAO,YAAY,QAAQ,SAAS,OAAO,CAAC,GAAG;EAC1D,MAAM,UAAU,SAAS,MAAM,cAAc,UAAU,UAAU,MAAM;EACvE,IAAI,SAAS,WAAW,SAAS,IAAI;CACvC,OAAO,IAAI,SAAS,SAAS,GAC3B;OAAK,MAAM,WAAW,UACpB,IAAI,mBAAmB,kBAAkB,WAAW,SAAS,OAAO,IAAI,QAAQ,KAAK,CAAC;CACxF,OACK,IAAI,iBAAiB,mBAC1B;MAAI,MAAM,UAAU;GAClB,IAAI,UAAU;GACd,KAAK,MAAM,UAAU,MAAM,SAAS;IAClC,MAAM,OAAO,OAAO,IAAI,OAAO,KAAK;IACpC,IAAI,OAAO,aAAa,MAAM;IAC9B,OAAO,WAAW;IAClB,UAAU;GACZ;GACA,IAAI,SAAS,uBAAuB,KAAK;EAC3C,OAAO,IAAI,WAAW,UAAa,MAAM,UAAU,QAAQ;GACzD,MAAM,QAAQ;GACd,uBAAuB,KAAK;EAC9B;QACK,IAAI,SAAS,QAAQ,OAAO,UAAU,GAAG;EAC9C,MAAM,UAAU,cAAc,KAAK;EACnC,IAAI,YAAY,QAAW,WAAW,OAAO,OAAO;CACtD,OAAO,IAAI,SAAS,WAAW,QAC7B,SAAS,OAAO,MAAM;AAE1B;AAIA,SAAS,SAAS,MAAuB,OAA8B;CACrE,IAAI,MAAM,QAAQ,KAAK,GAAG,MAAM,eAAe;CAC/C,MAAM,SAAS,cAAc,IAAI;CACjC,MAAM,aAAmF,CAAC;CAC1F,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,KAAK,GAAG;EACjD,MAAM,WAAW,OAAO,IAAI,IAAI;EAChC,IAAI,CAAC,YAAY,CAAC,qBAAqB,MAAM,UAAU,KAAK,GAAG,MAAM,eAAe;EACpF,WAAW,KAAK;GAAE;GAAU;EAAM,CAAC;CACrC;CACA,KAAK,MAAM,EAAE,UAAU,WAAW,YAAY,cAAc,UAAU,KAAK;AAC7E;AAEA,SAAS,cAAc,MAA8C;CACnE,OAAO,CAAC,GAAG,gBAAgB,IAAI,CAAC,EAAE,MAC/B,YACC,CAAC,QAAQ,QAAQ,WAAW,MAC1B,mBAAmB,qBAAqB,QAAQ,SAAS,YACxD,mBAAmB,oBAAoB,CAAC,SAAS,QAAQ,EAAE,SAAS,QAAQ,IAAI,EACvF;AACF;AAEA,SAAS,eAAe,MAAsC,UAAyB;CACrF,MAAM,QAAQ,IAAI,MAAM,IAAI;CAC5B,OAAO,eAAe,OAAO,YAAY;EAAE,YAAY;EAAM,OAAO;CAAS,CAAC;CAC9E,OAAO;AACT;AAEA,SAAS,kBACP,SACA,cACA,YACA,WACA,QAC2B;CAC3B,MAAM,EAAE,SAAS;CACjB,aAAa,gBAAgB,eAAe,CAAC;CAE7C,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,IAAI,UAAU;EAEd,MAAM,gBAAgB;GACpB,YAAY,UAAU,oBAAoB,KAAK,MAAM,WAAW,WAAW,IAAI;GAC/E,OAAO,oBAAoB,SAAS,OAAO;GAC3C,kBAAkB,OAAO,IAAI;GAC7B,IAAI,aAAa,kBAAkB,QAAQ,OAAO,aAAa;EACjE;EACA,MAAM,UAAU,aAAyB;GACvC,IAAI,SAAS;GACb,UAAU;GACV,QAAQ;GACR,SAAS;EACX;EACA,MAAM,UAAU,WAAkC,aAAa,OAAO,MAAM,CAAC;EAG7E,MAAM,kBAAkB,aAAwC;GAE9D,IAAI,aAAa,kBAAkB,QAAQ,OAAO,aAAa;GAC/D,SAAS,MACN,UAAU,aAAa,QAAQ,SAAS,IAAI,CAAC,IAC7C,UAAiC,aAAa,OAAO,KAAK,CAAC,CAC9D;EACF;EACA,MAAM,aAAa,UAAiB;GAClC,IAAI,CAAC,MAAM,WAAW;GACtB,qBAAqB;IACnB,IAAI,CAAC,kBAAkB,IAAI,GAAG,OAAO,eAAe,CAAC;GACvD,CAAC;EACH;EACA,MAAM,gBAAgB;GACpB,aAAa;IACX,QAAQ,cAAc,eAAe,cAAc,WAAW,IAAI,CAAC;IACnE,OAAO,OAAO,MAAM;GACtB,CAAC;EACH;EAEA,kBAAkB,IAAI,MAAM;GAG1B,SAAS,OAAO;IACd,iBAAiB;KACf,MAAM,WAAW,eAAe,IAAI,KAAK;KACzC,IAAI,UAAU,eAAe,QAAQ;UAChC,IAAI,MAAM,kBAAkB,OAAO,eAAe,CAAC;UACnD,aAAa,QAAQ,IAAI,CAAC;IACjC,CAAC;GACH;GACA,SAAS;IACP,aAAa,QAAQ,IAAI,CAAC;GAC5B;GACA,QAAQ,OAAO;IACb,qBAAqB;KACnB,MAAM,WAAW,eAAe,IAAI,KAAK;KACzC,IAAI,UAAU,eAAe,QAAQ;IACvC,CAAC;GACH;EACF,CAAC;EACD,aAAa,gBAAgB;EAC7B,YAAY,UAAU,iBAAiB,KAAK,MAAM,WAAW,WAAW,IAAI;EAC5E,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;EAExD,IAAI,CAAC,WAAW,YAAY;GAC1B,WAAW,MAAM;GACjB,QAAQ,cAAc,eAAe,iBAAiB,WAAW,IAAI,CAAC;GACtE;EACF;EACA,IAAI;GACF,kBAAkB,MAAM,SAAS;GACjC,QAAQ,cAAc,eAAe,iBAAiB,WAAW,IAAI,CAAC;EACxE,SAAS,OAAO;GACd,OAAO,KAAK;EACd;CACF,CAAC;AACH;;AAGA,SAAgB,mCAAmC,SAAoC;CACrF,MAAM,YAAY,YAAY;CAE9B,IAAI,kBAAkB,aAAa,iBAAiB,WAAW;CAE/D,IAAI,EAAE,kBAAkB,YACtB,OAAO,eAAe,WAAW,gBAAgB;EAC/C,cAAc;EACd,YAAY;EACZ,MAAuB;GACrB,OAAO,0BAA0B,IAAI;EACvC;CACF,CAAC;CAGH,IAAI,EAAE,iBAAiB,YACrB,OAAO,eAAe,WAAW,eAAe;EAC9C,cAAc;EACd,YAAY;EACZ,UAAU;EACV,MAAyB,eAA0C;GACjE,4BAA4B,MAAM,aAAa;EACjD;CACF,CAAC;CAGH,MAAM,gCAAgB,IAAI,IAA8C;CACxE,MAAM,qCAAqB,IAAI,IAA6B;CAC5D,MAAM,4BAAY,IAAI,IAA6C;CACnE,MAAM,YAAY,UAAiB;EACjC,IACE,EAAE,iBAAiB,gBACnB,CAAC,MAAM,aACP,EAAE,MAAM,kBAAkB,kBAE1B;EAIF,MAAM,aAAa,kBAAkB,IAAI,MAAM,MAAM;EACrD,IAAI,CAAC,YAAY;EACjB,mBAAmB,IAAI,KAAK;EAC5B,WAAW,SAAS,KAAK;CAC3B;CAEA,MAAM,WAAW,UAAiB;EAChC,IAAI,CAAC,MAAM,aAAa,EAAE,MAAM,kBAAkB,kBAAkB;EACpE,MAAM,OAAO,MAAM;EAEnB,iBAAiB;GACf,IAAI,MAAM,kBAAkB;GAC5B,cAAc,IAAI,IAAI,GAAG,gBAAgB,eAAe,CAAC;EAC3D,CAAC;CACH;CAEA,SAAS,kBAAkB,MAAmC;EAC5D,UAAU,IAAI,IAAI,GAAG,WAAW;EAChC,UAAU,OAAO,IAAI;EACrB,KAAK,oBAAoB,SAAS,SAAS,IAAI;EAC/C,KAAK,oBAAoB,UAAU,UAAU,IAAI;CACnD;CAEA,SAAS,YAAY,MAAmC;EACtD,IAAI,UAAU,IAAI,IAAI,GAAG;EACzB,MAAM,WAAW,IAAI,iBAAiB,IAAI;EAC1C,UAAU,IAAI,MAAM,QAAQ;EAC5B,SAAS,QAAQ,MAAM;GACrB,YAAY;GACZ,eAAe;GACf,WAAW;GACX,SAAS;EACX,CAAC;EACD,KAAK,iBAAiB,SAAS,SAAS,IAAI;EAG5C,KAAK,iBAAiB,UAAU,UAAU,IAAI;CAChD;CAEA,SAAS,OAAa;EACpB,YAAY,QAAQ;EACpB,KAAK,MAAM,QAAQ,UAAU,KAAK,GAChC,IAAI,gBAAgB,cAAc,CAAC,KAAK,KAAK,aAC3C,kBAAkB,IAAI;EAI1B,MAAM,6BAAa,IAAI,IAAqB;EAC5C,MAAM,2BAAW,IAAI,IAGnB;EACF,MAAM,iCAAiB,IAAI,IAA6B;EACxD,KAAK,MAAM,QAAQ,UAAU,KAAK,GAChC,KAAK,MAAM,WAAW,KAAK,iBAAiB,GAAG,GAAG;GAChD,MAAM,aAAa,kBAAkB,OAAO;GAC5C,IAAI,YAAY,YAAY,UAAU;GAEtC,IACE,EAAE,mBAAmB,oBACrB,CAAC,iBAAiB,SAAS,UAAU,KACrC,CAAC,iBAAiB,SAAS,iBAAiB,KAC5C,CAAC,YAAY,OAAO,GAEpB;GAEF,MAAM,OAAO;GACb,WAAW,IAAI,IAAI;GACnB,MAAM,aAAa,eAAe,IAAI;GACtC,MAAM,cAAc,KAAK,UAAU,UAAU;GAC7C,MAAM,qBAAqB,mBAAmB,IAAI,IAAI;GACtD,IAAI,uBAAuB,aAAa;GACxC,mBAAmB,OAAO,IAAI;GAC9B,MAAM,eAAe,eAAe,IAAI,WAAW,IAAI;GACvD,IAAI,cAAc;IAEhB,IAAI,uBAAuB,QAAW;KACpC,mBAAmB,IAAI,MAAM,WAAW;KACxC;IACF;IACA,MAAM,oBAAoB,SAAS,IAAI,YAAY;IACnD,IAAI,mBACF,mBAAmB,IAAI,cAAc,kBAAkB,WAAW;IACpE,SAAS,OAAO,YAAY;GAC9B;GACA,eAAe,IAAI,WAAW,MAAM,IAAI;GACxC,SAAS,IAAI,MAAM;IAAE;IAAY;GAAY,CAAC;EAChD;EAEF,KAAK,MAAM,QAAQ,mBAAmB,KAAK,GACzC,IAAI,CAAC,WAAW,IAAI,IAAI,GAAG,mBAAmB,OAAO,IAAI;EAG3D,KAAK,MAAM,CAAC,MAAM,iBAAiB,eAEjC,IADoB,SAAS,IAAI,IAAI,GAAG,gBACpB,aAAa,aAAa;GAC5C,aAAa,gBAAgB,eAAe,CAAC;GAC7C,aAAa,WAAW,MAAM;GAC9B,cAAc,OAAO,IAAI;EAC3B;EAGF,KAAK,MAAM,CAAC,MAAM,EAAE,YAAY,kBAAkB,UAAU;GAC1D,IAAI,cAAc,IAAI,IAAI,GAAG;GAC7B,MAAM,aAAa,IAAI,gBAAgB;GACvC,MAAM,eAAwC;IAC5C;IACA;IACA;GACF;GACA,cAAc,IAAI,MAAM,YAAY;GACpC,AAAK,QACF,aACC;IACE,MAAM,WAAW;IACjB,OAAO,WAAW;IAClB,aAAa,WAAW;IACxB,aAAa,WAAW;IACxB,QAAQ,OAAwB,SAA4C;KAC1E,MAAM,YAAY,cAAc,IAAI;KACpC,IAAI,CAAC,WAAW,cAAc,CAAC,WAAW,MAAM,eAAe;KAC/D,SAAS,MAAM,KAAK;KACpB,OAAO,kBACL,SACA,cACA,YACA,WACA,QAAQ,MACV;IACF;GACF,GACA,EAAE,QAAQ,WAAW,OAAO,CAC9B,EACC,OAAO,UAAiC;IACvC,WAAW,MAAM;IAIjB,IAAI,iBAAiB,gBAAgB,MAAM,SAAS,cAAc;IAClE,QAAQ,MACN,mCAAmC,WAAW,KAAK,wBACnD,KACF;GACF,CAAC;EACL;CACF;CAEA,MAAM,yBAAyB,OAAO,yBAAyB,QAAQ,WAAW,cAAc;CAChG,IAAI,wBAAwB,cAAc;EACxC,MAAM,qBAAqB,QAAQ,UAAU;EAC7C,MAAM,eAAe,SAAyB,MAAkC;GAC9E,MAAM,OAAO,mBAAmB,KAAK,MAAM,IAAI;GAC/C,IACE,KAAK,SAAS,UACd,OAAO,yBAAyB,KAAK,WAAW,eAAe,GAAG,KAAK,KAAK,IAAI,MAC9E,YACF,YAAY,IAAI,GAEhB,YAAY,IAAI;GAElB,OAAO;EACT;EACA,OAAO,eAAe,QAAQ,WAAW,gBAAgB;GACvD,GAAG;GACH,OAAO;EACT,CAAC;CACH;CAEA,MAAM,mBAAmB,OAAO,yBAAyB,gBAAgB,WAAW,QAAQ;CAC5F,IAAI,kBAAkB,cAAc;EAClC,MAAM,eAAe,gBAAgB,UAAU;EAC/C,MAAM,SAAS,WAAuC;GACpD,aAAa,KAAK,IAAI;GACtB,kBAAkB,IAAI,IAAI,GAAG,OAAO;EACtC;EACA,OAAO,eAAe,gBAAgB,WAAW,UAAU;GACzD,GAAG;GACH,OAAO;EACT,CAAC;CACH;CAIA,KAAK;AACP;;;;;;;;AC30BA,MAAM,qBAAqB,WAAW;AACtC,MAAM,YAAY,OAAO,yBAAyB,YAAY,QAAQ,GAAG;AAQzE,MAAM,2BAAW,IAAI,QAAwC;;;;;;;;;;;;;;;;;;;AAoB7D,SAAgB0B,kBAAsB;CACpC,IAAI,OAAO,aAAa,eAAe,CAAC,WAAW,iBACjD;CAEF,IAAI,kBAAkB,UACpB;CAGF,MAAM,oBAAoB,SAAS;CACnC,MAAM,iBAAiB,OAAO,yBAAyB,mBAAmB,aAAa,EAAG;CAC1F,MAAM,wBAAwB,OAAO,yBAAyB,YAAY,cAAc;CACxF,IACE,CAAC,OAAO,aAAa,iBAAiB,KACrC,yBAAyB,CAAC,sBAAsB,gBAChD,CAAC,yBAAyB,CAAC,OAAO,aAAa,UAAU,GAE1D,MAAM,IAAI,UAAU,qCAAqC;CAG3D,OAAO,eAAe,YAAY,gBAAgB;EAChD,OAAO;EACP,cAAc;EACd,UAAU;CACZ,CAAC;CAGD,MAAM,EAAE,oBAAoB,EAC1B,kBAAqD;EACnD,eAAe,KAAK,IAAI;EACxB,IAAI,UAAU,SAAS,IAAI,IAAI;EAC/B,IAAI,CAAC,SAAS;GACZ,UAAU,IAAI,qBAAqB,IAAI;GACvC,SAAS,IAAI,MAAM,OAAO;EAC5B;EACA,OAAO;CACT,EACF;CACA,OAAO,eAAe,iBAAiB,QAAQ,EAAE,OAAO,mBAAmB,CAAC;CAC5E,OAAO,eAAe,mBAAmB,gBAAgB;EACvD,cAAc;EACd,YAAY;EACZ,KAAK;CACP,CAAC;CAED,AAAK,SAAS;AAChB;AAEA,IAAM,uBAAN,cAAmC,YAA2C;CAC5E,AAASC;CACT,AAASC,yBAAS,IAAI,IAAwB;CAE9C,AAASC;CACT,qBAA0D;CAC1D,AAASC,uBAAuB,UAAuB;EACrD,MAAM,UAAU,KAAKC;EAErB,IAAI,OAAO,YAAY,YACrB;EAGF,IADe,QAAQ,MAAM,SAAS,MAAM,CAAC,KAAK,CACzC,MAAM,OACb,MAAM,UAAU,eAAe,KAAK,KAAK;CAE7C;CAEA,YAAY,OAAiB;EAC3B,MAAM;EACN,KAAKJ,YAAY;EACjB,MAAM,OAAO,aAAa,KAAK;EAC/B,IAAI,CAAC,MACH;EAEF,KAAKE,UAAU,IAAI,YAAY,MAAM;GACnC,WAAW,iBAAiB,KAAKG,cAAc,YAAY;GAC3D,UAAU,cAAc,MAAM,iBAAiB,WAAW;IACxD,MAAM,cAAc,oBAAoB,KAAK,EAAE;IAC/C,OAAO,KAAKC,cAAc,MAAM,iBAAiB,aAAa,cAAc,MAAM;GACpF;GACA,eAAe,KAAKC,iBAAiB;EACvC,CAAC;CACH;CAEA,IAAI,eAAoD;EACtD,OAAO,KAAKH;CACd;CAEA,IAAI,aAAa,SAA8C;EAE7D,MAAM,cAAc,SAAS,OAAO,IAAI,UAAU;EAElD,IAAI,CAAC,KAAKA,sBAAsB,aAC9B,KAAK,iBAAiB,cAAc,KAAKD,mBAAmB;EAE9D,IAAI,KAAKC,sBAAsB,CAAC,aAC9B,KAAK,oBAAoB,cAAc,KAAKD,mBAAmB;EAEjE,KAAKC,qBAAqB;CAC5B;CAIA,MAAM,aACJ,MACA,UAAkD,CAAC,GACpC;EACf,MAAM,gBAAgB,KAAKJ;EAC3B,MAAM,EAAE,MAAM,OAAO,aAAa,aAAa,aAAa,YAC1D,mBAAmB,IAAI;EACzB,MAAM,WAAW,eAAe,OAAO;EACvC,MAAM,YAAY,mBAAmB,SAAS,SAAS;EACvD,MAAM,qBAAqB,gBAAgB,SAAS,MAAM;EAE1D,oBAAoB,aAAa;EACjC,MAAM,0BAAgC;GACpC,IAAI,KAAKC,OAAO,IAAI,IAAI,GACtB,MAAM,IAAI,mBACR,gBAAgB,KAAK,yBACrB,mBACF;EAEJ;EAGA,kBAAkB;EAClB,IAAI,CAAC,2BAA2B,KAAK,IAAI,GACvC,MAAM,IAAI,mBACR,+EAA+E,QAC/E,mBACF;EAEF,IAAI,CAAC,aACH,MAAM,IAAI,mBAAmB,sCAAsC,mBAAmB;EAExF,MAAM,mBAAmB,gBAAgB,SAAY,SAAY,cAAc,WAAW;EAC1F,oBAAoB,eAAe;EACnC,MAAM,iBAAiB,aAAa,SAAS;EAE7C,MAAM,aAAyB;GAC7B,UAAU;IAAE;IAAM;IAAO;IAAa;IAAa;GAAiB;GACpE;GACA,WAAW;EACb;EAEA,MAAM,SAAS,MAAM,KAAKO,eAAe;EACzC,oBAAoB,eAAe;EAEnC,kBAAkB;EAElB,OAAO,IAAI,SAAe,SAAS,WAAW;GAE5C,oBAAoB,iBAClB,eACM;IACJ,KAAKP,OAAO,OAAO,IAAI;IACvB,AAAK,OAAO,OAAO,cAAc;IACjC,OAAO,mBAAmB,MAAM;GAClC,GACA,EAAE,MAAM,KAAK,CACf;GAEA,KAAKA,OAAO,IAAI,MAAM,UAAU;GAChC,OAAO,OAAO,cAAc,EAAE,KAAK,SAAS,MAAM;EACpD,CAAC;CACH;CAEA,MAAM,SACJ,UAA6C,CAAC,GACZ;EAClC,MAAM,gBAAgB,KAAKD;EAE3B,MAAM,cAAc,mBADH,eAAe,OACc,EAAE,WAAW;EAE3D,oBAAoB,aAAa;EACjC,MAAM,SAAS,MAAM,KAAKQ,eAAe;EACzC,MAAM,mBAAmB,aAAa,WAAW;EAEjD,MAAM,QAAQ,MAAM,OAAO,SAAS,gBAAgB;EAGpD,MAAM,MAAM,MAAM,UAAU;GAC1B,IAAI,KAAK,SAAS,MAAM,MACtB,OAAO;GAET,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK;EACvC,CAAC;EAGD,OAAO,IAAI,SAAS,YAAY;GAC9B,gBAAgB,QAAQ,KAAK,CAAC;EAChC,CAAC;CACH;CAEA,MAAM,YACJ,MACA,cAAsB,CAAC,GACvB,UAAiD,CAAC,GACjC;EACjB,MAAM,gBAAgB,KAAKR;EAC3B,MAAM,SAAS,oBAAoB,IAAI;EAEvC,MAAM,eAAe,gBADJ,eAAe,OACY,EAAE,MAAM;EAEpD,oBAAoB,aAAa;EACjC,MAAM,iBAAiB,IAAI,MAAM,OAAO,MAAM,GAAG;EACjD,IAAI,CAAC,kBAAkB,mBAAmB,QACxC,MAAM,IAAI,mBAAmB,4BAA4B,mBAAmB;EAE9E,IAAI,CAAC,SAAS,WAAW,GACvB,MAAM,IAAI,UAAU,+BAA+B;EAGrD,MAAM,kBAAkB,cAAc,WAAW;EACjD,cAAc,eAAe;EAC7B,MAAM,SAAS,MAAM,KAAKQ,eAAe;EACzC,cAAc,eAAe;EAC7B,MAAM,eAAe,oBAAoB,aAAa;EACtD,IAAI,OAAO,WAAW,cACpB,OAAO,OAAO,QACZ,OAAO,QACP,gBACA,OAAO,MACP,iBACA,YACF;EAGF,OAAO,KAAKF,cACV,OAAO,MACP,iBACA,gBACA,aAAa,QACb,YACF;CACF;CAEA,cACE,MACA,iBACA,gBACA,cACA,cACiB;EACjB,OAAO,IAAI,SAAiB,SAAS,WAAW;GAC9C,cAAc,eAAe;GAC7B,MAAM,qBAAqB,IAAI,gBAAgB;GAE/C,IAAI,mBAAmB;GAEvB,MAAM,sBAA4B;IAChC,OAAO,aAAc,MAAM;IAG3B,gBAAgB;KACd,IAAI,CAAC,kBACH,mBAAmB,MAAM;IAE7B,CAAC;GACH;GAEA,MAAM,wBAA8B;IAClC,mBAAmB;IACnB,gBAAgB;KACd,cAAc,oBAAoB,SAAS,aAAa;KACxD,OAAO,eAAe,CAAC;IACzB,CAAC;GACH;GAEA,MAAM,qBAAqB,UAAyB;IAClD,mBAAmB;IAEnB,IAAI,cAAc,SAChB;IAGF,IAAI;KACF,MAAM,mBAAmB,cAAc,KAAK;KAC5C,gBAAgB;MACd,cAAc,oBAAoB,SAAS,aAAa;MACxD,QAAQ,gBAAgB;KAC1B,CAAC;IACH,QAAQ;KACN,gBAAgB;IAClB;GACF;GAEA,MAAM,qBAA2B;IAC/B,IAAI,cAAc,SAChB;IAGF,IAAI;KACF,MAAM,cAAc,oBAAoB,KAAKN,SAAS;KACtD,MAAM,aAAa,KAAKC,OAAO,IAAI,IAAI;KACvC,IACE,CAAC,cACD,mBAAmB,YAAY,UAC/B,CAAC,YAAY,YAAY,YAAY,QAAQ,YAAY,GACzD;MACA,gBAAgB;MAChB;KACF;KAEA,MAAM,QAAiB,KAAK,MAAM,eAAe;KACjD,IAAI,CAAC,SAAS,KAAK,GAAG;MACpB,gBAAgB;MAChB;KACF;KAGA,MAAM,UAAU,WAAW;KAC3B,MAAM,iBAAiB,QAAQ,OAAO,EAAE,QAAQ,mBAAmB,OAAO,CAAC;KAC3E,QAAQ,QAAQ,cAAc,EAAE,KAAK,mBAAmB,eAAe;IACzE,QAAQ;KACN,gBAAgB;IAClB;GACF;GAEA,cAAc,iBAAiB,SAAS,eAAe,EAAE,MAAM,KAAK,CAAC;GACrE,UAAU,YAAY;EACxB,CAAC;CACH;CAEA,MAAMO,iBAAuC;EAC3C,MAAM,SAAS,KAAKN;EACpB,IAAI,CAAC,UAAU,CAAE,MAAM,OAAO,QAAQ,GACpC,MAAM,IAAI,mBAAmB,4CAA4C,iBAAiB;EAE5F,oBAAoB,KAAKF,SAAS;EAClC,OAAO;CACT;CAEA,cAAc,cAAsC;EAClD,MAAM,cAAc,oBAAoB,KAAKA,SAAS,EAAE;EACxD,MAAM,UAAU,CAAC;EACjB,KAAK,MAAM,cAAc,KAAKC,OAAO,OAAO,GAAG;GAC7C,IAAI,CAAC,YAAY,YAAY,aAAa,YAAY,GACpD;GAEF,QAAQ,KAAK,WAAW,QAAQ;EAClC;EACA,OAAO;CACT;CAEA,mBAAkC;EAChC,OAAO,IAAI,SAAS,YAAY;GAC9B,gBAAgB;IACd,KAAK,cAAc,IAAI,MAAM,YAAY,CAAC;IAC1C,QAAQ;GACV,CAAC;EACH,CAAC;CACH;AACF;AAEA,SAAS,YAAY,MAAkB,aAAqB,cAA+B;CACzF,OAAO,gBAAgB,gBAAgB,KAAK,UAAU,SAAS,YAAY;AAC7E;AAGA,MAAM,0BAA0B,SAAS,eAAsB;CAC7D,MAAM,IAAI,UAAU,qBAAqB;AAC3C;AAEA,OAAO,eAAe,yBAAyB,QAAQ,EAAE,OAAO,eAAe,CAAC;AAChF,OAAO,eAAe,yBAAyB,aAAa;CAC1D,OAAO,qBAAqB;CAC5B,UAAU;AACZ,CAAC;AACD,OAAO,eAAe,yBAAyB,WAAW;AAC1D,OAAO,iBAAiB,qBAAqB,WAAW;CACtD,aAAa;EAAE,OAAO;EAAyB,cAAc;EAAM,UAAU;CAAK;EACjF,OAAO,cAAc;EAAE,OAAO;EAAgB,cAAc;CAAK;CAClE,cAAc,EAAE,YAAY,KAAK;CACjC,UAAU,EAAE,YAAY,KAAK;CAC7B,aAAa,EAAE,YAAY,KAAK;CAChC,cAAc,EAAE,YAAY,KAAK;AACnC,CAAC;AAGD,SAAS,mBAAmB,OAAgB;CAC1C,MAAM,aAAa,eAAe,KAAK;CACvC,MAAM,cAAc,gBAAgB,WAAW,WAAW;CAC1D,MAAM,cAAc,YAAY,cAAc,WAAW,aAAa,aAAa,CAAC;CACpF,MAAM,WAAW,cAAc,WAAW,SAAS,SAAS;CAC5D,IAAI,OAAO,aAAa,YACtB,MAAM,IAAI,UAAU,4BAA4B;CAGlD,MAAM,UAAU;CAChB,MAAM,cAAc,gBAAgB,WAAW,WAAW;CAC1D,MAAM,OAAO,YAAY,cAAc,WAAW,MAAM,MAAM,CAAC;CAC/D,MAAM,WAAW,WAAW;CAG5B,OAAO;EAAE;EAAM,OAFD,aAAa,SAAY,KAAK,YAAY,QAAQ;EAE1C;EAAa;EAAa;EAAa;CAAQ;AACvE;AAGA,SAAS,oBAAoB,OAAgB;CAC3C,MAAM,aAAa,eAAe,KAAK;CACvC,gBAAgB,WAAW,WAAW;CACtC,YAAY,cAAc,WAAW,aAAa,aAAa,CAAC;CAChE,gBAAgB,WAAW,WAAW;CACtC,MAAM,OAAO,YAAY,cAAc,WAAW,MAAM,MAAM,CAAC;CAC/D,MAAM,SAAS,YAAY,cAAc,WAAW,QAAQ,QAAQ,CAAC;CACrE,MAAM,QAAQ,WAAW;CACzB,IAAI,UAAU,QACZ,YAAY,KAAK;CAEnB,MAAM,eAAe,cAAc,WAAW,QAAQ,QAAQ;CAC9D,IAAI,CAAC,SAAS,YAAY,GACxB,MAAM,IAAI,UAAU,yBAAyB;CAE/C,UAAW,KAAK,YAAY;CAG5B,OAAO;EAAE;EAAM;EAAQ,QAAQ;CAAuB;AACxD;AAEA,SAAS,gBAAgB,OAAoC;CAC3D,IAAI,UAAU,UAAa,CAAC,SAAS,KAAK,GACxC,MAAM,IAAI,UAAU,+BAA+B;CAErD,OAAO;AACT;AAEA,SAAS,SAAS,OAAiC;CACjD,OAAQ,OAAO,UAAU,YAAY,UAAU,QAAS,OAAO,UAAU;AAC3E;AAGA,SAAS,eAAe,OAA8C;CACpE,IAAI,SAAS,MACX,OAAO,CAAC;CAEV,IAAI,CAAC,SAAS,KAAK,GACjB,MAAM,IAAI,UAAU,uBAAuB;CAG7C,OAAO;AACT;AAEA,SAAS,gBAAgB,OAAoD;CAC3E,IAAI,UAAU,QACZ;CAEF,MAAM,aAAa,eAAe,KAAK;CACvC,MAAM,cAAsC,CAAC;CAC7C,KAAK,MAAM,QAAQ,iBACjB,YAAY,QAAQ,QAAQ,WAAW,KAAK;CAE9C,OAAO;AACT;AAGA,SAAS,YAAY,OAAwB;CAC3C,IAAI,OAAO,UAAU,UACnB,MAAM,IAAI,UAAU,qCAAqC;CAE3D,OAAO,OAAO,KAAK;AACrB;AAGA,SAAS,YAAY,OAAwB;CAC3C,OAAO,YAAY,KAAK,EAAE,aAAa;AACzC;AAEA,SAAS,cAAc,OAAgB,MAAuB;CAC5D,IAAI,UAAU,QACZ,MAAM,IAAI,UAAU,GAAG,KAAK,aAAa;CAE3C,OAAO;AACT;AAEA,SAAS,cAAc,OAAwB;CAC7C,MAAM,SAAS,KAAK,UAAU,KAAK;CACnC,IAAI,WAAW,QACb,MAAM,IAAI,UAAU,gCAAgC;CAEtD,OAAO;AACT;AAEA,SAAS,gBAAgB,OAAyC;CAChE,IAAI,UAAU,QACZ;CAIF,OAAO,YAAY,IAAI,CAAC,KAAoB,CAAC;AAC/C;AAGA,SAAS,mBAAmB,OAA0B;CACpD,IAAI,UAAU,QACZ,OAAO,CAAC;CAEV,IAAI,CAAC,SAAS,KAAK,GACjB,MAAM,IAAI,UAAU,4BAA4B;CAElD,MAAM,cAAc,eAAe,KAAK,EAAE,OAAO;CACjD,IAAI,OAAO,gBAAgB,YACzB,MAAM,IAAI,UAAU,4BAA4B;CAGlD,MAAM,WAAW,EACf,CAAC,OAAO,YAAY;EAClB,MAAM,WAAoB,QAAQ,MAAM,aAAa,OAAO,CAAC,CAAC;EAC9D,IAAI,CAAC,SAAS,QAAQ,GACpB,MAAM,IAAI,UAAU,4BAA4B;EAElD,MAAM,OAAO,eAAe,QAAQ,EAAE;EACtC,IAAI,OAAO,SAAS,YAClB,MAAM,IAAI,UAAU,kCAAkC;EAGxD,OAAO,EACL,OAAO;GACL,OAAO,QAAQ,MAAM,MAAM,UAAU,CAAC,CAAC;EACzC,EACF;CACF,EACF;CACA,OAAO,MAAM,KAAK,UAAU,WAAW;AACzC;AAEA,SAAS,aAAa,SAA6B;CACjD,OAAO,QAAQ,KAAK,UAAU;EAE5B,MAAM,SAAS,IAAI,MAAM,KAAK,GAAG;EACjC,IAAI,WAAW,QACb,MAAM,IAAI,mBAAmB,kBAAkB,eAAe;EAGhE,MAAM,MAAM,IAAI,MAAM,MAAM;EAC5B,IAAI,CAAC,OAAO,CAAC,yBAAyB,GAAG,GACvC,MAAM,IAAI,mBAAmB,yCAAyC,eAAe;EAEvF,OAAO;CACT,CAAC;AACH;AAIA,SAAS,yBAAyB,EAAE,UAAU,YAA0B;CACtE,IAAI,CAAC,UAAU,MAAM,EAAE,SAAS,QAAQ,GACtC,OAAO;CAET,MAAM,aACJ,aAAa,WAEb,mCAAmC,KAAK,QAAQ;CAClD,MAAM,cACJ,aAAa,eACb,aAAa,gBACb,SAAS,SAAS,YAAY,KAC9B,SAAS,SAAS,aAAa;CACjC,OAAO,CAAC,SAAS,KAAK,EAAE,SAAS,QAAQ,MAAM,cAAc;AAC/D;AAEA,SAAS,oBAAoB,OAAyB;CACpD,MAAM,OAAO,aAAa,KAAK;CAC/B,IAAI,CAAC,MACH,MAAM,IAAI,mBAAmB,oCAAoC,mBAAmB;CAItF,IAAI,gBAAgB,KAAK,MAAM,OAC7B,MAAM,IAAI,mBAAmB,4CAA4C,iBAAiB;CAE5F,OAAO;AACT;AAIA,IAAI;AACJ,MAAM,cAA8B,CAAC;AAErC,SAAS,UAAU,UAA4B;CAC7C,IAAI,CAAC,UAAU;EACb,MAAM,UAAU,IAAI,eAAe;EACnC,QAAQ,MAAM,kBAAkB,YAAY,MAAM,IAAI;EACtD,WAAW,QAAQ;CACrB;CACA,YAAY,KAAK,QAAQ;CACzB,SAAS,YAAY,MAAS;AAChC;;;;;;;;;;ACzmBA,SAAgB,gBAAsB;CACpC,IAAI,OAAO,aAAa,eAAe,CAAC,WAAW,iBAAiB;CACpE,IACE,OAAO,QAAQ,kBAAkB,cACjC,OAAO,YAAY,QAAQ,cAC3B,OAAO,OAAO,UAAU,iBAAiB,cACzC,OAAO,IAAI,UAAU,YAErB;CAEF,gBAAgB;CAChB,MAAM,UAAU,SAAS;CACzB,IAAI,SAAS,mCAAmC,OAAO;AACzD"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/declarative-forms.ts","../src/index.ts"],"sourcesContent":["import type { WebMCP } from 'webmcp-types';\n\ntype InputSchema = NonNullable<WebMCP.ModelContextTool['inputSchema']>;\ntype WebMcpToolInput = Parameters<WebMCP.ToolExecuteCallback>[0];\n// webmcp-types accepts any schema object. This is the subset generated from form controls.\ninterface FormParameterSchema {\n type: 'string' | 'number' | 'boolean' | 'array';\n description?: string;\n title?: string;\n const?: string;\n enum?: string[];\n anyOf?: FormParameterSchema[];\n items?: FormParameterSchema;\n uniqueItems?: boolean;\n minimum?: number;\n maximum?: number;\n multipleOf?: number;\n pattern?: string;\n format?: string;\n}\n\ntype WebMcpToolResult = Awaited<ReturnType<WebMCP.ToolExecuteCallback>>;\n\ntype DeclarativeControl = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\ntype Submitter = HTMLButtonElement | HTMLInputElement;\n\ninterface DeclarativeToolDefinition {\n name: string;\n title: string;\n description: string;\n inputSchema: InputSchema;\n autosubmit: boolean;\n}\n\ninterface DeclarativeRegistration {\n controller: AbortController;\n fingerprint: string;\n form: HTMLFormElement;\n name: string;\n cancelPending?: (reason: ErrorOptions['cause']) => void;\n}\n\ninterface ActiveSubmission {\n complete(event: SubmitEvent): void;\n direct(): void;\n respond(event: SubmitEvent): void;\n}\n\nconst agentInvokedEvents = new WeakSet<SubmitEvent>();\nconst agentResponses = new WeakMap<SubmitEvent, Promise<WebMcpToolResult>>();\nconst activeSubmissions = new WeakMap<HTMLFormElement, ActiveSubmission>();\n\nfunction isAgentInvokedSubmitEvent(event: SubmitEvent): boolean {\n return (\n event.isTrusted &&\n (agentInvokedEvents.has(event) ||\n (event.eventPhase !== Event.NONE &&\n event.target instanceof HTMLFormElement &&\n activeSubmissions.has(event.target)))\n );\n}\n\nfunction respondWithAgentSubmitEvent(\n event: SubmitEvent,\n agentResponse: Promise<WebMcpToolResult>\n): void {\n if (!isAgentInvokedSubmitEvent(event)) {\n throw new DOMException(\n 'respondWith() is only available during an agent-invoked submit event',\n 'InvalidStateError'\n );\n }\n if (!event.defaultPrevented) {\n throw new DOMException(\n 'respondWith() requires preventDefault() during an agent-invoked submit event',\n 'InvalidStateError'\n );\n }\n if (event.eventPhase === Event.NONE) {\n throw new DOMException(\n 'respondWith() is only available while the submit event is being dispatched',\n 'InvalidStateError'\n );\n }\n agentInvokedEvents.add(event);\n const response = Promise.resolve(agentResponse);\n agentResponses.set(event, response);\n if (event.target instanceof HTMLFormElement) {\n activeSubmissions.get(event.target)?.respond(event);\n }\n}\n\nconst TEXT_INPUT_TYPES = new Set(['email', 'password', 'search', 'tel', 'text', 'url']);\nconst READONLY_INPUT_TYPES = new Set([\n ...TEXT_INPUT_TYPES,\n 'date',\n 'datetime-local',\n 'month',\n 'number',\n 'time',\n 'week',\n]);\n\nfunction isControl(element: Element): element is DeclarativeControl {\n return (\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n );\n}\n\nfunction getFormControls(form: HTMLFormElement): HTMLFormControlsCollection {\n return Object.getOwnPropertyDescriptor(HTMLFormElement.prototype, 'elements')?.get?.call(form);\n}\n\nfunction getFormAttribute(form: HTMLFormElement, name: string): string | null {\n return Element.prototype.getAttribute.call(form, name);\n}\n\nfunction formHasAttribute(form: HTMLFormElement, name: string): boolean {\n return Element.prototype.hasAttribute.call(form, name);\n}\n\nfunction isConnected(node: Node): boolean {\n return Object.getOwnPropertyDescriptor(Node.prototype, 'isConnected')?.get?.call(node);\n}\n\nfunction getOpenShadowRoot(element: Element): ShadowRoot | null {\n return Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot')?.get?.call(element);\n}\n\nfunction checkFormValidity(form: HTMLFormElement): boolean {\n return HTMLFormElement.prototype.checkValidity.call(form);\n}\n\nfunction requestFormSubmit(form: HTMLFormElement, submitter?: Submitter): void {\n HTMLFormElement.prototype.requestSubmit.call(form, submitter);\n}\n\nfunction getControls(form: HTMLFormElement): DeclarativeControl[] {\n return [...getFormControls(form)].filter(\n (element): element is DeclarativeControl =>\n isControl(element) &&\n !element.matches(':disabled') &&\n !(\n 'readOnly' in element &&\n element.readOnly &&\n (element instanceof HTMLTextAreaElement || READONLY_INPUT_TYPES.has(element.type))\n )\n );\n}\n\nfunction controlGroups(form: HTMLFormElement): Map<string, DeclarativeControl[]> {\n const groups = new Map<string, DeclarativeControl[]>();\n for (const control of getControls(form)) {\n const name = control.name.trim();\n const controls = groups.get(name);\n if (controls) controls.push(control);\n else groups.set(name, [control]);\n }\n return groups;\n}\n\nfunction labelText(control: DeclarativeControl): string {\n return [...(control.labels ?? [])]\n .map((label) => {\n const copy = label.cloneNode(true);\n if (!(copy instanceof HTMLElement)) return '';\n copy\n .querySelectorAll('button, input, meter, output, progress, select, textarea')\n .forEach((element) => element.remove());\n return copy.textContent?.trim() ?? '';\n })\n .filter(Boolean)\n .join('; ');\n}\n\nfunction commonFieldset(\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[]\n): HTMLFieldSetElement | undefined {\n for (\n let element = controls[0]?.parentElement;\n element && element !== form;\n element = element.parentElement\n ) {\n if (\n element instanceof HTMLFieldSetElement &&\n controls.every((control) => element.contains(control))\n ) {\n return element;\n }\n }\n return undefined;\n}\n\nfunction parameterDescription(\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[]\n): string | undefined {\n if (controls.length === 1) {\n const control = controls[0];\n if (!control) return undefined;\n return (\n control.getAttribute('toolparamdescription') ||\n labelText(control) ||\n control.getAttribute('aria-description') ||\n undefined\n );\n }\n return commonFieldset(form, controls)?.getAttribute('toolparamdescription') || undefined;\n}\n\nfunction withDescription(\n schema: FormParameterSchema,\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[],\n extra?: string\n): FormParameterSchema {\n const description = parameterDescription(form, controls);\n const combined = description && extra ? `${description} (${extra})` : description || extra;\n return combined ? { ...schema, description: combined } : schema;\n}\n\nfunction validNumberAttribute(input: HTMLInputElement, name: 'max' | 'min'): number | undefined {\n const raw = input.getAttribute(name);\n if (raw === null || raw.trim() === '') return undefined;\n const value = Number(raw);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction validStep(input: HTMLInputElement, fallback: number): number {\n const step = Number(input.getAttribute('step'));\n return Number.isFinite(step) && step > 0 ? step : fallback;\n}\n\nfunction isStepBaseMultiple(stepBase: number, step: number): boolean {\n const quotient = stepBase / step;\n return Math.abs(quotient - Math.round(quotient)) < Number.EPSILON * 16;\n}\n\nfunction withPattern(schema: FormParameterSchema, input: HTMLInputElement): FormParameterSchema {\n const pattern = input.getAttribute('pattern');\n if (pattern === null) return schema;\n try {\n new RegExp(pattern, 'v');\n } catch {\n return schema;\n }\n return { ...schema, pattern };\n}\n\nfunction numberSchema(input: HTMLInputElement): FormParameterSchema {\n const schema: FormParameterSchema = { type: 'number' };\n const minimum = validNumberAttribute(input, 'min');\n const maximum = validNumberAttribute(input, 'max');\n if (minimum !== undefined) schema.minimum = minimum;\n if (maximum !== undefined) schema.maximum = maximum;\n if (input.getAttribute('step') !== 'any') {\n const step = validStep(input, 1);\n const rawValue = Number(input.getAttribute('value'));\n const stepBase = minimum ?? (Number.isFinite(rawValue) ? rawValue : 0);\n if (isStepBaseMultiple(stepBase, step)) schema.multipleOf = step;\n }\n return schema;\n}\n\nfunction temporalFormat(input: HTMLInputElement, datePrefix: string): string {\n const step = validStep(input, 60);\n if (step < 1) return `${datePrefix}(:[0-5][0-9](\\\\.[0-9]{1,3})?)?$`;\n if (step < 60) return `${datePrefix}(:[0-5][0-9])?$`;\n return `${datePrefix}$`;\n}\n\nfunction optionSchemas(options: readonly HTMLOptionElement[]) {\n return {\n anyOf: options.map((option) => ({\n type: 'string' as const,\n const: option.value,\n title: option.textContent ?? '',\n })),\n enum: options.map((option) => option.value),\n };\n}\n\nfunction groupChoiceSchemas(controls: readonly HTMLInputElement[]) {\n return {\n anyOf: controls.map((control) => {\n const title = labelText(control);\n const schema: FormParameterSchema = { type: 'string', const: control.value };\n if (title) schema.title = title;\n return schema;\n }),\n enum: controls.map((control) => control.value),\n };\n}\n\nfunction isInput(control: DeclarativeControl, type: string): control is HTMLInputElement {\n return control instanceof HTMLInputElement && control.type === type;\n}\n\nfunction inputSchema(input: HTMLInputElement): FormParameterSchema | undefined {\n if (TEXT_INPUT_TYPES.has(input.type)) return withPattern({ type: 'string' }, input);\n switch (input.type) {\n case 'hidden':\n return input.getAttribute('toolparamdescription') ? { type: 'string' } : undefined;\n case 'number':\n return withPattern(numberSchema(input), input);\n case 'range': {\n const schema = numberSchema(input);\n schema.minimum ??= 0;\n schema.maximum ??= 100;\n return schema;\n }\n case 'checkbox':\n return { type: 'boolean' };\n case 'date':\n return { type: 'string', format: 'date' };\n case 'month':\n return { type: 'string', format: '^[0-9]{4}-(0[1-9]|1[0-2])$' };\n case 'week':\n return { type: 'string', format: '^[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-3])$' };\n case 'time':\n return { type: 'string', format: temporalFormat(input, '^([01][0-9]|2[0-3]):[0-5][0-9]') };\n case 'datetime-local':\n return {\n type: 'string',\n format: temporalFormat(\n input,\n '^[0-9]{4}-(0[1-9]|1[0-2])-[0-9]{2}T([01][0-9]|2[0-3]):[0-5][0-9]'\n ),\n };\n case 'color':\n return { type: 'string', format: '^#[0-9a-zA-Z]{6}$' };\n default:\n return undefined;\n }\n}\n\nfunction parameterSchema(\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[]\n): FormParameterSchema | undefined {\n const [first] = controls;\n if (!first) return undefined;\n let schema: FormParameterSchema | undefined;\n if (controls.every((control) => isInput(control, 'radio'))) {\n schema = { type: 'string', ...groupChoiceSchemas(controls) };\n } else if (controls.length > 1) {\n if (controls.every((control) => isInput(control, 'checkbox'))) {\n schema = {\n type: 'array',\n items: { type: 'string', ...groupChoiceSchemas(controls) },\n uniqueItems: true,\n };\n }\n } else if (first instanceof HTMLTextAreaElement) {\n schema = { type: 'string' };\n } else if (first instanceof HTMLSelectElement) {\n const choices = optionSchemas([...first.options]);\n schema = first.multiple\n ? { type: 'array', items: { type: 'string', ...choices }, uniqueItems: true }\n : { type: 'string', ...choices };\n } else {\n schema = inputSchema(first);\n }\n const dateHint =\n first.type === 'date' ? \"Dates MUST be provided in 'YYYY-MM-DD' format.\" : undefined;\n return schema && withDescription(schema, form, controls, dateHint);\n}\n\nfunction synthesizeSchema(form: HTMLFormElement): InputSchema {\n const properties: Record<string, FormParameterSchema> = {};\n const required: string[] = [];\n for (const [name, controls] of controlGroups(form)) {\n if (!name) continue;\n const schema = parameterSchema(form, controls);\n if (!schema) continue;\n Object.defineProperty(properties, name, {\n configurable: true,\n enumerable: true,\n value: schema,\n writable: true,\n });\n if (controls.some((control) => control.required)) required.push(name);\n }\n return { type: 'object', properties, required };\n}\n\nfunction toolDefinition(form: HTMLFormElement): DeclarativeToolDefinition {\n return {\n name: getFormAttribute(form, 'toolname') ?? '',\n title: getFormAttribute(form, 'tooltitle') ?? '',\n description: getFormAttribute(form, 'tooldescription') ?? '',\n inputSchema: synthesizeSchema(form),\n autosubmit: formHasAttribute(form, 'toolautosubmit'),\n };\n}\n\nfunction toFormString(value: unknown): string | undefined {\n if (typeof value === 'string' || typeof value === 'boolean') return String(value);\n if (typeof value === 'number' && Number.isFinite(value)) return String(value);\n return undefined;\n}\n\nfunction toFormBoolean(value: unknown): boolean | undefined {\n if (typeof value === 'boolean') return value;\n if (typeof value === 'number' && Number.isInteger(value)) return value !== 0;\n if (typeof value !== 'string') return undefined;\n if (value === '1' || value.toLowerCase() === 'true') return true;\n if (value === '0' || value.toLowerCase() === 'false') return false;\n return undefined;\n}\n\nfunction hasUniqueAllowedValues(value: unknown, allowed: ReadonlySet<string>): value is unknown[] {\n if (!Array.isArray(value)) return false;\n const remaining = new Set(allowed);\n for (const item of value) {\n const string = toFormString(item);\n if (string === undefined || !remaining.delete(string)) return false;\n }\n return true;\n}\n\nfunction inputAcceptsValue(input: HTMLInputElement, value: string): boolean {\n if (value === '') return input.type !== 'number' && input.type !== 'range';\n const probe = input.ownerDocument.createElement('input');\n probe.type = input.type;\n probe.value = value;\n return probe.value !== '';\n}\n\ntype FormParameterValue = string | boolean | number | unknown[];\n\nfunction isFormParameterValue(\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[],\n value: unknown\n): value is FormParameterValue {\n const [first] = controls;\n if (!first || !parameterSchema(form, controls)) return false;\n const string = toFormString(value);\n if (controls.every((control) => isInput(control, 'radio'))) {\n return controls.some((control) => control.value === string);\n }\n // Any other group with a schema is a checkbox group.\n if (controls.length > 1) {\n return hasUniqueAllowedValues(value, new Set(controls.map((control) => control.value)));\n }\n if (first instanceof HTMLSelectElement) {\n const allowed = new Set([...first.options].map((option) => option.value));\n if (first.multiple) return hasUniqueAllowedValues(value, allowed);\n return string !== undefined && allowed.has(string);\n }\n if (first instanceof HTMLTextAreaElement) return string !== undefined;\n if (first.type === 'checkbox') return toFormBoolean(value) !== undefined;\n return string !== undefined && inputAcceptsValue(first, string);\n}\n\nfunction dispatchInputAndChange(control: DeclarativeControl): void {\n control.dispatchEvent(new Event('input', { bubbles: true, composed: true }));\n control.dispatchEvent(new Event('change', { bubbles: true }));\n}\n\n// Prototype setters skip instance overrides such as React's value tracker, so frameworks\n// treat the dispatched events as real changes.\nfunction setValue(control: HTMLInputElement | HTMLTextAreaElement, value: string): void {\n if (control.value === value) return;\n const prototype =\n control instanceof HTMLInputElement\n ? HTMLInputElement.prototype\n : HTMLTextAreaElement.prototype;\n Object.getOwnPropertyDescriptor(prototype, 'value')?.set?.call(control, value);\n dispatchInputAndChange(control);\n}\n\nfunction setChecked(control: HTMLInputElement, checked: boolean): void {\n if (control.checked === checked) return;\n Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'checked')?.set?.call(\n control,\n checked\n );\n dispatchInputAndChange(control);\n}\n\n// Expects a value that isFormParameterValue() accepted.\nfunction fillParameter(controls: readonly DeclarativeControl[], value: FormParameterValue): void {\n const [first] = controls;\n const string = toFormString(value);\n const values = new Set(Array.isArray(value) ? value.map(toFormString) : []);\n if (controls.every((control) => isInput(control, 'radio'))) {\n const control = controls.find((candidate) => candidate.value === string);\n if (control) setChecked(control, true);\n } else if (controls.length > 1) {\n for (const control of controls) {\n if (control instanceof HTMLInputElement) setChecked(control, values.has(control.value));\n }\n } else if (first instanceof HTMLSelectElement) {\n if (first.multiple) {\n let changed = false;\n for (const option of first.options) {\n const next = values.has(option.value);\n if (option.selected === next) continue;\n option.selected = next;\n changed = true;\n }\n if (changed) dispatchInputAndChange(first);\n } else if (string !== undefined && first.value !== string) {\n first.value = string;\n dispatchInputAndChange(first);\n }\n } else if (first && isInput(first, 'checkbox')) {\n const checked = toFormBoolean(value);\n if (checked !== undefined) setChecked(first, checked);\n } else if (first && string !== undefined) {\n setValue(first, string);\n }\n}\n\n// Upstream replaces every callback failure with its own generic error, so no reason\n// thrown or rejected from this layer reaches a caller.\nfunction fillForm(form: HTMLFormElement, input: WebMcpToolInput): void {\n if (Array.isArray(input)) throw executionError();\n const groups = controlGroups(form);\n const parameters: Array<{ controls: DeclarativeControl[]; value: FormParameterValue }> = [];\n for (const [name, value] of Object.entries(input)) {\n const controls = groups.get(name);\n if (!controls || !isFormParameterValue(form, controls, value)) throw executionError();\n parameters.push({ controls, value });\n }\n for (const { controls, value } of parameters) fillParameter(controls, value);\n}\n\nfunction findSubmitter(form: HTMLFormElement): Submitter | undefined {\n return [...getFormControls(form)].find(\n (element): element is Submitter =>\n !element.matches(':disabled') &&\n ((element instanceof HTMLButtonElement && element.type === 'submit') ||\n (element instanceof HTMLInputElement && ['image', 'submit'].includes(element.type)))\n );\n}\n\nfunction executionError(): DOMException {\n return new DOMException('Tool execution failed', 'UnknownError');\n}\n\nfunction lifecycleEvent(type: 'toolactivated' | 'toolcancel', toolName: string): Event {\n const event = new Event(type);\n Object.defineProperty(event, 'toolName', { enumerable: true, value: toolName });\n return event;\n}\n\nfunction waitForSubmission(\n context: WebMCP.ModelContext,\n registration: DeclarativeRegistration,\n definition: DeclarativeToolDefinition,\n submitter: Submitter | undefined,\n signal: AbortSignal\n): Promise<WebMcpToolResult> {\n const { form } = registration;\n registration.cancelPending?.(executionError());\n\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n EventTarget.prototype.removeEventListener.call(form, 'invalid', onInvalid, true);\n signal.removeEventListener('abort', onAbort);\n activeSubmissions.delete(form);\n if (registration.cancelPending === cancel) delete registration.cancelPending;\n };\n const finish = (callback: () => void) => {\n if (settled) return;\n settled = true;\n cleanup();\n callback();\n };\n const cancel = (reason: ErrorOptions['cause']) => finish(() => reject(reason));\n // A submission without respondWith() resolves to null, as in Chromium; an undefined\n // response maps to null as well so that upstream can serialize the result.\n const settleResponse = (response: Promise<WebMcpToolResult>) => {\n // Once the page has responded, unregistering the form no longer cancels the call.\n if (registration.cancelPending === cancel) delete registration.cancelPending;\n response.then(\n (value) => finish(() => resolve(value ?? null)),\n (cause: ErrorOptions['cause']) => finish(() => reject(cause))\n );\n };\n const onInvalid = (event: Event) => {\n if (!event.isTrusted) return;\n queueMicrotask(() => {\n if (!checkFormValidity(form)) cancel(executionError());\n });\n };\n const onAbort = () => {\n finish(() => {\n context.dispatchEvent(lifecycleEvent('toolcancel', definition.name));\n reject(signal.reason);\n });\n };\n\n activeSubmissions.set(form, {\n // A trusted dispatch runs a microtask checkpoint after each listener, so only a\n // task observes the event after the form's own listeners have run (#342).\n complete(event) {\n setTimeout(() => {\n const response = agentResponses.get(event);\n if (response) settleResponse(response);\n else if (event.defaultPrevented) cancel(executionError());\n else finish(() => resolve(null));\n });\n },\n direct() {\n finish(() => resolve(null));\n },\n respond(event) {\n queueMicrotask(() => {\n const response = agentResponses.get(event);\n if (response) settleResponse(response);\n });\n },\n });\n registration.cancelPending = cancel;\n EventTarget.prototype.addEventListener.call(form, 'invalid', onInvalid, true);\n signal.addEventListener('abort', onAbort, { once: true });\n\n if (!definition.autosubmit) {\n submitter?.focus();\n context.dispatchEvent(lifecycleEvent('toolactivated', definition.name));\n return;\n }\n try {\n requestFormSubmit(form, submitter);\n context.dispatchEvent(lifecycleEvent('toolactivated', definition.name));\n } catch (error) {\n cancel(error);\n }\n });\n}\n\n/** Adds declarative tools until upstream implements them. */\nexport function installWebMCPDeclarativeExtensions(context: WebMCP.ModelContext): void {\n const prototype = SubmitEvent.prototype;\n // Native support and earlier bundle installations already own these hooks.\n if ('agentInvoked' in prototype && 'respondWith' in prototype) return;\n\n if (!('agentInvoked' in prototype)) {\n Object.defineProperty(prototype, 'agentInvoked', {\n configurable: true,\n enumerable: true,\n get(this: SubmitEvent) {\n return isAgentInvokedSubmitEvent(this);\n },\n });\n }\n\n if (!('respondWith' in prototype)) {\n Object.defineProperty(prototype, 'respondWith', {\n configurable: true,\n enumerable: true,\n writable: true,\n value(this: SubmitEvent, agentResponse: Promise<WebMcpToolResult>) {\n respondWithAgentSubmitEvent(this, agentResponse);\n },\n });\n }\n\n const registrations = new Map<HTMLFormElement, DeclarativeRegistration>();\n const blockedDefinitions = new Map<HTMLFormElement, string>();\n const observers = new Map<Document | ShadowRoot, MutationObserver>();\n const onSubmit = (event: Event) => {\n if (\n !(event instanceof SubmitEvent) ||\n !event.isTrusted ||\n !(event.target instanceof HTMLFormElement)\n ) {\n return;\n }\n // Only a form with a running tool call submits on the agent's behalf; marking\n // every trusted submit would report agentInvoked for ordinary user submissions.\n const submission = activeSubmissions.get(event.target);\n if (!submission) return;\n agentInvokedEvents.add(event);\n submission.complete(event);\n };\n\n const onReset = (event: Event) => {\n if (!event.isTrusted || !(event.target instanceof HTMLFormElement)) return;\n const form = event.target;\n // Task, not microtask: see complete().\n setTimeout(() => {\n if (event.defaultPrevented) return;\n registrations.get(form)?.cancelPending?.(executionError());\n });\n };\n\n function stopObservingRoot(root: Document | ShadowRoot): void {\n observers.get(root)?.disconnect();\n observers.delete(root);\n root.removeEventListener('reset', onReset, true);\n root.removeEventListener('submit', onSubmit, true);\n }\n\n function observeRoot(root: Document | ShadowRoot): void {\n if (observers.has(root)) return;\n const observer = new MutationObserver(sync);\n observers.set(root, observer);\n observer.observe(root, {\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true,\n });\n root.addEventListener('reset', onReset, true);\n // ponytail: submit is composed:false, so per-root capture sees every submission; hook\n // window capture too if a page listener ever stops propagation before this one.\n root.addEventListener('submit', onSubmit, true);\n }\n\n function sync(): void {\n observeRoot(document);\n for (const root of observers.keys()) {\n if (root instanceof ShadowRoot && !root.host.isConnected) {\n stopObservingRoot(root);\n }\n }\n\n const candidates = new Set<HTMLFormElement>();\n const selected = new Map<\n HTMLFormElement,\n { definition: DeclarativeToolDefinition; fingerprint: string }\n >();\n const selectedByName = new Map<string, HTMLFormElement>();\n for (const root of observers.keys()) {\n for (const element of root.querySelectorAll('*')) {\n const shadowRoot = getOpenShadowRoot(element);\n if (shadowRoot) observeRoot(shadowRoot);\n\n if (\n !(element instanceof HTMLFormElement) ||\n !formHasAttribute(element, 'toolname') ||\n !formHasAttribute(element, 'tooldescription') ||\n !isConnected(element)\n ) {\n continue;\n }\n const form = element;\n candidates.add(form);\n const definition = toolDefinition(form);\n const fingerprint = JSON.stringify(definition);\n const blockedFingerprint = blockedDefinitions.get(form);\n if (blockedFingerprint === fingerprint) continue;\n blockedDefinitions.delete(form);\n const existingForm = selectedByName.get(definition.name);\n if (existingForm) {\n // The form registered under a name keeps it; a duplicate stays blocked and retries\n // when its definition changes (WPT duplicate-tool-name).\n const holdsName = (candidate: HTMLFormElement) =>\n registrations.get(candidate)?.name === definition.name;\n if (!holdsName(form) || holdsName(existingForm)) {\n blockedDefinitions.set(form, fingerprint);\n continue;\n }\n const existingSelection = selected.get(existingForm);\n if (existingSelection)\n blockedDefinitions.set(existingForm, existingSelection.fingerprint);\n selected.delete(existingForm);\n }\n selectedByName.set(definition.name, form);\n selected.set(form, { definition, fingerprint });\n }\n }\n for (const form of blockedDefinitions.keys()) {\n if (!candidates.has(form)) blockedDefinitions.delete(form);\n }\n\n for (const [form, registration] of registrations) {\n const fingerprint = selected.get(form)?.fingerprint;\n if (fingerprint !== registration.fingerprint) {\n registration.cancelPending?.(executionError());\n registration.controller.abort();\n registrations.delete(form);\n }\n }\n\n for (const [form, { definition, fingerprint }] of selected) {\n if (registrations.has(form)) continue;\n const controller = new AbortController();\n const registration: DeclarativeRegistration = {\n controller,\n fingerprint,\n form,\n name: definition.name,\n };\n registrations.set(form, registration);\n void context\n .registerTool(\n {\n name: definition.name,\n title: definition.title,\n description: definition.description,\n inputSchema: definition.inputSchema,\n execute(input: WebMcpToolInput, options: WebMCP.ToolExecuteCallbackOptions) {\n const submitter = findSubmitter(form);\n if (!definition.autosubmit && !submitter) throw executionError();\n fillForm(form, input);\n return waitForSubmission(\n context,\n registration,\n definition,\n submitter,\n options.signal\n );\n },\n },\n { signal: controller.signal }\n )\n .catch((cause: ErrorOptions['cause']) => {\n controller.abort();\n // Invalid toolname/tooldescription attributes reject here. Without this the\n // form silently never becomes a tool, with no diagnostic in any channel.\n // Aborts are ordinary teardown, not a failure worth reporting.\n if (cause instanceof DOMException && cause.name === 'AbortError') return;\n console.error(\n `[webmcp] declarative form tool \"${definition.name}\" was not registered:`,\n cause\n );\n });\n }\n }\n\n const attachShadowDescriptor = Object.getOwnPropertyDescriptor(Element.prototype, 'attachShadow');\n if (attachShadowDescriptor?.configurable) {\n const nativeAttachShadow = Element.prototype.attachShadow;\n const attachShadow = function (this: Element, init: ShadowRootInit): ShadowRoot {\n const root = nativeAttachShadow.call(this, init);\n if (\n root.mode === 'open' &&\n Object.getOwnPropertyDescriptor(Node.prototype, 'ownerDocument')?.get?.call(this) ===\n document &&\n isConnected(this)\n ) {\n observeRoot(root);\n }\n return root;\n };\n Object.defineProperty(Element.prototype, 'attachShadow', {\n ...attachShadowDescriptor,\n value: attachShadow,\n });\n }\n\n const submitDescriptor = Object.getOwnPropertyDescriptor(HTMLFormElement.prototype, 'submit');\n if (submitDescriptor?.configurable) {\n const nativeSubmit = HTMLFormElement.prototype.submit;\n const submit = function (this: HTMLFormElement): void {\n nativeSubmit.call(this);\n activeSubmissions.get(this)?.direct();\n };\n Object.defineProperty(HTMLFormElement.prototype, 'submit', {\n ...submitDescriptor,\n value: submit,\n });\n }\n\n // ponytail: a whole-tree rescan keeps DOM ownership obvious; index forms if this\n // becomes measurable on pages with thousands of annotated controls.\n sync();\n}\n","import type { WebMCP } from '@w3c/webmcp-polyfill';\n\nimport { installWebMCP as installUpstream } from '@w3c/webmcp-polyfill';\nimport { installWebMCPDeclarativeExtensions } from './declarative-forms.js';\n\nexport type { WebMCP } from '@w3c/webmcp-polyfill';\n\n/**\n * Installs upstream WebMCP and the temporary declarative tools layer.\n * Engines missing an API the upstream core calls are left untouched: upstream defines\n * the document getter before it constructs the context, so a failed construction would\n * leave `document.modelContext` throwing.\n *\n * @deprecated Use `installWebMCP` from `@w3c/webmcp-polyfill`. This wrapper only adds\n * declarative tools until upstream ships them.\n */\nexport function installWebMCP(): void {\n if (typeof document === 'undefined' || !globalThis.isSecureContext) return;\n if (\n typeof Promise.withResolvers !== 'function' ||\n typeof AbortSignal.any !== 'function' ||\n typeof String.prototype.toWellFormed !== 'function' ||\n typeof URL.parse !== 'function'\n ) {\n return;\n }\n installUpstream();\n const context = document.modelContext;\n if (context) installWebMCPDeclarativeExtensions(context);\n}\n\ndeclare global {\n interface SubmitEvent {\n readonly agentInvoked?: boolean;\n respondWith?(agentResponse: Promise<unknown>): void;\n }\n\n /** Web IDL interface object used for branding and `instanceof`. */\n var ModelContext:\n | (Function & {\n readonly prototype: WebMCP.ModelContext;\n [Symbol.hasInstance](\n value: Parameters<Function[typeof Symbol.hasInstance]>[0]\n ): value is WebMCP.ModelContext;\n })\n | undefined;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcp-b/webmcp-polyfill",
|
|
3
|
-
"version": "6.0
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "6.1.0",
|
|
4
|
+
"description": "Deprecated: wraps @w3c/webmcp-polyfill and adds temporary declarative tools; use @w3c/webmcp-polyfill directly",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"browser",
|
|
7
7
|
"model-context",
|
|
@@ -47,7 +47,8 @@
|
|
|
47
47
|
"registry": "https://registry.npmjs.org/"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"webmcp-
|
|
50
|
+
"@w3c/webmcp-polyfill": "0.1.0",
|
|
51
|
+
"webmcp-types": "0.1.10"
|
|
51
52
|
},
|
|
52
53
|
"devDependencies": {
|
|
53
54
|
"@vitest/coverage-v8": "4.1.8",
|
|
@@ -59,10 +60,6 @@
|
|
|
59
60
|
"engines": {
|
|
60
61
|
"node": ">=20"
|
|
61
62
|
},
|
|
62
|
-
"upstream": {
|
|
63
|
-
"repository": "https://github.com/webmachinelearning/webmcp-polyfill",
|
|
64
|
-
"commit": "6bf6c57bbaf3d1173d7737cfb79572632d9b7871"
|
|
65
|
-
},
|
|
66
63
|
"scripts": {
|
|
67
64
|
"build": "vp pack",
|
|
68
65
|
"check": "vp check --fix",
|