From 8fe2c1b83ca2a30d62892d3bf188588190155fd0 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 24 Aug 2026 03:55:37 -0700 Subject: [PATCH] perf(ui): consolidate Control UI boot chunk graph for HTTP/1.1 gateways (#128514) * perf(ui): consolidate Control UI boot chunk graph for HTTP/1.1 gateways The Control UI boot flow (app shell + sidebar + chat route) lazily loaded ~124 automatic chunks in one burst after the gateway handshake, which the gateway's HTTP/1.1 transport serializes into ~24 six-connection round-trips on high-latency links (Tailscale, remote gateways). Add a measured boot-module manifest (ui/config/control-ui-boot-modules.json, regenerated via pnpm ui:boot-manifest:gen) and a control-ui-boot codeSplitting group that merges exactly that module set into a handful of chunks with recursive dependency inclusion. Lazy islands (locales, ghostty-web, novnc, non-default routes) keep their own chunks; stale manifest entries degrade gracefully back to automatic chunking. Measured on the built dist with the mocked gateway (chat route, 3 runs): unique boot JS requests 140 -> 45, raw boot JS 3751 -> 3717 KiB, chat composer interactive at simulated 50 ms RTT ~1600 ms -> ~575 ms. Largest-CSS budget rises 45 -> 47 KiB for the merged boot CSS; startup JS gzip baseline ratchets down (345049 -> 339214 B) as consolidation shrinks the startup graph. * chore(ui): refresh boot module manifest after rebase onto current main * fix(ui): stop the pending lazy shell action replay loop starving boot When a pending lazy shell action (command palette open, panel toggle) replayed while the shell was still splash-gated, the dispatched event had no rendered element to consume it and re-entered requestLazyElement in a microtask cycle: request -> load -> replay -> dispatch -> request. The cycle starved tasks (Gateway WebSocket messages included), so the boot never finished and the recovery e2e froze on the splash screen. Gate replay on the element actually being rendered: the controller skips the action after load until the host's render root contains the tag, and restorePendingLazyAction skips dispatch while a defined element is still render-gated. The host retries after every completed update, so the replay fires on the update that first renders the element. Regression test fails on the pre-fix controller. * fix(ui): re-anchor the scope-upgrade details popover before opening wa-popover resolves its `for` target once per property change and never re-resolves a missing or replaced anchor. The trigger with the shared id can render after the popover's first update (the header trigger ships with the lazy chat chunk), leaving the opened popover permanently invisible: active popup with a native [popover] part stuck at UA display:none because showPopover() never ran without an anchor. Re-arm the watcher when opening while the anchor is missing or disconnected. * test(ui): compare settled layouts in device-scope stability assertions The 0.5px no-move assertions sampled geometry that later reflowed when the details surface's first render fetched glyph subsets, reporting sub-pixel drift the open never caused. Burn in the one-time open per context and sample the baseline adjacent to the click. * fix(ui): map the keyboard shortcuts dialog in lazy replay gating Current main added the keyboard-shortcuts lazy shell event; the replay gate's exhaustive event-to-element record needs its entry. * chore(ui): refresh startup budget baseline after rebase onto current main --- .../control-ui-startup-budget-baseline.json | 6 +- package.json | 1 + scripts/check-control-ui-performance.mts | 6 +- scripts/control-ui-boot-manifest.mts | 135 ++ ui/AGENTS.md | 4 + ui/config/control-ui-boot-modules.json | 1969 +++++++++++++++++ ui/config/control-ui-chunking.ts | 46 + ui/src/app/app-host.panel-toggles.test.ts | 7 + ui/src/app/app-host.test-support.ts | 12 + ui/src/app/app-host.test.ts | 12 +- ui/src/app/app-host.ts | 7 + ui/src/app/app-shell-chrome.ts | 34 +- ui/src/app/control-ui-chunking.test.ts | 38 + .../app/device-scope-upgrade-registration.ts | 27 +- ui/src/app/lazy-custom-element.test.ts | 32 + ui/src/app/lazy-custom-element.ts | 19 +- ui/src/app/lazy-shell-action.test.ts | 2 + ui/src/e2e/device-scope-upgrade.e2e.test.ts | 21 + 18 files changed, 2357 insertions(+), 21 deletions(-) create mode 100644 scripts/control-ui-boot-manifest.mts create mode 100644 ui/config/control-ui-boot-modules.json diff --git a/config/control-ui-startup-budget-baseline.json b/config/control-ui-startup-budget-baseline.json index 822b46aa9e9f..6ff567aa4c99 100644 --- a/config/control-ui-startup-budget-baseline.json +++ b/config/control-ui-startup-budget-baseline.json @@ -1,5 +1,5 @@ { - "startupJsGzipBytes": 345049, - "reason": "streamed-markdown highlighting changes (#127749, #127754) consumed the ratchet", - "updatedAt": "2026-08-22" + "startupJsGzipBytes": 340388, + "reason": "rebase onto current main; startup growth landed on main since the boot-group ratchet", + "updatedAt": "2026-08-24" } diff --git a/package.json b/package.json index d20a68594ef5..0903da16d443 100644 --- a/package.json +++ b/package.json @@ -2004,6 +2004,7 @@ "tui:pty:test:watch:all": "node --import tsx scripts/dev/tui-pty-test-watch.ts --mode all", "tui:pty:test:watch:fake": "node --import tsx scripts/dev/tui-pty-test-watch.ts --mode fake", "tui:pty:test:watch:local": "node --import tsx scripts/dev/tui-pty-test-watch.ts --mode local", + "ui:boot-manifest:gen": "node --import tsx scripts/control-ui-boot-manifest.mts", "ui:build": "node scripts/ui.js build", "ui:dev": "node scripts/ui.js dev", "ui:i18n:baseline": "node --import tsx scripts/control-ui-i18n-verify.ts baseline", diff --git a/scripts/check-control-ui-performance.mts b/scripts/check-control-ui-performance.mts index 3eba54ab0483..2165668ae695 100644 --- a/scripts/check-control-ui-performance.mts +++ b/scripts/check-control-ui-performance.mts @@ -33,7 +33,11 @@ const controlUiPerformanceBudgets = { // sidebar zone styling; headroom over the ~36.5 KiB post-diet baseline. startupCssGzipBytes: 45 * KIB, largestJsGzipBytes: 215 * KIB, - largestCssGzipBytes: 45 * KIB, + // Startup CSS stays at 45 KiB; the boot-group consolidation (2026-08, + // control-ui-boot chunking) merges boot-path component CSS into one file + // that lands just above it, trading ~1 KiB of ceiling for ~95 fewer boot + // requests on HTTP/1.1 gateways. + largestCssGzipBytes: 47 * KIB, } satisfies Record; export const CONTROL_UI_PERFORMANCE_BUDGETS = Object.freeze(controlUiPerformanceBudgets); diff --git a/scripts/control-ui-boot-manifest.mts b/scripts/control-ui-boot-manifest.mts new file mode 100644 index 000000000000..6c6a7b826788 --- /dev/null +++ b/scripts/control-ui-boot-manifest.mts @@ -0,0 +1,135 @@ +#!/usr/bin/env -S node --import tsx +// Regenerates ui/config/control-ui-boot-modules.json: the measured module set +// the default Control UI boot flow loads lazily. Boots the built dist bundle +// against the mocked Gateway, records every JS chunk fetched through chat +// readiness, and unions their sourcemap sources into canonical manifest keys. +// Requires a current `pnpm ui:build` output in dist/control-ui. +import fs from "node:fs"; +import http from "node:http"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { chromium } from "playwright"; +import { controlUiBootManifestKey } from "../ui/config/control-ui-chunking.ts"; +import { installMockGateway } from "../ui/src/test-helpers/control-ui-e2e.ts"; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); +const distDir = path.join(repoRoot, "dist", "control-ui"); +const manifestPath = path.join(repoRoot, "ui", "config", "control-ui-boot-modules.json"); +const SETTLE_MS = 3_000; +const READY_TIMEOUT_MS = 60_000; + +const mime: Record = { + ".html": "text/html", + ".js": "text/javascript", + ".css": "text/css", + ".json": "application/json", + ".svg": "image/svg+xml", + ".map": "application/json", + ".webmanifest": "application/manifest+json", +}; + +function serveDist(): Promise<{ baseUrl: string; close: () => void }> { + const server = http.createServer((req, res) => { + const urlPath = new URL(req.url ?? "/", "http://localhost").pathname; + if (urlPath === "/control-ui-config.json") { + res.setHeader("Content-Type", "application/json"); + res.end(JSON.stringify({ basePath: "/", assistantName: "", assistantAvatar: "" })); + return; + } + let filePath = path.join(distDir, urlPath === "/" ? "index.html" : urlPath.slice(1)); + if (!fs.existsSync(filePath) || fs.statSync(filePath).isDirectory()) { + filePath = path.join(distDir, "index.html"); + } + res.setHeader("Content-Type", mime[path.extname(filePath)] ?? "application/octet-stream"); + res.end(fs.readFileSync(filePath)); + }); + return new Promise((resolve) => { + server.listen(0, "127.0.0.1", () => { + const address = server.address(); + if (address === null || typeof address !== "object") { + throw new Error("Control UI boot manifest server has no port"); + } + resolve({ + baseUrl: `http://127.0.0.1:${address.port}`, + close: () => server.close(), + }); + }); + }); +} + +function readDistBuildId(): string { + const swSource = fs.readFileSync(path.join(distDir, "sw.js"), "utf8"); + const buildId = /EMBEDDED_CACHE_VERSION = "([^"]+)"/.exec(swSource)?.[1]; + if (!buildId) { + throw new Error("Control UI boot manifest cannot read the dist build id from sw.js"); + } + return buildId; +} + +async function collectBootChunkPaths(baseUrl: string): Promise> { + const browser = await chromium.launch(); + try { + const page = await browser.newPage(); + const chunkPaths = new Set(); + page.on("request", (request) => { + const { pathname } = new URL(request.url()); + if (pathname.startsWith("/assets/") && pathname.endsWith(".js")) { + chunkPaths.add(pathname); + } + }); + await installMockGateway(page, { serverBuildId: readDistBuildId() }); + await page.goto(`${baseUrl}/chat`, { waitUntil: "commit" }); + // Chat readiness proves the boot flow completed instead of stalling on an + // error surface; a manifest captured from a broken boot would be garbage. + await page + .locator(".agent-chat__composer-combobox textarea") + .waitFor({ timeout: READY_TIMEOUT_MS }); + await page.waitForTimeout(SETTLE_MS); + return chunkPaths; + } finally { + await browser.close(); + } +} + +function manifestKeysForChunks(chunkPaths: Iterable): string[] { + const keys = new Set(); + for (const chunkPath of chunkPaths) { + const mapPath = path.join(distDir, `${chunkPath}.map`); + if (!fs.existsSync(mapPath)) { + // Facade chunks for dynamic entries can omit maps; their modules are + // covered by the chunks that carry the actual code. + continue; + } + const map = JSON.parse(fs.readFileSync(mapPath, "utf8")) as { sources?: string[] }; + for (const source of map.sources ?? []) { + keys.add(controlUiBootManifestKey(path.resolve(path.join(distDir, "assets"), source))); + } + } + return [...keys].toSorted(); +} + +async function main(): Promise { + if (!fs.existsSync(path.join(distDir, "index.html"))) { + throw new Error(`No Control UI build at ${distDir}; run \`pnpm ui:build\` first`); + } + const server = await serveDist(); + try { + const chunkPaths = await collectBootChunkPaths(server.baseUrl); + const keys = manifestKeysForChunks(chunkPaths); + if (keys.length < 100) { + throw new Error(`Boot capture looks truncated: only ${keys.length} modules recorded`); + } + fs.writeFileSync(manifestPath, `${JSON.stringify(keys, null, 1)}\n`); + console.log( + `control-ui-boot-manifest: ${chunkPaths.size} boot chunks -> ${keys.length} modules -> ${path.relative(repoRoot, manifestPath)}`, + ); + } finally { + server.close(); + } +} + +main().catch((error: unknown) => { + console.error(error); + console.error("[control-ui-boot-manifest] FAILED (exit 1)"); + process.exit(1); +}); diff --git a/ui/AGENTS.md b/ui/AGENTS.md index 0e11507ca608..08633ce2c383 100644 --- a/ui/AGENTS.md +++ b/ui/AGENTS.md @@ -42,6 +42,10 @@ This directory owns Control UI-specific guidance that should not live in the rep - Method-advertisement checks (`isGatewayMethodAdvertised`) remain only as feature gates for config/plugin-dependent surfaces, never as version compat. - The handshake rejects gateway-served same-origin skew. The admission-exempt paths (`pnpm ui:dev`, custom `gateway.controlUi.root`, cross-origin/connection-settings dialing) are unsupported for version mismatch without enforcement: they carry no compat code and fail visibly at the first missing method, by design. Tightening admission to reject them at connect is a server-side product change owned separately. +## Build Chunking + +- `ui/config/control-ui-boot-modules.json` is a generated manifest of the modules the default boot flow loads lazily; the `control-ui-boot` group in `ui/config/control-ui-chunking.ts` merges them into a few chunks so boot avoids ~140 HTTP/1.1 requests. Regenerate with `pnpm ui:boot-manifest:gen` after `pnpm ui:build` when boot-path surfaces change materially; stale entries degrade to extra chunks, never breakage. Do not hand-edit the manifest. + ## Live Verification - The Gateway serves the prebuilt bundle from `dist/control-ui`; editing `ui/src` changes nothing live until `pnpm ui:build`. Confirm the served `/assets/index-*.js` hash changed before trusting a live result. diff --git a/ui/config/control-ui-boot-modules.json b/ui/config/control-ui-boot-modules.json new file mode 100644 index 000000000000..c73892f32f2c --- /dev/null +++ b/ui/config/control-ui-boot-modules.json @@ -0,0 +1,1969 @@ +[ + "apps/shared/OpenClawKit/Sources/OpenClawKit/Resources/tool-display.json", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.2IJXO5LR.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.2LXKNNNE.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.3CFUTVFX.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.3NKIHICW.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.4TFM52NM.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.4ZAKP7NY.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.52WA2DJO.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.5LXXXELE.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.7MPIABXH.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.7VGCIHDG.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.AOKMSJXD.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.B5X2I7WQ.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.BELHQIBT.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.C6UR4IOH.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.CDGKIW7Y.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.CE7HN7KT.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.D4VAJWKJ.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.F25QOBDY.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.F6P22JWC.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.G5ZZIGWB.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.GBDIGVZM.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.GWSUX3V5.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.HGBRCPUS.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.HK4J654O.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.HS5AYC6E.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.HUPDX6RW.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.IBWWPMEF.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.IVYLTDB6.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.JBGB3CLX.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.KBXNFZQL.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.KNJT7KBU.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.KQ3Z6T2I.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.L2IYIH2C.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.L6CIKOFQ.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.MQODJ75V.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.N2SS4JTL.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.NMA53WZH.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.PX3HMKF7.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.PZAN6FPN.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.Q4MSGKHB.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.R2GHHEHL.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.R7QX4M6R.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.RMZ7BVDM.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.RPQJAXXR.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.RWNXKUCF.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.SKLR37OM.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.TKL7YZKI.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.TTJR7FH2.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.ULEOIS5V.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.VC3BPUZJ.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.VCKA3KNZ.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.VQZ46MYI.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.W6JCCVOH.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.W7A2VLCT.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.WDIIGUNP.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.WRIHAZWX.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.XNTP7DEQ.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.XTA2JDH4.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.XTG2LNFG.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.YBFCQDTA.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.YDQCS2HK.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.Z6IK7DP4.js", + "node_modules/@awesome.me/webawesome/dist/chunks/chunk.ZWQCGLB5.js", + "node_modules/@awesome.me/webawesome/dist/components/dialog/dialog.js", + "node_modules/@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js", + "node_modules/@awesome.me/webawesome/dist/components/dropdown/dropdown.js", + "node_modules/@awesome.me/webawesome/dist/components/popup/popup.js", + "node_modules/@awesome.me/webawesome/dist/components/radio-group/radio-group.js", + "node_modules/@awesome.me/webawesome/dist/components/radio/radio.js", + "node_modules/@awesome.me/webawesome/dist/components/switch/switch.js", + "node_modules/@awesome.me/webawesome/dist/components/tab-group/tab-group.js", + "node_modules/@awesome.me/webawesome/dist/components/tab-panel/tab-panel.js", + "node_modules/@awesome.me/webawesome/dist/components/tab/tab.js", + "node_modules/@awesome.me/webawesome/dist/components/tooltip/tooltip.js", + "node_modules/@floating-ui/core/dist/floating-ui.core.mjs", + "node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs", + "node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs", + "node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs", + "node_modules/@lit/context/index.js", + "node_modules/@lit/context/lib/context-request-event.js", + "node_modules/@lit/context/lib/controllers/context-consumer.js", + "node_modules/@lit/context/lib/controllers/context-provider.js", + "node_modules/@lit/context/lib/create-context.js", + "node_modules/@lit/context/lib/decorators/consume.js", + "node_modules/@lit/context/lib/value-notifier.js", + "node_modules/@lit/reactive-element/css-tag.js", + "node_modules/@lit/reactive-element/decorators/base.js", + "node_modules/@lit/reactive-element/decorators/custom-element.js", + "node_modules/@lit/reactive-element/decorators/event-options.js", + "node_modules/@lit/reactive-element/decorators/property.js", + "node_modules/@lit/reactive-element/decorators/query-all.js", + "node_modules/@lit/reactive-element/decorators/query-assigned-elements.js", + "node_modules/@lit/reactive-element/decorators/query-assigned-nodes.js", + "node_modules/@lit/reactive-element/decorators/query-async.js", + "node_modules/@lit/reactive-element/decorators/query.js", + "node_modules/@lit/reactive-element/decorators/state.js", + "node_modules/@lit/reactive-element/reactive-element.js", + "node_modules/@lit/task/index.js", + "node_modules/@lit/task/task.js", + "node_modules/@noble/ed25519/index.js", + "node_modules/@openclaw/uirouter/dist/index.js", + "node_modules/@panzoom/panzoom/dist/panzoom.es.js", + "node_modules/@shoelace-style/localize/dist/index.js", + "node_modules/@tanstack/lit-virtual/dist/esm/index.js", + "node_modules/@tanstack/virtual-core/dist/esm/index.js", + "node_modules/@tanstack/virtual-core/dist/esm/lazy-measurements.js", + "node_modules/@tanstack/virtual-core/dist/esm/utils.js", + "node_modules/composed-offset-position/dist/composed-offset-position.browser.min.mjs", + "node_modules/decode-named-character-reference/index.dom.js", + "node_modules/devlop/lib/default.js", + "node_modules/dompurify/dist/purify.es.mjs", + "node_modules/entities/lib/esm/decode.js", + "node_modules/entities/lib/esm/decode_codepoint.js", + "node_modules/entities/lib/esm/generated/decode-data-html.js", + "node_modules/entities/lib/esm/generated/decode-data-xml.js", + "node_modules/entities/lib/esm/index.js", + "node_modules/highlight.js/es/core.js", + "node_modules/highlight.js/es/languages/bash.js", + "node_modules/highlight.js/es/languages/cpp.js", + "node_modules/highlight.js/es/languages/css.js", + "node_modules/highlight.js/es/languages/diff.js", + "node_modules/highlight.js/es/languages/go.js", + "node_modules/highlight.js/es/languages/java.js", + "node_modules/highlight.js/es/languages/javascript.js", + "node_modules/highlight.js/es/languages/json.js", + "node_modules/highlight.js/es/languages/markdown.js", + "node_modules/highlight.js/es/languages/python.js", + "node_modules/highlight.js/es/languages/rust.js", + "node_modules/highlight.js/es/languages/typescript.js", + "node_modules/highlight.js/es/languages/xml.js", + "node_modules/highlight.js/es/languages/yaml.js", + "node_modules/highlight.js/lib/core.js", + "node_modules/ipaddr.js/lib/ipaddr.js", + "node_modules/json5/dist/index.mjs", + "node_modules/libphonenumber-js/core/index.js", + "node_modules/libphonenumber-js/es6/ParseError.js", + "node_modules/libphonenumber-js/es6/PhoneNumber.js", + "node_modules/libphonenumber-js/es6/constants.js", + "node_modules/libphonenumber-js/es6/format.js", + "node_modules/libphonenumber-js/es6/getCountries.js", + "node_modules/libphonenumber-js/es6/getCountryCallingCode.js", + "node_modules/libphonenumber-js/es6/helpers/RFC3966.js", + "node_modules/libphonenumber-js/es6/helpers/applyInternationalSeparatorStyle.js", + "node_modules/libphonenumber-js/es6/helpers/checkNumberLength.js", + "node_modules/libphonenumber-js/es6/helpers/extension/createExtensionPattern.js", + "node_modules/libphonenumber-js/es6/helpers/extension/extractExtension.js", + "node_modules/libphonenumber-js/es6/helpers/extractCountryCallingCode.js", + "node_modules/libphonenumber-js/es6/helpers/extractCountryCallingCodeFromInternationalNumberWithoutPlusSign.js", + "node_modules/libphonenumber-js/es6/helpers/extractFormattedPhoneNumberFromPossibleRfc3966NumberUri.js", + "node_modules/libphonenumber-js/es6/helpers/extractNationalNumber.js", + "node_modules/libphonenumber-js/es6/helpers/extractNationalNumberFromPossiblyIncompleteNumber.js", + "node_modules/libphonenumber-js/es6/helpers/extractPhoneContext.js", + "node_modules/libphonenumber-js/es6/helpers/formatNationalNumberUsingFormat.js", + "node_modules/libphonenumber-js/es6/helpers/getCountryAndCallingCodeFromOneOfThem.js", + "node_modules/libphonenumber-js/es6/helpers/getCountryByCallingCode.js", + "node_modules/libphonenumber-js/es6/helpers/getCountryByNationalNumber.js", + "node_modules/libphonenumber-js/es6/helpers/getIddPrefix.js", + "node_modules/libphonenumber-js/es6/helpers/getNumberType.js", + "node_modules/libphonenumber-js/es6/helpers/getPossibleCountriesForNumber.js", + "node_modules/libphonenumber-js/es6/helpers/isCallingCode.js", + "node_modules/libphonenumber-js/es6/helpers/isCountryCode.js", + "node_modules/libphonenumber-js/es6/helpers/isObject.js", + "node_modules/libphonenumber-js/es6/helpers/isViablePhoneNumber.js", + "node_modules/libphonenumber-js/es6/helpers/matchesEntirely.js", + "node_modules/libphonenumber-js/es6/helpers/mergeArrays.js", + "node_modules/libphonenumber-js/es6/helpers/parseDigits.js", + "node_modules/libphonenumber-js/es6/helpers/stripIddPrefix.js", + "node_modules/libphonenumber-js/es6/isPossible.js", + "node_modules/libphonenumber-js/es6/isValid.js", + "node_modules/libphonenumber-js/es6/metadata.js", + "node_modules/libphonenumber-js/es6/normalizeArguments.js", + "node_modules/libphonenumber-js/es6/parse.js", + "node_modules/libphonenumber-js/es6/parseIncompletePhoneNumber.js", + "node_modules/libphonenumber-js/es6/parsePhoneNumber.js", + "node_modules/libphonenumber-js/es6/parsePhoneNumberWithError_.js", + "node_modules/libphonenumber-js/es6/parsePhoneNumber_.js", + "node_modules/libphonenumber-js/es6/tools/semver-compare.js", + "node_modules/libphonenumber-js/metadata.min.json.js", + "node_modules/libphonenumber-js/min/exports/getCountries.js", + "node_modules/libphonenumber-js/min/exports/getCountryCallingCode.js", + "node_modules/libphonenumber-js/min/exports/parsePhoneNumber.js", + "node_modules/libphonenumber-js/min/exports/withMetadataArgument.js", + "node_modules/libphonenumber-js/min/index.js", + "node_modules/linkify-it/index.mjs", + "node_modules/linkify-it/lib/re.mjs", + "node_modules/lit-element/lit-element.js", + "node_modules/lit-html/async-directive.js", + "node_modules/lit-html/directive-helpers.js", + "node_modules/lit-html/directive.js", + "node_modules/lit-html/directives/class-map.js", + "node_modules/lit-html/directives/guard.js", + "node_modules/lit-html/directives/if-defined.js", + "node_modules/lit-html/directives/keyed.js", + "node_modules/lit-html/directives/live.js", + "node_modules/lit-html/directives/private-async-helpers.js", + "node_modules/lit-html/directives/ref.js", + "node_modules/lit-html/directives/repeat.js", + "node_modules/lit-html/directives/style-map.js", + "node_modules/lit-html/directives/unsafe-html.js", + "node_modules/lit-html/directives/until.js", + "node_modules/lit-html/is-server.js", + "node_modules/lit-html/lit-html.js", + "node_modules/lit-html/static.js", + "node_modules/lit/async-directive.js", + "node_modules/lit/decorators.js", + "node_modules/lit/directive-helpers.js", + "node_modules/lit/directives/class-map.js", + "node_modules/lit/directives/guard.js", + "node_modules/lit/directives/if-defined.js", + "node_modules/lit/directives/keyed.js", + "node_modules/lit/directives/live.js", + "node_modules/lit/directives/ref.js", + "node_modules/lit/directives/repeat.js", + "node_modules/lit/directives/style-map.js", + "node_modules/lit/directives/unsafe-html.js", + "node_modules/lit/directives/until.js", + "node_modules/lit/index.js", + "node_modules/lit/static-html.js", + "node_modules/markdown-it-task-lists/index.js", + "node_modules/markdown-it/index.mjs", + "node_modules/markdown-it/lib/common/html_blocks.mjs", + "node_modules/markdown-it/lib/common/html_re.mjs", + "node_modules/markdown-it/lib/common/utils.mjs", + "node_modules/markdown-it/lib/helpers/index.mjs", + "node_modules/markdown-it/lib/helpers/parse_link_destination.mjs", + "node_modules/markdown-it/lib/helpers/parse_link_label.mjs", + "node_modules/markdown-it/lib/helpers/parse_link_title.mjs", + "node_modules/markdown-it/lib/index.mjs", + "node_modules/markdown-it/lib/parser_block.mjs", + "node_modules/markdown-it/lib/parser_core.mjs", + "node_modules/markdown-it/lib/parser_inline.mjs", + "node_modules/markdown-it/lib/presets/commonmark.mjs", + "node_modules/markdown-it/lib/presets/default.mjs", + "node_modules/markdown-it/lib/presets/zero.mjs", + "node_modules/markdown-it/lib/renderer.mjs", + "node_modules/markdown-it/lib/ruler.mjs", + "node_modules/markdown-it/lib/rules_block/blockquote.mjs", + "node_modules/markdown-it/lib/rules_block/code.mjs", + "node_modules/markdown-it/lib/rules_block/fence.mjs", + "node_modules/markdown-it/lib/rules_block/heading.mjs", + "node_modules/markdown-it/lib/rules_block/hr.mjs", + "node_modules/markdown-it/lib/rules_block/html_block.mjs", + "node_modules/markdown-it/lib/rules_block/lheading.mjs", + "node_modules/markdown-it/lib/rules_block/list.mjs", + "node_modules/markdown-it/lib/rules_block/paragraph.mjs", + "node_modules/markdown-it/lib/rules_block/reference.mjs", + "node_modules/markdown-it/lib/rules_block/state_block.mjs", + "node_modules/markdown-it/lib/rules_block/table.mjs", + "node_modules/markdown-it/lib/rules_core/block.mjs", + "node_modules/markdown-it/lib/rules_core/inline.mjs", + "node_modules/markdown-it/lib/rules_core/linkify.mjs", + "node_modules/markdown-it/lib/rules_core/normalize.mjs", + "node_modules/markdown-it/lib/rules_core/replacements.mjs", + "node_modules/markdown-it/lib/rules_core/smartquotes.mjs", + "node_modules/markdown-it/lib/rules_core/state_core.mjs", + "node_modules/markdown-it/lib/rules_core/text_join.mjs", + "node_modules/markdown-it/lib/rules_inline/autolink.mjs", + "node_modules/markdown-it/lib/rules_inline/backticks.mjs", + "node_modules/markdown-it/lib/rules_inline/balance_pairs.mjs", + "node_modules/markdown-it/lib/rules_inline/emphasis.mjs", + "node_modules/markdown-it/lib/rules_inline/entity.mjs", + "node_modules/markdown-it/lib/rules_inline/escape.mjs", + "node_modules/markdown-it/lib/rules_inline/fragments_join.mjs", + "node_modules/markdown-it/lib/rules_inline/html_inline.mjs", + "node_modules/markdown-it/lib/rules_inline/image.mjs", + "node_modules/markdown-it/lib/rules_inline/link.mjs", + "node_modules/markdown-it/lib/rules_inline/linkify.mjs", + "node_modules/markdown-it/lib/rules_inline/newline.mjs", + "node_modules/markdown-it/lib/rules_inline/state_inline.mjs", + "node_modules/markdown-it/lib/rules_inline/strikethrough.mjs", + "node_modules/markdown-it/lib/rules_inline/text.mjs", + "node_modules/markdown-it/lib/token.mjs", + "node_modules/mdast-util-from-markdown/index.js", + "node_modules/mdast-util-from-markdown/lib/index.js", + "node_modules/mdast-util-gfm-table/index.js", + "node_modules/mdast-util-gfm-table/lib/index.js", + "node_modules/mdast-util-to-string/index.js", + "node_modules/mdast-util-to-string/lib/index.js", + "node_modules/mdurl/index.mjs", + "node_modules/mdurl/lib/decode.mjs", + "node_modules/mdurl/lib/encode.mjs", + "node_modules/mdurl/lib/format.mjs", + "node_modules/mdurl/lib/parse.mjs", + "node_modules/micromark-core-commonmark/index.js", + "node_modules/micromark-core-commonmark/lib/attention.js", + "node_modules/micromark-core-commonmark/lib/autolink.js", + "node_modules/micromark-core-commonmark/lib/blank-line.js", + "node_modules/micromark-core-commonmark/lib/block-quote.js", + "node_modules/micromark-core-commonmark/lib/character-escape.js", + "node_modules/micromark-core-commonmark/lib/character-reference.js", + "node_modules/micromark-core-commonmark/lib/code-fenced.js", + "node_modules/micromark-core-commonmark/lib/code-indented.js", + "node_modules/micromark-core-commonmark/lib/code-text.js", + "node_modules/micromark-core-commonmark/lib/content.js", + "node_modules/micromark-core-commonmark/lib/definition.js", + "node_modules/micromark-core-commonmark/lib/hard-break-escape.js", + "node_modules/micromark-core-commonmark/lib/heading-atx.js", + "node_modules/micromark-core-commonmark/lib/html-flow.js", + "node_modules/micromark-core-commonmark/lib/html-text.js", + "node_modules/micromark-core-commonmark/lib/label-end.js", + "node_modules/micromark-core-commonmark/lib/label-start-image.js", + "node_modules/micromark-core-commonmark/lib/label-start-link.js", + "node_modules/micromark-core-commonmark/lib/line-ending.js", + "node_modules/micromark-core-commonmark/lib/list.js", + "node_modules/micromark-core-commonmark/lib/setext-underline.js", + "node_modules/micromark-core-commonmark/lib/thematic-break.js", + "node_modules/micromark-extension-gfm-table/index.js", + "node_modules/micromark-extension-gfm-table/lib/edit-map.js", + "node_modules/micromark-extension-gfm-table/lib/infer.js", + "node_modules/micromark-extension-gfm-table/lib/syntax.js", + "node_modules/micromark-factory-destination/index.js", + "node_modules/micromark-factory-label/index.js", + "node_modules/micromark-factory-space/index.js", + "node_modules/micromark-factory-title/index.js", + "node_modules/micromark-factory-whitespace/index.js", + "node_modules/micromark-util-character/index.js", + "node_modules/micromark-util-chunked/index.js", + "node_modules/micromark-util-classify-character/index.js", + "node_modules/micromark-util-combine-extensions/index.js", + "node_modules/micromark-util-decode-numeric-character-reference/index.js", + "node_modules/micromark-util-decode-string/index.js", + "node_modules/micromark-util-html-tag-name/index.js", + "node_modules/micromark-util-normalize-identifier/index.js", + "node_modules/micromark-util-resolve-all/index.js", + "node_modules/micromark-util-subtokenize/index.js", + "node_modules/micromark-util-subtokenize/lib/splice-buffer.js", + "node_modules/micromark/index.js", + "node_modules/micromark/lib/constructs.js", + "node_modules/micromark/lib/create-tokenizer.js", + "node_modules/micromark/lib/initialize/content.js", + "node_modules/micromark/lib/initialize/document.js", + "node_modules/micromark/lib/initialize/flow.js", + "node_modules/micromark/lib/initialize/text.js", + "node_modules/micromark/lib/parse.js", + "node_modules/micromark/lib/postprocess.js", + "node_modules/micromark/lib/preprocess.js", + "node_modules/nanoid/index.browser.js", + "node_modules/nanoid/url-alphabet/index.js", + "node_modules/parse-ms/index.js", + "node_modules/pretty-ms/index.js", + "node_modules/punycode.js/punycode.es6.js", + "node_modules/remend/dist/index.js", + "node_modules/typebox/build/compile/code.mjs", + "node_modules/typebox/build/compile/compile.mjs", + "node_modules/typebox/build/compile/index.mjs", + "node_modules/typebox/build/compile/validator.mjs", + "node_modules/typebox/build/format/_idna.mjs", + "node_modules/typebox/build/format/_puny.mjs", + "node_modules/typebox/build/format/_registry.mjs", + "node_modules/typebox/build/format/date.mjs", + "node_modules/typebox/build/format/date_time.mjs", + "node_modules/typebox/build/format/duration.mjs", + "node_modules/typebox/build/format/email.mjs", + "node_modules/typebox/build/format/format.mjs", + "node_modules/typebox/build/format/hostname.mjs", + "node_modules/typebox/build/format/idn_email.mjs", + "node_modules/typebox/build/format/idn_hostname.mjs", + "node_modules/typebox/build/format/index.mjs", + "node_modules/typebox/build/format/ipv4.mjs", + "node_modules/typebox/build/format/ipv6.mjs", + "node_modules/typebox/build/format/iri.mjs", + "node_modules/typebox/build/format/iri_reference.mjs", + "node_modules/typebox/build/format/json_pointer.mjs", + "node_modules/typebox/build/format/json_pointer_uri_fragment.mjs", + "node_modules/typebox/build/format/regex.mjs", + "node_modules/typebox/build/format/relative_json_pointer.mjs", + "node_modules/typebox/build/format/time.mjs", + "node_modules/typebox/build/format/uri.mjs", + "node_modules/typebox/build/format/uri_reference.mjs", + "node_modules/typebox/build/format/uri_template.mjs", + "node_modules/typebox/build/format/url.mjs", + "node_modules/typebox/build/format/uuid.mjs", + "node_modules/typebox/build/guard/emit.mjs", + "node_modules/typebox/build/guard/globals.mjs", + "node_modules/typebox/build/guard/guard.mjs", + "node_modules/typebox/build/guard/index.mjs", + "node_modules/typebox/build/guard/string.mjs", + "node_modules/typebox/build/index.mjs", + "node_modules/typebox/build/schema/build.mjs", + "node_modules/typebox/build/schema/check.mjs", + "node_modules/typebox/build/schema/compile.mjs", + "node_modules/typebox/build/schema/engine/_context.mjs", + "node_modules/typebox/build/schema/engine/_exact_optional.mjs", + "node_modules/typebox/build/schema/engine/_externals.mjs", + "node_modules/typebox/build/schema/engine/_functions.mjs", + "node_modules/typebox/build/schema/engine/_reducer.mjs", + "node_modules/typebox/build/schema/engine/_refine.mjs", + "node_modules/typebox/build/schema/engine/_stack.mjs", + "node_modules/typebox/build/schema/engine/_unique.mjs", + "node_modules/typebox/build/schema/engine/additionalItems.mjs", + "node_modules/typebox/build/schema/engine/additionalProperties.mjs", + "node_modules/typebox/build/schema/engine/allOf.mjs", + "node_modules/typebox/build/schema/engine/anyOf.mjs", + "node_modules/typebox/build/schema/engine/boolean.mjs", + "node_modules/typebox/build/schema/engine/const.mjs", + "node_modules/typebox/build/schema/engine/contains.mjs", + "node_modules/typebox/build/schema/engine/dependencies.mjs", + "node_modules/typebox/build/schema/engine/dependentRequired.mjs", + "node_modules/typebox/build/schema/engine/dependentSchemas.mjs", + "node_modules/typebox/build/schema/engine/dynamicRef.mjs", + "node_modules/typebox/build/schema/engine/enum.mjs", + "node_modules/typebox/build/schema/engine/exclusiveMaximum.mjs", + "node_modules/typebox/build/schema/engine/exclusiveMinimum.mjs", + "node_modules/typebox/build/schema/engine/format.mjs", + "node_modules/typebox/build/schema/engine/if.mjs", + "node_modules/typebox/build/schema/engine/index.mjs", + "node_modules/typebox/build/schema/engine/items.mjs", + "node_modules/typebox/build/schema/engine/maxContains.mjs", + "node_modules/typebox/build/schema/engine/maxItems.mjs", + "node_modules/typebox/build/schema/engine/maxLength.mjs", + "node_modules/typebox/build/schema/engine/maxProperties.mjs", + "node_modules/typebox/build/schema/engine/maximum.mjs", + "node_modules/typebox/build/schema/engine/minContains.mjs", + "node_modules/typebox/build/schema/engine/minItems.mjs", + "node_modules/typebox/build/schema/engine/minLength.mjs", + "node_modules/typebox/build/schema/engine/minProperties.mjs", + "node_modules/typebox/build/schema/engine/minimum.mjs", + "node_modules/typebox/build/schema/engine/multipleOf.mjs", + "node_modules/typebox/build/schema/engine/not.mjs", + "node_modules/typebox/build/schema/engine/oneOf.mjs", + "node_modules/typebox/build/schema/engine/pattern.mjs", + "node_modules/typebox/build/schema/engine/patternProperties.mjs", + "node_modules/typebox/build/schema/engine/prefixItems.mjs", + "node_modules/typebox/build/schema/engine/properties.mjs", + "node_modules/typebox/build/schema/engine/propertyNames.mjs", + "node_modules/typebox/build/schema/engine/recursiveRef.mjs", + "node_modules/typebox/build/schema/engine/ref.mjs", + "node_modules/typebox/build/schema/engine/required.mjs", + "node_modules/typebox/build/schema/engine/schema.mjs", + "node_modules/typebox/build/schema/engine/type.mjs", + "node_modules/typebox/build/schema/engine/unevaluatedItems.mjs", + "node_modules/typebox/build/schema/engine/unevaluatedProperties.mjs", + "node_modules/typebox/build/schema/engine/uniqueItems.mjs", + "node_modules/typebox/build/schema/errors.mjs", + "node_modules/typebox/build/schema/index.mjs", + "node_modules/typebox/build/schema/parse.mjs", + "node_modules/typebox/build/schema/pointer/index.mjs", + "node_modules/typebox/build/schema/pointer/pointer.mjs", + "node_modules/typebox/build/schema/pointer/pointer_get.mjs", + "node_modules/typebox/build/schema/resolve/index.mjs", + "node_modules/typebox/build/schema/resolve/ref.mjs", + "node_modules/typebox/build/schema/resolve/resolve.mjs", + "node_modules/typebox/build/schema/schema.mjs", + "node_modules/typebox/build/schema/static/index.mjs", + "node_modules/typebox/build/schema/types/_refine.mjs", + "node_modules/typebox/build/schema/types/additionalItems.mjs", + "node_modules/typebox/build/schema/types/additionalProperties.mjs", + "node_modules/typebox/build/schema/types/allOf.mjs", + "node_modules/typebox/build/schema/types/anchor.mjs", + "node_modules/typebox/build/schema/types/anyOf.mjs", + "node_modules/typebox/build/schema/types/const.mjs", + "node_modules/typebox/build/schema/types/contains.mjs", + "node_modules/typebox/build/schema/types/contentEncoding.mjs", + "node_modules/typebox/build/schema/types/contentMediaType.mjs", + "node_modules/typebox/build/schema/types/default.mjs", + "node_modules/typebox/build/schema/types/defs.mjs", + "node_modules/typebox/build/schema/types/dependencies.mjs", + "node_modules/typebox/build/schema/types/dependentRequired.mjs", + "node_modules/typebox/build/schema/types/dependentSchemas.mjs", + "node_modules/typebox/build/schema/types/dynamicAnchor.mjs", + "node_modules/typebox/build/schema/types/dynamicRef.mjs", + "node_modules/typebox/build/schema/types/else.mjs", + "node_modules/typebox/build/schema/types/enum.mjs", + "node_modules/typebox/build/schema/types/exclusiveMaximum.mjs", + "node_modules/typebox/build/schema/types/exclusiveMinimum.mjs", + "node_modules/typebox/build/schema/types/format.mjs", + "node_modules/typebox/build/schema/types/id.mjs", + "node_modules/typebox/build/schema/types/if.mjs", + "node_modules/typebox/build/schema/types/index.mjs", + "node_modules/typebox/build/schema/types/items.mjs", + "node_modules/typebox/build/schema/types/maxContains.mjs", + "node_modules/typebox/build/schema/types/maxItems.mjs", + "node_modules/typebox/build/schema/types/maxLength.mjs", + "node_modules/typebox/build/schema/types/maxProperties.mjs", + "node_modules/typebox/build/schema/types/maximum.mjs", + "node_modules/typebox/build/schema/types/minContains.mjs", + "node_modules/typebox/build/schema/types/minItems.mjs", + "node_modules/typebox/build/schema/types/minLength.mjs", + "node_modules/typebox/build/schema/types/minProperties.mjs", + "node_modules/typebox/build/schema/types/minimum.mjs", + "node_modules/typebox/build/schema/types/multipleOf.mjs", + "node_modules/typebox/build/schema/types/not.mjs", + "node_modules/typebox/build/schema/types/oneOf.mjs", + "node_modules/typebox/build/schema/types/pattern.mjs", + "node_modules/typebox/build/schema/types/patternProperties.mjs", + "node_modules/typebox/build/schema/types/prefixItems.mjs", + "node_modules/typebox/build/schema/types/properties.mjs", + "node_modules/typebox/build/schema/types/propertyNames.mjs", + "node_modules/typebox/build/schema/types/recursiveAnchor.mjs", + "node_modules/typebox/build/schema/types/recursiveRef.mjs", + "node_modules/typebox/build/schema/types/ref.mjs", + "node_modules/typebox/build/schema/types/required.mjs", + "node_modules/typebox/build/schema/types/schema.mjs", + "node_modules/typebox/build/schema/types/then.mjs", + "node_modules/typebox/build/schema/types/type.mjs", + "node_modules/typebox/build/schema/types/unevaluatedItems.mjs", + "node_modules/typebox/build/schema/types/unevaluatedProperties.mjs", + "node_modules/typebox/build/schema/types/uniqueItems.mjs", + "node_modules/typebox/build/system/arguments/arguments.mjs", + "node_modules/typebox/build/system/arguments/index.mjs", + "node_modules/typebox/build/system/environment/environment.mjs", + "node_modules/typebox/build/system/environment/evaluate.mjs", + "node_modules/typebox/build/system/environment/index.mjs", + "node_modules/typebox/build/system/hashing/hash.mjs", + "node_modules/typebox/build/system/hashing/index.mjs", + "node_modules/typebox/build/system/index.mjs", + "node_modules/typebox/build/system/locale/_config.mjs", + "node_modules/typebox/build/system/locale/_locale.mjs", + "node_modules/typebox/build/system/locale/ar_001.mjs", + "node_modules/typebox/build/system/locale/bn_BD.mjs", + "node_modules/typebox/build/system/locale/cs_CZ.mjs", + "node_modules/typebox/build/system/locale/de_DE.mjs", + "node_modules/typebox/build/system/locale/el_GR.mjs", + "node_modules/typebox/build/system/locale/en_US.mjs", + "node_modules/typebox/build/system/locale/es_419.mjs", + "node_modules/typebox/build/system/locale/es_AR.mjs", + "node_modules/typebox/build/system/locale/es_ES.mjs", + "node_modules/typebox/build/system/locale/es_MX.mjs", + "node_modules/typebox/build/system/locale/fa_IR.mjs", + "node_modules/typebox/build/system/locale/fil_PH.mjs", + "node_modules/typebox/build/system/locale/fr_CA.mjs", + "node_modules/typebox/build/system/locale/fr_FR.mjs", + "node_modules/typebox/build/system/locale/ha_NG.mjs", + "node_modules/typebox/build/system/locale/hi_IN.mjs", + "node_modules/typebox/build/system/locale/hu_HU.mjs", + "node_modules/typebox/build/system/locale/id_ID.mjs", + "node_modules/typebox/build/system/locale/index.mjs", + "node_modules/typebox/build/system/locale/it_IT.mjs", + "node_modules/typebox/build/system/locale/ja_JP.mjs", + "node_modules/typebox/build/system/locale/ko_KR.mjs", + "node_modules/typebox/build/system/locale/ms_MY.mjs", + "node_modules/typebox/build/system/locale/nl_NL.mjs", + "node_modules/typebox/build/system/locale/pl_PL.mjs", + "node_modules/typebox/build/system/locale/pt_BR.mjs", + "node_modules/typebox/build/system/locale/pt_PT.mjs", + "node_modules/typebox/build/system/locale/ro_RO.mjs", + "node_modules/typebox/build/system/locale/ru_RU.mjs", + "node_modules/typebox/build/system/locale/sv_SE.mjs", + "node_modules/typebox/build/system/locale/sw_TZ.mjs", + "node_modules/typebox/build/system/locale/th_TH.mjs", + "node_modules/typebox/build/system/locale/tr_TR.mjs", + "node_modules/typebox/build/system/locale/uk_UA.mjs", + "node_modules/typebox/build/system/locale/ur_PK.mjs", + "node_modules/typebox/build/system/locale/vi_VN.mjs", + "node_modules/typebox/build/system/locale/yo_NG.mjs", + "node_modules/typebox/build/system/locale/zh_Hans.mjs", + "node_modules/typebox/build/system/locale/zh_Hant.mjs", + "node_modules/typebox/build/system/memory/assign.mjs", + "node_modules/typebox/build/system/memory/clone.mjs", + "node_modules/typebox/build/system/memory/create.mjs", + "node_modules/typebox/build/system/memory/discard.mjs", + "node_modules/typebox/build/system/memory/index.mjs", + "node_modules/typebox/build/system/memory/memory.mjs", + "node_modules/typebox/build/system/memory/metrics.mjs", + "node_modules/typebox/build/system/memory/update.mjs", + "node_modules/typebox/build/system/settings/index.mjs", + "node_modules/typebox/build/system/settings/settings.mjs", + "node_modules/typebox/build/system/system.mjs", + "node_modules/typebox/build/system/unreachable/index.mjs", + "node_modules/typebox/build/system/unreachable/unreachable.mjs", + "node_modules/typebox/build/type/action/_add_immutable.mjs", + "node_modules/typebox/build/type/action/_add_optional.mjs", + "node_modules/typebox/build/type/action/_add_readonly.mjs", + "node_modules/typebox/build/type/action/_remove_immutable.mjs", + "node_modules/typebox/build/type/action/_remove_optional.mjs", + "node_modules/typebox/build/type/action/_remove_readonly.mjs", + "node_modules/typebox/build/type/action/capitalize.mjs", + "node_modules/typebox/build/type/action/conditional.mjs", + "node_modules/typebox/build/type/action/constructor_parameters.mjs", + "node_modules/typebox/build/type/action/evaluate.mjs", + "node_modules/typebox/build/type/action/exclude.mjs", + "node_modules/typebox/build/type/action/extract.mjs", + "node_modules/typebox/build/type/action/index.mjs", + "node_modules/typebox/build/type/action/indexed.mjs", + "node_modules/typebox/build/type/action/instance_type.mjs", + "node_modules/typebox/build/type/action/interface.mjs", + "node_modules/typebox/build/type/action/keyof.mjs", + "node_modules/typebox/build/type/action/lowercase.mjs", + "node_modules/typebox/build/type/action/mapped.mjs", + "node_modules/typebox/build/type/action/module.mjs", + "node_modules/typebox/build/type/action/non_nullable.mjs", + "node_modules/typebox/build/type/action/omit.mjs", + "node_modules/typebox/build/type/action/parameters.mjs", + "node_modules/typebox/build/type/action/partial.mjs", + "node_modules/typebox/build/type/action/pick.mjs", + "node_modules/typebox/build/type/action/readonly_object.mjs", + "node_modules/typebox/build/type/action/required.mjs", + "node_modules/typebox/build/type/action/return_type.mjs", + "node_modules/typebox/build/type/action/uncapitalize.mjs", + "node_modules/typebox/build/type/action/uppercase.mjs", + "node_modules/typebox/build/type/action/with.mjs", + "node_modules/typebox/build/type/engine/call/distribute_arguments.mjs", + "node_modules/typebox/build/type/engine/call/instantiate.mjs", + "node_modules/typebox/build/type/engine/call/resolve_arguments.mjs", + "node_modules/typebox/build/type/engine/call/resolve_target.mjs", + "node_modules/typebox/build/type/engine/conditional/index.mjs", + "node_modules/typebox/build/type/engine/conditional/instantiate.mjs", + "node_modules/typebox/build/type/engine/constructor_parameters/index.mjs", + "node_modules/typebox/build/type/engine/constructor_parameters/instantiate.mjs", + "node_modules/typebox/build/type/engine/cyclic/candidates.mjs", + "node_modules/typebox/build/type/engine/cyclic/check.mjs", + "node_modules/typebox/build/type/engine/cyclic/dependencies.mjs", + "node_modules/typebox/build/type/engine/cyclic/extends.mjs", + "node_modules/typebox/build/type/engine/cyclic/index.mjs", + "node_modules/typebox/build/type/engine/cyclic/instantiate.mjs", + "node_modules/typebox/build/type/engine/cyclic/target.mjs", + "node_modules/typebox/build/type/engine/enum/index.mjs", + "node_modules/typebox/build/type/engine/enum/typescript_enum_to_enum_values.mjs", + "node_modules/typebox/build/type/engine/evaluate/broaden.mjs", + "node_modules/typebox/build/type/engine/evaluate/compare.mjs", + "node_modules/typebox/build/type/engine/evaluate/composite.mjs", + "node_modules/typebox/build/type/engine/evaluate/distribute.mjs", + "node_modules/typebox/build/type/engine/evaluate/evaluate.mjs", + "node_modules/typebox/build/type/engine/evaluate/flatten.mjs", + "node_modules/typebox/build/type/engine/evaluate/index.mjs", + "node_modules/typebox/build/type/engine/evaluate/instantiate.mjs", + "node_modules/typebox/build/type/engine/evaluate/narrow.mjs", + "node_modules/typebox/build/type/engine/exclude/index.mjs", + "node_modules/typebox/build/type/engine/exclude/instantiate.mjs", + "node_modules/typebox/build/type/engine/exclude/operation.mjs", + "node_modules/typebox/build/type/engine/extract/index.mjs", + "node_modules/typebox/build/type/engine/extract/instantiate.mjs", + "node_modules/typebox/build/type/engine/extract/operation.mjs", + "node_modules/typebox/build/type/engine/helpers/index.mjs", + "node_modules/typebox/build/type/engine/helpers/keys.mjs", + "node_modules/typebox/build/type/engine/helpers/keys_to_indexer.mjs", + "node_modules/typebox/build/type/engine/helpers/union.mjs", + "node_modules/typebox/build/type/engine/immutable/instantiate_add.mjs", + "node_modules/typebox/build/type/engine/immutable/instantiate_remove.mjs", + "node_modules/typebox/build/type/engine/index.mjs", + "node_modules/typebox/build/type/engine/indexable/from_cyclic.mjs", + "node_modules/typebox/build/type/engine/indexable/from_dependent.mjs", + "node_modules/typebox/build/type/engine/indexable/from_enum.mjs", + "node_modules/typebox/build/type/engine/indexable/from_intersect.mjs", + "node_modules/typebox/build/type/engine/indexable/from_literal.mjs", + "node_modules/typebox/build/type/engine/indexable/from_template_literal.mjs", + "node_modules/typebox/build/type/engine/indexable/from_type.mjs", + "node_modules/typebox/build/type/engine/indexable/from_union.mjs", + "node_modules/typebox/build/type/engine/indexable/to_indexable.mjs", + "node_modules/typebox/build/type/engine/indexable/to_indexable_keys.mjs", + "node_modules/typebox/build/type/engine/indexed/array_indexer.mjs", + "node_modules/typebox/build/type/engine/indexed/from_array.mjs", + "node_modules/typebox/build/type/engine/indexed/from_object.mjs", + "node_modules/typebox/build/type/engine/indexed/from_tuple.mjs", + "node_modules/typebox/build/type/engine/indexed/from_type.mjs", + "node_modules/typebox/build/type/engine/indexed/index.mjs", + "node_modules/typebox/build/type/engine/indexed/instantiate.mjs", + "node_modules/typebox/build/type/engine/instance_type/index.mjs", + "node_modules/typebox/build/type/engine/instance_type/instantiate.mjs", + "node_modules/typebox/build/type/engine/instantiate.mjs", + "node_modules/typebox/build/type/engine/interface/index.mjs", + "node_modules/typebox/build/type/engine/interface/instantiate.mjs", + "node_modules/typebox/build/type/engine/intrinsics/from_literal.mjs", + "node_modules/typebox/build/type/engine/intrinsics/from_template_literal.mjs", + "node_modules/typebox/build/type/engine/intrinsics/from_type.mjs", + "node_modules/typebox/build/type/engine/intrinsics/from_union.mjs", + "node_modules/typebox/build/type/engine/intrinsics/index.mjs", + "node_modules/typebox/build/type/engine/intrinsics/instantiate.mjs", + "node_modules/typebox/build/type/engine/intrinsics/mapping.mjs", + "node_modules/typebox/build/type/engine/keyof/from_any.mjs", + "node_modules/typebox/build/type/engine/keyof/from_array.mjs", + "node_modules/typebox/build/type/engine/keyof/from_object.mjs", + "node_modules/typebox/build/type/engine/keyof/from_record.mjs", + "node_modules/typebox/build/type/engine/keyof/from_tuple.mjs", + "node_modules/typebox/build/type/engine/keyof/from_type.mjs", + "node_modules/typebox/build/type/engine/keyof/index.mjs", + "node_modules/typebox/build/type/engine/keyof/instantiate.mjs", + "node_modules/typebox/build/type/engine/mapped/index.mjs", + "node_modules/typebox/build/type/engine/mapped/instantiate.mjs", + "node_modules/typebox/build/type/engine/mapped/mapped_operation.mjs", + "node_modules/typebox/build/type/engine/mapped/mapped_variants.mjs", + "node_modules/typebox/build/type/engine/module/index.mjs", + "node_modules/typebox/build/type/engine/module/instantiate.mjs", + "node_modules/typebox/build/type/engine/non_nullable/index.mjs", + "node_modules/typebox/build/type/engine/non_nullable/instantiate.mjs", + "node_modules/typebox/build/type/engine/object/collapse.mjs", + "node_modules/typebox/build/type/engine/object/from_cyclic.mjs", + "node_modules/typebox/build/type/engine/object/from_dependent.mjs", + "node_modules/typebox/build/type/engine/object/from_intersect.mjs", + "node_modules/typebox/build/type/engine/object/from_object.mjs", + "node_modules/typebox/build/type/engine/object/from_tuple.mjs", + "node_modules/typebox/build/type/engine/object/from_type.mjs", + "node_modules/typebox/build/type/engine/object/from_union.mjs", + "node_modules/typebox/build/type/engine/object/index.mjs", + "node_modules/typebox/build/type/engine/omit/from_type.mjs", + "node_modules/typebox/build/type/engine/omit/index.mjs", + "node_modules/typebox/build/type/engine/omit/instantiate.mjs", + "node_modules/typebox/build/type/engine/optional/instantiate_add.mjs", + "node_modules/typebox/build/type/engine/optional/instantiate_remove.mjs", + "node_modules/typebox/build/type/engine/parameters/index.mjs", + "node_modules/typebox/build/type/engine/parameters/instantiate.mjs", + "node_modules/typebox/build/type/engine/partial/from_cyclic.mjs", + "node_modules/typebox/build/type/engine/partial/from_dependent.mjs", + "node_modules/typebox/build/type/engine/partial/from_intersect.mjs", + "node_modules/typebox/build/type/engine/partial/from_object.mjs", + "node_modules/typebox/build/type/engine/partial/from_type.mjs", + "node_modules/typebox/build/type/engine/partial/from_union.mjs", + "node_modules/typebox/build/type/engine/partial/index.mjs", + "node_modules/typebox/build/type/engine/partial/instantiate.mjs", + "node_modules/typebox/build/type/engine/patterns/index.mjs", + "node_modules/typebox/build/type/engine/patterns/pattern.mjs", + "node_modules/typebox/build/type/engine/patterns/template.mjs", + "node_modules/typebox/build/type/engine/pick/from_type.mjs", + "node_modules/typebox/build/type/engine/pick/index.mjs", + "node_modules/typebox/build/type/engine/pick/instantiate.mjs", + "node_modules/typebox/build/type/engine/priority/index.mjs", + "node_modules/typebox/build/type/engine/priority/priority.mjs", + "node_modules/typebox/build/type/engine/readonly/instantiate_add.mjs", + "node_modules/typebox/build/type/engine/readonly/instantiate_remove.mjs", + "node_modules/typebox/build/type/engine/readonly_object/from_array.mjs", + "node_modules/typebox/build/type/engine/readonly_object/from_cyclic.mjs", + "node_modules/typebox/build/type/engine/readonly_object/from_dependent.mjs", + "node_modules/typebox/build/type/engine/readonly_object/from_intersect.mjs", + "node_modules/typebox/build/type/engine/readonly_object/from_object.mjs", + "node_modules/typebox/build/type/engine/readonly_object/from_tuple.mjs", + "node_modules/typebox/build/type/engine/readonly_object/from_type.mjs", + "node_modules/typebox/build/type/engine/readonly_object/from_union.mjs", + "node_modules/typebox/build/type/engine/readonly_object/index.mjs", + "node_modules/typebox/build/type/engine/readonly_object/instantiate.mjs", + "node_modules/typebox/build/type/engine/record/from_key.mjs", + "node_modules/typebox/build/type/engine/record/from_key_any.mjs", + "node_modules/typebox/build/type/engine/record/from_key_boolean.mjs", + "node_modules/typebox/build/type/engine/record/from_key_enum.mjs", + "node_modules/typebox/build/type/engine/record/from_key_integer.mjs", + "node_modules/typebox/build/type/engine/record/from_key_intersect.mjs", + "node_modules/typebox/build/type/engine/record/from_key_literal.mjs", + "node_modules/typebox/build/type/engine/record/from_key_number.mjs", + "node_modules/typebox/build/type/engine/record/from_key_string.mjs", + "node_modules/typebox/build/type/engine/record/from_key_template_literal.mjs", + "node_modules/typebox/build/type/engine/record/from_key_union.mjs", + "node_modules/typebox/build/type/engine/record/index.mjs", + "node_modules/typebox/build/type/engine/record/instantiate.mjs", + "node_modules/typebox/build/type/engine/record/record_create.mjs", + "node_modules/typebox/build/type/engine/ref/index.mjs", + "node_modules/typebox/build/type/engine/ref/instantiate.mjs", + "node_modules/typebox/build/type/engine/required/from_cyclic.mjs", + "node_modules/typebox/build/type/engine/required/from_dependent.mjs", + "node_modules/typebox/build/type/engine/required/from_intersect.mjs", + "node_modules/typebox/build/type/engine/required/from_object.mjs", + "node_modules/typebox/build/type/engine/required/from_type.mjs", + "node_modules/typebox/build/type/engine/required/from_union.mjs", + "node_modules/typebox/build/type/engine/required/index.mjs", + "node_modules/typebox/build/type/engine/required/instantiate.mjs", + "node_modules/typebox/build/type/engine/rest/index.mjs", + "node_modules/typebox/build/type/engine/rest/spread.mjs", + "node_modules/typebox/build/type/engine/return_type/index.mjs", + "node_modules/typebox/build/type/engine/return_type/instantiate.mjs", + "node_modules/typebox/build/type/engine/template_literal/create.mjs", + "node_modules/typebox/build/type/engine/template_literal/decode.mjs", + "node_modules/typebox/build/type/engine/template_literal/encode.mjs", + "node_modules/typebox/build/type/engine/template_literal/index.mjs", + "node_modules/typebox/build/type/engine/template_literal/instantiate.mjs", + "node_modules/typebox/build/type/engine/template_literal/is_finite.mjs", + "node_modules/typebox/build/type/engine/template_literal/is_pattern.mjs", + "node_modules/typebox/build/type/engine/template_literal/static.mjs", + "node_modules/typebox/build/type/engine/this/expand_this.mjs", + "node_modules/typebox/build/type/engine/tuple/to_object.mjs", + "node_modules/typebox/build/type/engine/with/index.mjs", + "node_modules/typebox/build/type/engine/with/instantiate.mjs", + "node_modules/typebox/build/type/extends/any.mjs", + "node_modules/typebox/build/type/extends/array.mjs", + "node_modules/typebox/build/type/extends/bigint.mjs", + "node_modules/typebox/build/type/extends/boolean.mjs", + "node_modules/typebox/build/type/extends/constructor.mjs", + "node_modules/typebox/build/type/extends/dependent.mjs", + "node_modules/typebox/build/type/extends/enum.mjs", + "node_modules/typebox/build/type/extends/extends.mjs", + "node_modules/typebox/build/type/extends/extends_left.mjs", + "node_modules/typebox/build/type/extends/extends_right.mjs", + "node_modules/typebox/build/type/extends/function.mjs", + "node_modules/typebox/build/type/extends/index.mjs", + "node_modules/typebox/build/type/extends/inference.mjs", + "node_modules/typebox/build/type/extends/integer.mjs", + "node_modules/typebox/build/type/extends/intersect.mjs", + "node_modules/typebox/build/type/extends/literal.mjs", + "node_modules/typebox/build/type/extends/never.mjs", + "node_modules/typebox/build/type/extends/null.mjs", + "node_modules/typebox/build/type/extends/number.mjs", + "node_modules/typebox/build/type/extends/object.mjs", + "node_modules/typebox/build/type/extends/parameters.mjs", + "node_modules/typebox/build/type/extends/record.mjs", + "node_modules/typebox/build/type/extends/result.mjs", + "node_modules/typebox/build/type/extends/return_type.mjs", + "node_modules/typebox/build/type/extends/string.mjs", + "node_modules/typebox/build/type/extends/symbol.mjs", + "node_modules/typebox/build/type/extends/template_literal.mjs", + "node_modules/typebox/build/type/extends/tuple.mjs", + "node_modules/typebox/build/type/extends/undefined.mjs", + "node_modules/typebox/build/type/extends/union.mjs", + "node_modules/typebox/build/type/extends/unknown.mjs", + "node_modules/typebox/build/type/extends/void.mjs", + "node_modules/typebox/build/type/index.mjs", + "node_modules/typebox/build/type/script/index.mjs", + "node_modules/typebox/build/type/script/mapping.mjs", + "node_modules/typebox/build/type/script/parser.mjs", + "node_modules/typebox/build/type/script/script.mjs", + "node_modules/typebox/build/type/script/token/bigint.mjs", + "node_modules/typebox/build/type/script/token/const.mjs", + "node_modules/typebox/build/type/script/token/ident.mjs", + "node_modules/typebox/build/type/script/token/index.mjs", + "node_modules/typebox/build/type/script/token/integer.mjs", + "node_modules/typebox/build/type/script/token/internal/char.mjs", + "node_modules/typebox/build/type/script/token/internal/guard.mjs", + "node_modules/typebox/build/type/script/token/internal/match.mjs", + "node_modules/typebox/build/type/script/token/internal/take.mjs", + "node_modules/typebox/build/type/script/token/internal/trim.mjs", + "node_modules/typebox/build/type/script/token/number.mjs", + "node_modules/typebox/build/type/script/token/rest.mjs", + "node_modules/typebox/build/type/script/token/span.mjs", + "node_modules/typebox/build/type/script/token/string.mjs", + "node_modules/typebox/build/type/script/token/unsigned_integer.mjs", + "node_modules/typebox/build/type/script/token/unsigned_number.mjs", + "node_modules/typebox/build/type/script/token/until.mjs", + "node_modules/typebox/build/type/script/token/until_1.mjs", + "node_modules/typebox/build/type/types/_codec.mjs", + "node_modules/typebox/build/type/types/_immutable.mjs", + "node_modules/typebox/build/type/types/_optional.mjs", + "node_modules/typebox/build/type/types/_readonly.mjs", + "node_modules/typebox/build/type/types/_refine.mjs", + "node_modules/typebox/build/type/types/any.mjs", + "node_modules/typebox/build/type/types/array.mjs", + "node_modules/typebox/build/type/types/bigint.mjs", + "node_modules/typebox/build/type/types/boolean.mjs", + "node_modules/typebox/build/type/types/call.mjs", + "node_modules/typebox/build/type/types/constructor.mjs", + "node_modules/typebox/build/type/types/cyclic.mjs", + "node_modules/typebox/build/type/types/deferred.mjs", + "node_modules/typebox/build/type/types/dependent.mjs", + "node_modules/typebox/build/type/types/enum.mjs", + "node_modules/typebox/build/type/types/function.mjs", + "node_modules/typebox/build/type/types/generic.mjs", + "node_modules/typebox/build/type/types/identifier.mjs", + "node_modules/typebox/build/type/types/index.mjs", + "node_modules/typebox/build/type/types/infer.mjs", + "node_modules/typebox/build/type/types/integer.mjs", + "node_modules/typebox/build/type/types/intersect.mjs", + "node_modules/typebox/build/type/types/literal.mjs", + "node_modules/typebox/build/type/types/never.mjs", + "node_modules/typebox/build/type/types/null.mjs", + "node_modules/typebox/build/type/types/number.mjs", + "node_modules/typebox/build/type/types/object.mjs", + "node_modules/typebox/build/type/types/parameter.mjs", + "node_modules/typebox/build/type/types/properties.mjs", + "node_modules/typebox/build/type/types/record.mjs", + "node_modules/typebox/build/type/types/ref.mjs", + "node_modules/typebox/build/type/types/rest.mjs", + "node_modules/typebox/build/type/types/schema.mjs", + "node_modules/typebox/build/type/types/static.mjs", + "node_modules/typebox/build/type/types/string.mjs", + "node_modules/typebox/build/type/types/symbol.mjs", + "node_modules/typebox/build/type/types/template_literal.mjs", + "node_modules/typebox/build/type/types/this.mjs", + "node_modules/typebox/build/type/types/tuple.mjs", + "node_modules/typebox/build/type/types/undefined.mjs", + "node_modules/typebox/build/type/types/union.mjs", + "node_modules/typebox/build/type/types/unknown.mjs", + "node_modules/typebox/build/type/types/unsafe.mjs", + "node_modules/typebox/build/type/types/void.mjs", + "node_modules/typebox/build/typebox.mjs", + "node_modules/typebox/build/value/assert/assert.mjs", + "node_modules/typebox/build/value/assert/index.mjs", + "node_modules/typebox/build/value/check/check.mjs", + "node_modules/typebox/build/value/check/index.mjs", + "node_modules/typebox/build/value/clean/additional.mjs", + "node_modules/typebox/build/value/clean/clean.mjs", + "node_modules/typebox/build/value/clean/from_array.mjs", + "node_modules/typebox/build/value/clean/from_cyclic.mjs", + "node_modules/typebox/build/value/clean/from_intersect.mjs", + "node_modules/typebox/build/value/clean/from_object.mjs", + "node_modules/typebox/build/value/clean/from_record.mjs", + "node_modules/typebox/build/value/clean/from_ref.mjs", + "node_modules/typebox/build/value/clean/from_tuple.mjs", + "node_modules/typebox/build/value/clean/from_type.mjs", + "node_modules/typebox/build/value/clean/from_union.mjs", + "node_modules/typebox/build/value/clean/index.mjs", + "node_modules/typebox/build/value/clone/clone.mjs", + "node_modules/typebox/build/value/clone/index.mjs", + "node_modules/typebox/build/value/codec/callback.mjs", + "node_modules/typebox/build/value/codec/decode.mjs", + "node_modules/typebox/build/value/codec/encode.mjs", + "node_modules/typebox/build/value/codec/from_array.mjs", + "node_modules/typebox/build/value/codec/from_cyclic.mjs", + "node_modules/typebox/build/value/codec/from_intersect.mjs", + "node_modules/typebox/build/value/codec/from_object.mjs", + "node_modules/typebox/build/value/codec/from_record.mjs", + "node_modules/typebox/build/value/codec/from_ref.mjs", + "node_modules/typebox/build/value/codec/from_tuple.mjs", + "node_modules/typebox/build/value/codec/from_type.mjs", + "node_modules/typebox/build/value/codec/from_union.mjs", + "node_modules/typebox/build/value/codec/has.mjs", + "node_modules/typebox/build/value/codec/index.mjs", + "node_modules/typebox/build/value/convert/convert.mjs", + "node_modules/typebox/build/value/convert/from_additional.mjs", + "node_modules/typebox/build/value/convert/from_array.mjs", + "node_modules/typebox/build/value/convert/from_bigint.mjs", + "node_modules/typebox/build/value/convert/from_boolean.mjs", + "node_modules/typebox/build/value/convert/from_cyclic.mjs", + "node_modules/typebox/build/value/convert/from_enum.mjs", + "node_modules/typebox/build/value/convert/from_integer.mjs", + "node_modules/typebox/build/value/convert/from_intersect.mjs", + "node_modules/typebox/build/value/convert/from_literal.mjs", + "node_modules/typebox/build/value/convert/from_null.mjs", + "node_modules/typebox/build/value/convert/from_number.mjs", + "node_modules/typebox/build/value/convert/from_object.mjs", + "node_modules/typebox/build/value/convert/from_record.mjs", + "node_modules/typebox/build/value/convert/from_ref.mjs", + "node_modules/typebox/build/value/convert/from_string.mjs", + "node_modules/typebox/build/value/convert/from_template_literal.mjs", + "node_modules/typebox/build/value/convert/from_tuple.mjs", + "node_modules/typebox/build/value/convert/from_type.mjs", + "node_modules/typebox/build/value/convert/from_undefined.mjs", + "node_modules/typebox/build/value/convert/from_union.mjs", + "node_modules/typebox/build/value/convert/from_void.mjs", + "node_modules/typebox/build/value/convert/index.mjs", + "node_modules/typebox/build/value/convert/try/index.mjs", + "node_modules/typebox/build/value/convert/try/try.mjs", + "node_modules/typebox/build/value/convert/try/try_array.mjs", + "node_modules/typebox/build/value/convert/try/try_bigint.mjs", + "node_modules/typebox/build/value/convert/try/try_boolean.mjs", + "node_modules/typebox/build/value/convert/try/try_null.mjs", + "node_modules/typebox/build/value/convert/try/try_number.mjs", + "node_modules/typebox/build/value/convert/try/try_result.mjs", + "node_modules/typebox/build/value/convert/try/try_string.mjs", + "node_modules/typebox/build/value/convert/try/try_undefined.mjs", + "node_modules/typebox/build/value/create/create.mjs", + "node_modules/typebox/build/value/create/error.mjs", + "node_modules/typebox/build/value/create/from_array.mjs", + "node_modules/typebox/build/value/create/from_bigint.mjs", + "node_modules/typebox/build/value/create/from_boolean.mjs", + "node_modules/typebox/build/value/create/from_constructor.mjs", + "node_modules/typebox/build/value/create/from_cyclic.mjs", + "node_modules/typebox/build/value/create/from_default.mjs", + "node_modules/typebox/build/value/create/from_enum.mjs", + "node_modules/typebox/build/value/create/from_function.mjs", + "node_modules/typebox/build/value/create/from_integer.mjs", + "node_modules/typebox/build/value/create/from_intersect.mjs", + "node_modules/typebox/build/value/create/from_literal.mjs", + "node_modules/typebox/build/value/create/from_never.mjs", + "node_modules/typebox/build/value/create/from_null.mjs", + "node_modules/typebox/build/value/create/from_number.mjs", + "node_modules/typebox/build/value/create/from_object.mjs", + "node_modules/typebox/build/value/create/from_record.mjs", + "node_modules/typebox/build/value/create/from_ref.mjs", + "node_modules/typebox/build/value/create/from_string.mjs", + "node_modules/typebox/build/value/create/from_symbol.mjs", + "node_modules/typebox/build/value/create/from_template_literal.mjs", + "node_modules/typebox/build/value/create/from_tuple.mjs", + "node_modules/typebox/build/value/create/from_type.mjs", + "node_modules/typebox/build/value/create/from_undefined.mjs", + "node_modules/typebox/build/value/create/from_union.mjs", + "node_modules/typebox/build/value/create/from_void.mjs", + "node_modules/typebox/build/value/create/index.mjs", + "node_modules/typebox/build/value/default/default.mjs", + "node_modules/typebox/build/value/default/from_array.mjs", + "node_modules/typebox/build/value/default/from_cyclic.mjs", + "node_modules/typebox/build/value/default/from_default.mjs", + "node_modules/typebox/build/value/default/from_intersect.mjs", + "node_modules/typebox/build/value/default/from_object.mjs", + "node_modules/typebox/build/value/default/from_record.mjs", + "node_modules/typebox/build/value/default/from_ref.mjs", + "node_modules/typebox/build/value/default/from_tuple.mjs", + "node_modules/typebox/build/value/default/from_type.mjs", + "node_modules/typebox/build/value/default/from_union.mjs", + "node_modules/typebox/build/value/default/index.mjs", + "node_modules/typebox/build/value/delta/diff.mjs", + "node_modules/typebox/build/value/delta/edit.mjs", + "node_modules/typebox/build/value/delta/index.mjs", + "node_modules/typebox/build/value/delta/patch.mjs", + "node_modules/typebox/build/value/equal/equal.mjs", + "node_modules/typebox/build/value/equal/index.mjs", + "node_modules/typebox/build/value/errors/errors.mjs", + "node_modules/typebox/build/value/errors/index.mjs", + "node_modules/typebox/build/value/hash/hash.mjs", + "node_modules/typebox/build/value/hash/index.mjs", + "node_modules/typebox/build/value/index.mjs", + "node_modules/typebox/build/value/parse/index.mjs", + "node_modules/typebox/build/value/parse/parse.mjs", + "node_modules/typebox/build/value/pipeline/index.mjs", + "node_modules/typebox/build/value/pipeline/pipeline.mjs", + "node_modules/typebox/build/value/pointer/index.mjs", + "node_modules/typebox/build/value/repair/from_array.mjs", + "node_modules/typebox/build/value/repair/from_enum.mjs", + "node_modules/typebox/build/value/repair/from_intersect.mjs", + "node_modules/typebox/build/value/repair/from_object.mjs", + "node_modules/typebox/build/value/repair/from_record.mjs", + "node_modules/typebox/build/value/repair/from_ref.mjs", + "node_modules/typebox/build/value/repair/from_template_literal.mjs", + "node_modules/typebox/build/value/repair/from_tuple.mjs", + "node_modules/typebox/build/value/repair/from_type.mjs", + "node_modules/typebox/build/value/repair/from_union.mjs", + "node_modules/typebox/build/value/repair/from_unknown.mjs", + "node_modules/typebox/build/value/repair/index.mjs", + "node_modules/typebox/build/value/repair/repair.mjs", + "node_modules/typebox/build/value/shared/index.mjs", + "node_modules/typebox/build/value/shared/optional_undefined.mjs", + "node_modules/typebox/build/value/shared/union_priority_sort.mjs", + "node_modules/typebox/build/value/shared/union_score_select.mjs", + "node_modules/typebox/build/value/value.mjs", + "node_modules/uc.micro/categories/Cc/regex.mjs", + "node_modules/uc.micro/categories/Cf/regex.mjs", + "node_modules/uc.micro/categories/P/regex.mjs", + "node_modules/uc.micro/categories/S/regex.mjs", + "node_modules/uc.micro/categories/Z/regex.mjs", + "node_modules/uc.micro/index.mjs", + "node_modules/uc.micro/properties/Any/regex.mjs", + "node_modules/unist-util-stringify-position/index.js", + "node_modules/unist-util-stringify-position/lib/index.js", + "node_modules/zod/index.js", + "node_modules/zod/v4-mini/index.js", + "node_modules/zod/v4/classic/checks.js", + "node_modules/zod/v4/classic/compat.js", + "node_modules/zod/v4/classic/errors.js", + "node_modules/zod/v4/classic/external.js", + "node_modules/zod/v4/classic/index.js", + "node_modules/zod/v4/classic/iso.js", + "node_modules/zod/v4/classic/parse.js", + "node_modules/zod/v4/classic/schemas.js", + "node_modules/zod/v4/core/api.js", + "node_modules/zod/v4/core/checks.js", + "node_modules/zod/v4/core/core.js", + "node_modules/zod/v4/core/doc.js", + "node_modules/zod/v4/core/errors.js", + "node_modules/zod/v4/core/index.js", + "node_modules/zod/v4/core/json-schema-processors.js", + "node_modules/zod/v4/core/parse.js", + "node_modules/zod/v4/core/regexes.js", + "node_modules/zod/v4/core/registries.js", + "node_modules/zod/v4/core/schemas.js", + "node_modules/zod/v4/core/to-json-schema.js", + "node_modules/zod/v4/core/util.js", + "node_modules/zod/v4/core/versions.js", + "node_modules/zod/v4/index.js", + "node_modules/zod/v4/mini/checks.js", + "node_modules/zod/v4/mini/external.js", + "node_modules/zod/v4/mini/parse.js", + "node_modules/zod/v4/mini/schemas.js", + "packages/acp-core/src/structured-auth-redaction.ts", + "packages/gateway-client/src/browser-device-auth.ts", + "packages/gateway-client/src/browser.ts", + "packages/gateway-client/src/connect-auth.ts", + "packages/gateway-client/src/device-auth.ts", + "packages/gateway-client/src/event-listeners.ts", + "packages/gateway-client/src/gateway-origin-scope.ts", + "packages/gateway-client/src/pending-request.ts", + "packages/gateway-client/src/protocol-client.ts", + "packages/gateway-client/src/protocol-request.ts", + "packages/gateway-client/src/reconnect-policy.ts", + "packages/gateway-client/src/session-projection-message-identity.ts", + "packages/gateway-client/src/session-projection-run-event.ts", + "packages/gateway-client/src/session-projection.ts", + "packages/gateway-client/src/session-subscriptions.ts", + "packages/gateway-client/src/timeouts.ts", + "packages/gateway-protocol/src/approval-result-validators.ts", + "packages/gateway-protocol/src/clawhub-trust-error-details.ts", + "packages/gateway-protocol/src/client-info.ts", + "packages/gateway-protocol/src/connect-error-details.ts", + "packages/gateway-protocol/src/error-details.ts", + "packages/gateway-protocol/src/failover-reasons.ts", + "packages/gateway-protocol/src/frame-guards.ts", + "packages/gateway-protocol/src/gateway-error-details.ts", + "packages/gateway-protocol/src/github-publication-api.ts", + "packages/gateway-protocol/src/index.ts", + "packages/gateway-protocol/src/install-policy-warning-error-details.ts", + "packages/gateway-protocol/src/migration-api.ts", + "packages/gateway-protocol/src/protocol-validator.ts", + "packages/gateway-protocol/src/protocol-value-normalization.ts", + "packages/gateway-protocol/src/public-schema.ts", + "packages/gateway-protocol/src/schema-modules.ts", + "packages/gateway-protocol/src/schema/agent.ts", + "packages/gateway-protocol/src/schema/agents-models-skills.ts", + "packages/gateway-protocol/src/schema/agents-workspace.ts", + "packages/gateway-protocol/src/schema/approval-id.ts", + "packages/gateway-protocol/src/schema/approvals.ts", + "packages/gateway-protocol/src/schema/artifacts.ts", + "packages/gateway-protocol/src/schema/audit-activity.ts", + "packages/gateway-protocol/src/schema/audit-run.ts", + "packages/gateway-protocol/src/schema/audit.ts", + "packages/gateway-protocol/src/schema/board.ts", + "packages/gateway-protocol/src/schema/channel-pairing.ts", + "packages/gateway-protocol/src/schema/channels.ts", + "packages/gateway-protocol/src/schema/chat-history-constants.ts", + "packages/gateway-protocol/src/schema/closed-object.ts", + "packages/gateway-protocol/src/schema/commands.ts", + "packages/gateway-protocol/src/schema/config.ts", + "packages/gateway-protocol/src/schema/cron.ts", + "packages/gateway-protocol/src/schema/cron.types.ts", + "packages/gateway-protocol/src/schema/desktop.ts", + "packages/gateway-protocol/src/schema/devices.ts", + "packages/gateway-protocol/src/schema/environments.ts", + "packages/gateway-protocol/src/schema/error-codes.ts", + "packages/gateway-protocol/src/schema/exec-approvals.ts", + "packages/gateway-protocol/src/schema/failover-reason.ts", + "packages/gateway-protocol/src/schema/frames.ts", + "packages/gateway-protocol/src/schema/fs.ts", + "packages/gateway-protocol/src/schema/gateway-suspend.ts", + "packages/gateway-protocol/src/schema/hooks.ts", + "packages/gateway-protocol/src/schema/logs-chat.ts", + "packages/gateway-protocol/src/schema/migrations.ts", + "packages/gateway-protocol/src/schema/nodes.ts", + "packages/gateway-protocol/src/schema/openclaw.ts", + "packages/gateway-protocol/src/schema/plugin-approvals.ts", + "packages/gateway-protocol/src/schema/plugins.ts", + "packages/gateway-protocol/src/schema/portals.ts", + "packages/gateway-protocol/src/schema/primitives.ts", + "packages/gateway-protocol/src/schema/progress-card.ts", + "packages/gateway-protocol/src/schema/projects.ts", + "packages/gateway-protocol/src/schema/push.ts", + "packages/gateway-protocol/src/schema/questions.ts", + "packages/gateway-protocol/src/schema/secrets.ts", + "packages/gateway-protocol/src/schema/session-classification.ts", + "packages/gateway-protocol/src/schema/session-discussion.ts", + "packages/gateway-protocol/src/schema/session-github-publication.ts", + "packages/gateway-protocol/src/schema/session-placement-state.ts", + "packages/gateway-protocol/src/schema/session-placement.ts", + "packages/gateway-protocol/src/schema/sessions-catalog.ts", + "packages/gateway-protocol/src/schema/sessions-delete.ts", + "packages/gateway-protocol/src/schema/sessions-patch.ts", + "packages/gateway-protocol/src/schema/sessions-row.ts", + "packages/gateway-protocol/src/schema/sessions-sharing-values.ts", + "packages/gateway-protocol/src/schema/sessions-sharing.ts", + "packages/gateway-protocol/src/schema/sessions-suggestions.ts", + "packages/gateway-protocol/src/schema/sessions-viewer-presence.ts", + "packages/gateway-protocol/src/schema/sessions.ts", + "packages/gateway-protocol/src/schema/since.ts", + "packages/gateway-protocol/src/schema/skill-history.ts", + "packages/gateway-protocol/src/schema/snapshot.ts", + "packages/gateway-protocol/src/schema/system-event.ts", + "packages/gateway-protocol/src/schema/system-info.ts", + "packages/gateway-protocol/src/schema/talk-marks.ts", + "packages/gateway-protocol/src/schema/task-suggestions.ts", + "packages/gateway-protocol/src/schema/tasks.ts", + "packages/gateway-protocol/src/schema/terminal.ts", + "packages/gateway-protocol/src/schema/ui-command.ts", + "packages/gateway-protocol/src/schema/users.ts", + "packages/gateway-protocol/src/schema/wizard.ts", + "packages/gateway-protocol/src/schema/worker-admission.ts", + "packages/gateway-protocol/src/schema/worker-inference.ts", + "packages/gateway-protocol/src/schema/worker-protocol-primitives.ts", + "packages/gateway-protocol/src/schema/worktrees.ts", + "packages/gateway-protocol/src/secret-ref-contract.ts", + "packages/gateway-protocol/src/session-agent-status.ts", + "packages/gateway-protocol/src/startup-unavailable.ts", + "packages/gateway-protocol/src/system-agent-error-details.ts", + "packages/gateway-protocol/src/terminal-validators.ts", + "packages/gateway-protocol/src/validator-registry.ts", + "packages/gateway-protocol/src/version.ts", + "packages/markdown-core/src/assistant-transcript-headers.ts", + "packages/markdown-core/src/assistant-transcript.ts", + "packages/markdown-core/src/fences.ts", + "packages/markdown-core/src/html-tags.ts", + "packages/markdown-core/src/reasoning-tag-parser.ts", + "packages/markdown-core/src/reasoning-tags.ts", + "packages/media-core/src/constants.ts", + "packages/media-core/src/file-name.ts", + "packages/media-core/src/mime.ts", + "packages/model-catalog-core/src/provider-id.ts", + "packages/net-policy/src/ip.ts", + "packages/net-policy/src/redact-sensitive-url.ts", + "packages/net-policy/src/url-protocol.ts", + "packages/normalization-core/src/agent-id.ts", + "packages/normalization-core/src/balanced-json.ts", + "packages/normalization-core/src/boolean-coercion.ts", + "packages/normalization-core/src/cjk-chars.ts", + "packages/normalization-core/src/error-coercion.ts", + "packages/normalization-core/src/expect.ts", + "packages/normalization-core/src/format.ts", + "packages/normalization-core/src/index.ts", + "packages/normalization-core/src/json-coercion.ts", + "packages/normalization-core/src/markdown-plain-text.ts", + "packages/normalization-core/src/number-coercion.ts", + "packages/normalization-core/src/record-coerce.ts", + "packages/normalization-core/src/result.ts", + "packages/normalization-core/src/stable-stringify.ts", + "packages/normalization-core/src/string-coerce.ts", + "packages/normalization-core/src/string-normalization.ts", + "packages/normalization-core/src/text-decoding.ts", + "packages/normalization-core/src/utf16-slice.ts", + "packages/retry/src/index.ts", + "packages/session-url-contract/src/focus.ts", + "packages/session-url-contract/src/grammar.ts", + "packages/session-url-contract/src/index.ts", + "packages/session-url-contract/src/parse.ts", + "packages/terminal-core/src/ansi-sequences.ts", + "packages/terminal-core/src/ansi.ts", + "packages/terminal-core/src/safe-text.ts", + "packages/tool-call-repair/src/contracts.ts", + "packages/tool-call-repair/src/grammar.ts", + "packages/tool-call-repair/src/index.ts", + "packages/tool-call-repair/src/payload.ts", + "packages/tool-call-repair/src/promote.ts", + "packages/tool-call-repair/src/stream-normalizer.ts", + "packages/workboard-contract/src/index.ts", + "src/agents/internal-runtime-context.ts", + "src/agents/tool-catalog.ts", + "src/agents/tool-description-presets.ts", + "src/agents/tool-display-common.ts", + "src/agents/tool-display-exec-shell.ts", + "src/agents/tool-display-exec.ts", + "src/agents/tool-policy-shared.ts", + "src/agents/tools/automations-tool-name.ts", + "src/auto-reply/commands-args.ts", + "src/auto-reply/commands-registry.shared.ts", + "src/auto-reply/reply/delivery-hints.ts", + "src/auto-reply/reply/inbound-context-marker.ts", + "src/auto-reply/reply/queue/normalize.ts", + "src/auto-reply/reply/strip-inbound-meta.ts", + "src/auto-reply/thinking.shared.ts", + "src/auto-reply/tokens.ts", + "src/chat/canvas-render.ts", + "src/chat/tool-content.ts", + "src/config/cron-limits.ts", + "src/gateway/control-reply-text.ts", + "src/gateway/control-ui-bootstrap-contract.ts", + "src/gateway/control-ui-contract.ts", + "src/gateway/control-ui-plugin-frame-contract.ts", + "src/gateway/control-ui-resource-routes.ts", + "src/gateway/control-ui-root-assets.ts", + "src/gateway/control-ui-shared.ts", + "src/gateway/control-ui-user-avatar-route.ts", + "src/gateway/events.ts", + "src/infra/approval-display-paths.ts", + "src/infra/format-time/format-duration-internal.ts", + "src/infra/format-time/format-duration.ts", + "src/infra/map-size.ts", + "src/infra/provider-usage.shared.ts", + "src/logging/redact-patterns.ts", + "src/media/audio-tags.ts", + "src/media/media-facts.ts", + "src/media/parse.ts", + "src/plugin-sdk/message-tool-delivery-hints.ts", + "src/sessions/classify-session-kind.ts", + "src/sessions/session-key-utils.ts", + "src/shared/agent-run-status.ts", + "src/shared/avatar-limits.ts", + "src/shared/bounded-buffer.ts", + "src/shared/bounded-serial-queue.ts", + "src/shared/chat-envelope.ts", + "src/shared/chat-message-content.ts", + "src/shared/device-auth.ts", + "src/shared/device-bootstrap-profile.ts", + "src/shared/fast-mode.ts", + "src/shared/incognito-session-key.ts", + "src/shared/lobster-day.ts", + "src/shared/markdown-code.ts", + "src/shared/operator-scope-compat.ts", + "src/shared/regexp.ts", + "src/shared/resume-handoff.ts", + "src/shared/session-archive-timeout.ts", + "src/shared/session-method-scopes-base.ts", + "src/shared/text/assistant-visible-text.ts", + "src/shared/text/citation-control-markers.ts", + "src/shared/text/code-regions.ts", + "src/shared/text/final-tags.ts", + "src/shared/text/model-special-tokens.ts", + "src/shared/text/reasoning-tags.ts", + "src/shared/transcript-only-openclaw-assistant.ts", + "src/talk/agent-consult-tool.ts", + "src/talk/agent-run-control-shared.ts", + "src/talk/describe-view-tool.ts", + "src/talk/provider-types.ts", + "src/talk/talk-session-controller.ts", + "src/talk/voice-transcript.ts", + "src/utils/directive-tags.ts", + "src/utils/message-channel-constants.ts", + "ui/__vite-browser-external", + "ui/index.html", + "ui/src/api/gateway-browser-socket.ts", + "ui/src/api/gateway-connect-errors.ts", + "ui/src/api/gateway.ts", + "ui/src/app-navigation.ts", + "ui/src/app-route-paths.ts", + "ui/src/app-routes.ts", + "ui/src/app-session-path-builder.ts", + "ui/src/app-session-route-paths.ts", + "ui/src/app/agent-selection.ts", + "ui/src/app/app-host-route-state.ts", + "ui/src/app/app-host.ts", + "ui/src/app/app-root.ts", + "ui/src/app/app-shell-chrome.ts", + "ui/src/app/app-shell-gateway.ts", + "ui/src/app/app-shell-navigation.ts", + "ui/src/app/app-shell-view.ts", + "ui/src/app/app-shell-workboard.ts", + "ui/src/app/approval-deep-link.ts", + "ui/src/app/approval-presentation.ts", + "ui/src/app/assistant-identity.ts", + "ui/src/app/assistant-media.ts", + "ui/src/app/bootstrap-location.ts", + "ui/src/app/bootstrap.ts", + "ui/src/app/browser.ts", + "ui/src/app/canvas-surface-lease.runtime.ts", + "ui/src/app/chat-attachment-handoff.ts", + "ui/src/app/command-client-presentation.ts", + "ui/src/app/config.ts", + "ui/src/app/context.ts", + "ui/src/app/control-ui-auth.ts", + "ui/src/app/control-ui-presentation.ts", + "ui/src/app/custom-theme.ts", + "ui/src/app/device-scope-upgrade.ts", + "ui/src/app/exec-approval.ts", + "ui/src/app/gateway-readiness.ts", + "ui/src/app/gateway-store.ts", + "ui/src/app/initial-user-message-handoff.ts", + "ui/src/app/lazy-custom-element.ts", + "ui/src/app/lazy-shell-action.ts", + "ui/src/app/mobile-nav-layout.ts", + "ui/src/app/native-bridge.ts", + "ui/src/app/native-editor-locality.runtime.ts", + "ui/src/app/native-gateways.runtime.ts", + "ui/src/app/native-link-routing.ts", + "ui/src/app/native-nav-state.ts", + "ui/src/app/native-notifications.ts", + "ui/src/app/native-route-memory.ts", + "ui/src/app/native-web-chrome.ts", + "ui/src/app/native-window-drag.ts", + "ui/src/app/navigation-surface.ts", + "ui/src/app/notifications-auto-prompt.ts", + "ui/src/app/onboarding-mode.ts", + "ui/src/app/operator-access.ts", + "ui/src/app/overlays-access.ts", + "ui/src/app/overlays.ts", + "ui/src/app/public-assets.ts", + "ui/src/app/question-prompt-client.ts", + "ui/src/app/question-prompt.ts", + "ui/src/app/route-transition.ts", + "ui/src/app/router-outlet-controller.ts", + "ui/src/app/router-outlet.ts", + "ui/src/app/server-prefs-state.ts", + "ui/src/app/server-prefs.ts", + "ui/src/app/session-placement-startup.runtime.ts", + "ui/src/app/session-placement-startup.ts", + "ui/src/app/settings.ts", + "ui/src/app/skill-workshop-revision-admissions.ts", + "ui/src/app/stale-chunk-reload.ts", + "ui/src/app/startup-lifecycle.ts", + "ui/src/app/startup-settings.ts", + "ui/src/app/theme-transition.ts", + "ui/src/app/theme.ts", + "ui/src/app/update-confirmation.ts", + "ui/src/app/update-overlay-helpers.ts", + "ui/src/app/update-schedule-dto.ts", + "ui/src/app/update-schedule-projection.ts", + "ui/src/app/update-success-notice.ts", + "ui/src/app/user-identity.ts", + "ui/src/app/user-profile.ts", + "ui/src/app/web-push.runtime.ts", + "ui/src/app/web-push.ts", + "ui/src/build-info.ts", + "ui/src/components/agent-select.ts", + "ui/src/components/anchored-overlay.ts", + "ui/src/components/app-sidebar-agent-menu.ts", + "ui/src/components/app-sidebar-base.ts", + "ui/src/components/app-sidebar-catalog-menu.ts", + "ui/src/components/app-sidebar-child-session-data.ts", + "ui/src/components/app-sidebar-nav-menus.ts", + "ui/src/components/app-sidebar-render.ts", + "ui/src/components/app-sidebar-session-catalog-live.ts", + "ui/src/components/app-sidebar-session-catalog-render.ts", + "ui/src/components/app-sidebar-session-catalog-state.ts", + "ui/src/components/app-sidebar-session-catalogs.ts", + "ui/src/components/app-sidebar-session-list-render.ts", + "ui/src/components/app-sidebar-session-lookup.ts", + "ui/src/components/app-sidebar-session-menu-renderers.ts", + "ui/src/components/app-sidebar-session-narration.ts", + "ui/src/components/app-sidebar-session-navigation-logic.ts", + "ui/src/components/app-sidebar-session-navigation.ts", + "ui/src/components/app-sidebar-session-pr-indicators.ts", + "ui/src/components/app-sidebar-session-row-render.ts", + "ui/src/components/app-sidebar-session-section-header.ts", + "ui/src/components/app-sidebar-session-tree.ts", + "ui/src/components/app-sidebar-session-types.ts", + "ui/src/components/app-sidebar-workboard.ts", + "ui/src/components/app-sidebar.ts", + "ui/src/components/app-topbar.ts", + "ui/src/components/browser/browser-annotation.ts", + "ui/src/components/catalog-session-menu.ts", + "ui/src/components/cloud-worker-stop.ts", + "ui/src/components/command-palette-contract.ts", + "ui/src/components/confetti.ts", + "ui/src/components/config-form.numeric.ts", + "ui/src/components/connect-command.ts", + "ui/src/components/copy-button.ts", + "ui/src/components/desktop/desktop-focus-window.ts", + "ui/src/components/dock-panel-layout.ts", + "ui/src/components/dropdown-menu-controller.ts", + "ui/src/components/elapsed-time.ts", + "ui/src/components/exec-approval-card.ts", + "ui/src/components/file-kind.ts", + "ui/src/components/fullscreen-controller.ts", + "ui/src/components/gateway-url-confirmation.ts", + "ui/src/components/github-link-hovercard-registration.ts", + "ui/src/components/github-link-target.ts", + "ui/src/components/icons-tools.ts", + "ui/src/components/icons.ts", + "ui/src/components/identity-avatar-view.ts", + "ui/src/components/image-lightbox.ts", + "ui/src/components/lazy-hovercard-registration.ts", + "ui/src/components/lazy-view-error.ts", + "ui/src/components/loading-state.ts", + "ui/src/components/lobster-dex.ts", + "ui/src/components/lobster-pet-audio.ts", + "ui/src/components/lobster-pet-contract.ts", + "ui/src/components/lobster-pet-dismiss-menu.ts", + "ui/src/components/lobster-pet-look.ts", + "ui/src/components/lobster-pet-lore.ts", + "ui/src/components/lobster-pet-moon.ts", + "ui/src/components/lobster-pet-palettes.ts", + "ui/src/components/lobster-pet-plans.ts", + "ui/src/components/lobster-pet-sprites-wild.ts", + "ui/src/components/lobster-pet-sprites.ts", + "ui/src/components/lobster-pet-traffic.ts", + "ui/src/components/lobster-pet.ts", + "ui/src/components/login-gate.ts", + "ui/src/components/macos-titlebar-controls.ts", + "ui/src/components/markdown-assistant-transcript.ts", + "ui/src/components/markdown-code-blocks.ts", + "ui/src/components/markdown-details.ts", + "ui/src/components/markdown-file-links.ts", + "ui/src/components/markdown-parser.ts", + "ui/src/components/markdown-render-options.ts", + "ui/src/components/markdown-session-links.ts", + "ui/src/components/markdown-streaming.ts", + "ui/src/components/markdown-tables.ts", + "ui/src/components/markdown-text.ts", + "ui/src/components/markdown.ts", + "ui/src/components/mascot-animator.ts", + "ui/src/components/mascot-canvas.ts", + "ui/src/components/mascot-pose.ts", + "ui/src/components/mcp-app-security.ts", + "ui/src/components/mcp-app-unmount.ts", + "ui/src/components/mcp-server-form.ts", + "ui/src/components/menu-shortcuts.ts", + "ui/src/components/menu-surface.ts", + "ui/src/components/modal-dialog.ts", + "ui/src/components/native-link-menu.ts", + "ui/src/components/openclaw-mascot.ts", + "ui/src/components/panel-empty-state.ts", + "ui/src/components/panel-refresh-status.ts", + "ui/src/components/panel-toggle-contract.ts", + "ui/src/components/person-activity-link.ts", + "ui/src/components/provider-icon.ts", + "ui/src/components/resizable-divider.ts", + "ui/src/components/sandbox-host.ts", + "ui/src/components/session-attention-controller.ts", + "ui/src/components/session-attention-icon-registry.ts", + "ui/src/components/session-attention-presentation.ts", + "ui/src/components/session-data-controller-catalog.ts", + "ui/src/components/session-data-controller-events.ts", + "ui/src/components/session-data-controller.ts", + "ui/src/components/session-data-scroll-controller.ts", + "ui/src/components/session-glyph.ts", + "ui/src/components/session-icon-glyph-registry.ts", + "ui/src/components/session-icon-picker.ts", + "ui/src/components/session-leading-indicator.ts", + "ui/src/components/session-menu-access.ts", + "ui/src/components/session-menu-compact.ts", + "ui/src/components/session-menu-options.ts", + "ui/src/components/session-menu-work.ts", + "ui/src/components/session-menu.ts", + "ui/src/components/session-organizer-controller.ts", + "ui/src/components/session-owner-chip.ts", + "ui/src/components/session-owner-menu.ts", + "ui/src/components/session-panel-toggle-buffer.ts", + "ui/src/components/session-progress-card-controller.ts", + "ui/src/components/session-progress-card.ts", + "ui/src/components/session-progress-hovercard-registration.ts", + "ui/src/components/session-progress-hovercard-target.ts", + "ui/src/components/session-row-badges.ts", + "ui/src/components/session-row-subtitle.ts", + "ui/src/components/settings-sidebar-lazy.ts", + "ui/src/components/settings-ui.ts", + "ui/src/components/sidebar-agent-card.ts", + "ui/src/components/sidebar-attention-dismissals.ts", + "ui/src/components/sidebar-attention-items.ts", + "ui/src/components/sidebar-attention.ts", + "ui/src/components/sidebar-build-chip-format.ts", + "ui/src/components/sidebar-build-chip.ts", + "ui/src/components/sidebar-menus-controller.ts", + "ui/src/components/sidebar-menus-render.ts", + "ui/src/components/sidebar-narration-line.ts", + "ui/src/components/terminal/terminal-connection.ts", + "ui/src/components/terminal/terminal-pending-actions.ts", + "ui/src/components/terminal/terminal-session-storage.ts", + "ui/src/components/theme-mode-toggle.ts", + "ui/src/components/tooltip.ts", + "ui/src/components/update-banner.ts", + "ui/src/components/viewer-facepile.ts", + "ui/src/components/web-awesome-tabs.ts", + "ui/src/components/web-awesome.ts", + "ui/src/components/working-phrase.ts", + "ui/src/components/workspace-icon.ts", + "ui/src/i18n/lib/lit-controller.ts", + "ui/src/i18n/lib/registry.ts", + "ui/src/i18n/lib/translate.ts", + "ui/src/i18n/locales/en-agents.ts", + "ui/src/i18n/locales/en-session-placement.ts", + "ui/src/i18n/locales/en.ts", + "ui/src/lib/agents/display.ts", + "ui/src/lib/agents/identity.ts", + "ui/src/lib/agents/index.ts", + "ui/src/lib/agents/panels.ts", + "ui/src/lib/agents/tools-effective.ts", + "ui/src/lib/agents/watch-agent-scope.ts", + "ui/src/lib/assistant-identity.ts", + "ui/src/lib/authenticated-avatar-route.ts", + "ui/src/lib/avatar.ts", + "ui/src/lib/board/availability-controller.ts", + "ui/src/lib/board/gateway-provider.ts", + "ui/src/lib/board/mcp-app-view-cache.ts", + "ui/src/lib/board/mock-ops.ts", + "ui/src/lib/board/provider-helpers.ts", + "ui/src/lib/board/provider-signals.ts", + "ui/src/lib/board/provider.ts", + "ui/src/lib/board/settings.ts", + "ui/src/lib/board/widget-names.ts", + "ui/src/lib/board/widget-ticket-lifetime.ts", + "ui/src/lib/browser-redact.ts", + "ui/src/lib/channels/index.ts", + "ui/src/lib/chat/canvas-widget-frame-generation.ts", + "ui/src/lib/chat/chat-metadata-store.ts", + "ui/src/lib/chat/chat-queue-order.ts", + "ui/src/lib/chat/chat-types.ts", + "ui/src/lib/chat/commands.ts", + "ui/src/lib/chat/companion-question.ts", + "ui/src/lib/chat/composer-draft-store.runtime.ts", + "ui/src/lib/chat/current-user-identity.ts", + "ui/src/lib/chat/follow-up-mode.ts", + "ui/src/lib/chat/heartbeat-display.ts", + "ui/src/lib/chat/message-extract.ts", + "ui/src/lib/chat/message-normalizer.ts", + "ui/src/lib/chat/model-ref.ts", + "ui/src/lib/chat/model-select-state.ts", + "ui/src/lib/chat/outbox-store-codec.ts", + "ui/src/lib/chat/outbox-store-draft-state.ts", + "ui/src/lib/chat/outbox-store-projection.ts", + "ui/src/lib/chat/outbox-store.ts", + "ui/src/lib/chat/sender-label.ts", + "ui/src/lib/chat/session-diff-gaps.ts", + "ui/src/lib/chat/session-diff-split.ts", + "ui/src/lib/chat/session-diff.ts", + "ui/src/lib/chat/thinking.ts", + "ui/src/lib/chat/tool-approval-reviews.ts", + "ui/src/lib/chat/tool-call-diff.ts", + "ui/src/lib/chat/tool-call-grouping.ts", + "ui/src/lib/chat/tool-call-patch.ts", + "ui/src/lib/chat/tool-call-view.ts", + "ui/src/lib/chat/tool-cards.ts", + "ui/src/lib/chat/tool-display.ts", + "ui/src/lib/clipboard.ts", + "ui/src/lib/config-form-utils.ts", + "ui/src/lib/config/applied-refresh.ts", + "ui/src/lib/config/config-draft-model.ts", + "ui/src/lib/config/config-gateway-operations.ts", + "ui/src/lib/config/config-state-model.ts", + "ui/src/lib/config/config-write-coordinator.ts", + "ui/src/lib/config/mcp-servers.ts", + "ui/src/lib/config/runtime-config-capability.ts", + "ui/src/lib/connection-hints.ts", + "ui/src/lib/cron-status.ts", + "ui/src/lib/cron/decimal.ts", + "ui/src/lib/cron/index.ts", + "ui/src/lib/cron/scope.ts", + "ui/src/lib/device-pair-setup.ts", + "ui/src/lib/editor-links.ts", + "ui/src/lib/external-link.ts", + "ui/src/lib/fnv1a.ts", + "ui/src/lib/format-error.ts", + "ui/src/lib/format.ts", + "ui/src/lib/gateway-connection-lifecycle.ts", + "ui/src/lib/gateway-errors.ts", + "ui/src/lib/gateway-locality.ts", + "ui/src/lib/gateway-methods.ts", + "ui/src/lib/gateway-retry.ts", + "ui/src/lib/graphemes.ts", + "ui/src/lib/hover-marquee.ts", + "ui/src/lib/identity-avatar-loader.ts", + "ui/src/lib/identity-avatar.ts", + "ui/src/lib/idle-import.ts", + "ui/src/lib/json5-runtime.ts", + "ui/src/lib/keyboard-shortcuts.ts", + "ui/src/lib/media-file-extension.ts", + "ui/src/lib/model-auth.ts", + "ui/src/lib/navigation-click.ts", + "ui/src/lib/nodes/index.ts", + "ui/src/lib/observer-digest.ts", + "ui/src/lib/open-external-url.ts", + "ui/src/lib/plugin-activation.ts", + "ui/src/lib/plugins/index.ts", + "ui/src/lib/presence-users.ts", + "ui/src/lib/provider-quota-summary.ts", + "ui/src/lib/provider-usage-request.ts", + "ui/src/lib/select-options.ts", + "ui/src/lib/session-display.ts", + "ui/src/lib/session-goal.ts", + "ui/src/lib/session-method-access.ts", + "ui/src/lib/session-model-defaults.ts", + "ui/src/lib/session-progress-cards.ts", + "ui/src/lib/session-pull-requests.ts", + "ui/src/lib/session-run-state.ts", + "ui/src/lib/session-viewer-presence.ts", + "ui/src/lib/sessions/catalog-key.ts", + "ui/src/lib/sessions/catalog-project-grouping.ts", + "ui/src/lib/sessions/catalog-terminal.ts", + "ui/src/lib/sessions/child-session-data.ts", + "ui/src/lib/sessions/create.ts", + "ui/src/lib/sessions/custom-groups.ts", + "ui/src/lib/sessions/drag.ts", + "ui/src/lib/sessions/event-refresh-coordinator.ts", + "ui/src/lib/sessions/grouping.ts", + "ui/src/lib/sessions/index.ts", + "ui/src/lib/sessions/navigation-handoff.ts", + "ui/src/lib/sessions/navigation.ts", + "ui/src/lib/sessions/paged-session-rows.ts", + "ui/src/lib/sessions/reconcile.ts", + "ui/src/lib/sessions/recover.ts", + "ui/src/lib/sessions/route-navigation.ts", + "ui/src/lib/sessions/session-event-subscription.ts", + "ui/src/lib/sessions/session-group-catalog.ts", + "ui/src/lib/sessions/session-key.ts", + "ui/src/lib/sessions/session-mutations.ts", + "ui/src/lib/sessions/session-placement-recovery-migration.runtime.ts", + "ui/src/lib/sessions/session-placement-recovery-storage-key.ts", + "ui/src/lib/sessions/session-placement-recovery.ts", + "ui/src/lib/sessions/session-placement-startup.ts", + "ui/src/lib/sessions/session-placement-submit.ts", + "ui/src/lib/sessions/session-requests.ts", + "ui/src/lib/sessions/session-roster-refresh.ts", + "ui/src/lib/sessions/session-scoped-operations.ts", + "ui/src/lib/sessions/swarm-activity.ts", + "ui/src/lib/sessions/swarm-roster.ts", + "ui/src/lib/sessions/tool-overrides.ts", + "ui/src/lib/sessions/unread.ts", + "ui/src/lib/sessions/usage.ts", + "ui/src/lib/sidebar-zone.ts", + "ui/src/lib/skills/config-mutations.ts", + "ui/src/lib/skills/index.ts", + "ui/src/lib/strip-thinking-tags.ts", + "ui/src/lib/task-suggestion-acceptance.ts", + "ui/src/lib/tasks/data.ts", + "ui/src/lib/tasks/task-summary.ts", + "ui/src/lib/terminal-availability.ts", + "ui/src/lib/text-direction.ts", + "ui/src/lib/toast.ts", + "ui/src/lib/uuid.ts", + "ui/src/lib/widget-theme.ts", + "ui/src/lib/workboard/board-filter.ts", + "ui/src/lib/workboard/board-presentation.ts", + "ui/src/lib/workboard/capability.ts", + "ui/src/lib/workboard/card-state.ts", + "ui/src/lib/workboard/runtime.ts", + "ui/src/lit/openclaw-element.ts", + "ui/src/lit/poll-controller.ts", + "ui/src/lit/subscriptions-controller.ts", + "ui/src/local-storage.ts", + "ui/src/main.ts", + "ui/src/pages/about/route.ts", + "ui/src/pages/activity/route.ts", + "ui/src/pages/agents/route-location.ts", + "ui/src/pages/agents/route.ts", + "ui/src/pages/approvals/route.ts", + "ui/src/pages/apps/route.ts", + "ui/src/pages/channels/route.ts", + "ui/src/pages/chat/attachment-api.ts", + "ui/src/pages/chat/attachment-payload-store.ts", + "ui/src/pages/chat/board-session-surface.ts", + "ui/src/pages/chat/browser-annotation-admission.ts", + "ui/src/pages/chat/browser-annotation-context.ts", + "ui/src/pages/chat/browser-annotation-removal.ts", + "ui/src/pages/chat/catalog-message-id.ts", + "ui/src/pages/chat/chat-agent-id.ts", + "ui/src/pages/chat/chat-agent-run-grouping.ts", + "ui/src/pages/chat/chat-avatar.ts", + "ui/src/pages/chat/chat-board-face-persistence.ts", + "ui/src/pages/chat/chat-canonical-location.ts", + "ui/src/pages/chat/chat-command-executor.ts", + "ui/src/pages/chat/chat-commands.ts", + "ui/src/pages/chat/chat-composer-capability-host.ts", + "ui/src/pages/chat/chat-composer-memory-fallback.ts", + "ui/src/pages/chat/chat-gateway.ts", + "ui/src/pages/chat/chat-history-retry.ts", + "ui/src/pages/chat/chat-history.ts", + "ui/src/pages/chat/chat-message-access.ts", + "ui/src/pages/chat/chat-model-setup.ts", + "ui/src/pages/chat/chat-observer-display.ts", + "ui/src/pages/chat/chat-observer.ts", + "ui/src/pages/chat/chat-outbox-drain.ts", + "ui/src/pages/chat/chat-outbox-owner.ts", + "ui/src/pages/chat/chat-outbox-retry.ts", + "ui/src/pages/chat/chat-page-pane-render.ts", + "ui/src/pages/chat/chat-page-retained-sessions.ts", + "ui/src/pages/chat/chat-page.ts", + "ui/src/pages/chat/chat-pane-attachment-handoff.ts", + "ui/src/pages/chat/chat-pane-base.ts", + "ui/src/pages/chat/chat-pane-board.ts", + "ui/src/pages/chat/chat-pane-browser-annotation-render.ts", + "ui/src/pages/chat/chat-pane-browser-annotation.ts", + "ui/src/pages/chat/chat-pane-context.ts", + "ui/src/pages/chat/chat-pane-discussion.ts", + "ui/src/pages/chat/chat-pane-embedded-panels.ts", + "ui/src/pages/chat/chat-pane-header.ts", + "ui/src/pages/chat/chat-pane-history.ts", + "ui/src/pages/chat/chat-pane-layout-render.ts", + "ui/src/pages/chat/chat-pane-lifecycle.ts", + "ui/src/pages/chat/chat-pane-placement.ts", + "ui/src/pages/chat/chat-pane-rails.ts", + "ui/src/pages/chat/chat-pane-render.ts", + "ui/src/pages/chat/chat-pane-reply-navigation.ts", + "ui/src/pages/chat/chat-pane-retained-presentation.ts", + "ui/src/pages/chat/chat-pane-session-controls.ts", + "ui/src/pages/chat/chat-pane-session-creation.ts", + "ui/src/pages/chat/chat-pane-session-menu.ts", + "ui/src/pages/chat/chat-pane-session-panel-toggle.ts", + "ui/src/pages/chat/chat-pane-session.ts", + "ui/src/pages/chat/chat-pane-shared.ts", + "ui/src/pages/chat/chat-pane-sharing.ts", + "ui/src/pages/chat/chat-pane-sidebar-layout.ts", + "ui/src/pages/chat/chat-pane-startup-subscriptions.ts", + "ui/src/pages/chat/chat-pane-state.ts", + "ui/src/pages/chat/chat-pane-task-suggestions.ts", + "ui/src/pages/chat/chat-pane.ts", + "ui/src/pages/chat/chat-progress.ts", + "ui/src/pages/chat/chat-queue.ts", + "ui/src/pages/chat/chat-realtime.ts", + "ui/src/pages/chat/chat-reset-delivery.ts", + "ui/src/pages/chat/chat-run-startup.ts", + "ui/src/pages/chat/chat-send-ack.ts", + "ui/src/pages/chat/chat-send-actions.ts", + "ui/src/pages/chat/chat-send-composer.ts", + "ui/src/pages/chat/chat-send-delivery.ts", + "ui/src/pages/chat/chat-send-queue-state.ts", + "ui/src/pages/chat/chat-send-request.ts", + "ui/src/pages/chat/chat-send-submit.ts", + "ui/src/pages/chat/chat-send-support.ts", + "ui/src/pages/chat/chat-send-timing.ts", + "ui/src/pages/chat/chat-session-action-access.ts", + "ui/src/pages/chat/chat-session-companion.ts", + "ui/src/pages/chat/chat-session.ts", + "ui/src/pages/chat/chat-settings-patches.ts", + "ui/src/pages/chat/chat-state-controller.ts", + "ui/src/pages/chat/chat-state-events.ts", + "ui/src/pages/chat/chat-state-page.ts", + "ui/src/pages/chat/chat-state-refresh.ts", + "ui/src/pages/chat/chat-state-render.ts", + "ui/src/pages/chat/chat-state-route.ts", + "ui/src/pages/chat/chat-submit-guard.ts", + "ui/src/pages/chat/chat-thread-build.ts", + "ui/src/pages/chat/chat-thread-grouping.ts", + "ui/src/pages/chat/chat-thread-items.ts", + "ui/src/pages/chat/chat-thread-run-identity.ts", + "ui/src/pages/chat/chat-thread.ts", + "ui/src/pages/chat/chat-turn-boundary.ts", + "ui/src/pages/chat/chat-typing-presence.ts", + "ui/src/pages/chat/chat-view-notices.ts", + "ui/src/pages/chat/chat-view-state.ts", + "ui/src/pages/chat/chat-view.ts", + "ui/src/pages/chat/chat-viewer-presence.ts", + "ui/src/pages/chat/components/chat-agent-run-frame.ts", + "ui/src/pages/chat/components/chat-attachment-admission.ts", + "ui/src/pages/chat/components/chat-attachment-href.ts", + "ui/src/pages/chat/components/chat-attachments.ts", + "ui/src/pages/chat/components/chat-audio-coordinator.ts", + "ui/src/pages/chat/components/chat-audio-player.ts", + "ui/src/pages/chat/components/chat-audio-waveform.ts", + "ui/src/pages/chat/components/chat-author-avatar.ts", + "ui/src/pages/chat/components/chat-background-task-row.ts", + "ui/src/pages/chat/components/chat-background-tasks-render.ts", + "ui/src/pages/chat/components/chat-background-tasks-shared.ts", + "ui/src/pages/chat/components/chat-background-tasks-status.ts", + "ui/src/pages/chat/components/chat-background-tasks.ts", + "ui/src/pages/chat/components/chat-composer-context.ts", + "ui/src/pages/chat/components/chat-composer-controls.ts", + "ui/src/pages/chat/components/chat-composer-dom.ts", + "ui/src/pages/chat/components/chat-composer-goal.ts", + "ui/src/pages/chat/components/chat-composer-keydown.ts", + "ui/src/pages/chat/components/chat-composer-plus-menu.ts", + "ui/src/pages/chat/components/chat-composer-queue.ts", + "ui/src/pages/chat/components/chat-composer-skill-menu.ts", + "ui/src/pages/chat/components/chat-composer-slash-menu.ts", + "ui/src/pages/chat/components/chat-composer-state.ts", + "ui/src/pages/chat/components/chat-composer-status.ts", + "ui/src/pages/chat/components/chat-composer-view.ts", + "ui/src/pages/chat/components/chat-composer.ts", + "ui/src/pages/chat/components/chat-context-window-control.ts", + "ui/src/pages/chat/components/chat-detail-panel.ts", + "ui/src/pages/chat/components/chat-detail-slot.ts", + "ui/src/pages/chat/components/chat-diff-render.ts", + "ui/src/pages/chat/components/chat-divider.ts", + "ui/src/pages/chat/components/chat-effort-picker.ts", + "ui/src/pages/chat/components/chat-header-session-menu.ts", + "ui/src/pages/chat/components/chat-image-lightbox.ts", + "ui/src/pages/chat/components/chat-media-playback.ts", + "ui/src/pages/chat/components/chat-media-source.ts", + "ui/src/pages/chat/components/chat-message-attachment-availability.ts", + "ui/src/pages/chat/components/chat-message-attachment-status.ts", + "ui/src/pages/chat/components/chat-message-attachments.ts", + "ui/src/pages/chat/components/chat-message-bubble.ts", + "ui/src/pages/chat/components/chat-message-confirmation.ts", + "ui/src/pages/chat/components/chat-message-document-preview.ts", + "ui/src/pages/chat/components/chat-message-group.ts", + "ui/src/pages/chat/components/chat-message-image-open.ts", + "ui/src/pages/chat/components/chat-message-images.ts", + "ui/src/pages/chat/components/chat-message-local-media.ts", + "ui/src/pages/chat/components/chat-message-markdown.ts", + "ui/src/pages/chat/components/chat-message-media.ts", + "ui/src/pages/chat/components/chat-message-stream.ts", + "ui/src/pages/chat/components/chat-message-timestamp.ts", + "ui/src/pages/chat/components/chat-message.ts", + "ui/src/pages/chat/components/chat-model-controls.ts", + "ui/src/pages/chat/components/chat-model-picker-options.ts", + "ui/src/pages/chat/components/chat-model-picker.ts", + "ui/src/pages/chat/components/chat-pane-header.ts", + "ui/src/pages/chat/components/chat-pane-placement.ts", + "ui/src/pages/chat/components/chat-permission-picker.ts", + "ui/src/pages/chat/components/chat-picker-overlay.ts", + "ui/src/pages/chat/components/chat-pull-requests.ts", + "ui/src/pages/chat/components/chat-question-card.ts", + "ui/src/pages/chat/components/chat-read-only-transcript.ts", + "ui/src/pages/chat/components/chat-realtime-controls.ts", + "ui/src/pages/chat/components/chat-resizable-divider.ts", + "ui/src/pages/chat/components/chat-selection-popup.ts", + "ui/src/pages/chat/components/chat-session-sharing.ts", + "ui/src/pages/chat/components/chat-session-suggestions.ts", + "ui/src/pages/chat/components/chat-session-workspace-rail.ts", + "ui/src/pages/chat/components/chat-session-workspace-state.ts", + "ui/src/pages/chat/components/chat-session-workspace.ts", + "ui/src/pages/chat/components/chat-sidebar-content.ts", + "ui/src/pages/chat/components/chat-sidebar-editor-menu.ts", + "ui/src/pages/chat/components/chat-sidebar-file-view.ts", + "ui/src/pages/chat/components/chat-sidebar.ts", + "ui/src/pages/chat/components/chat-subagent-activity.ts", + "ui/src/pages/chat/components/chat-swarm-progress.ts", + "ui/src/pages/chat/components/chat-task-detail-state.ts", + "ui/src/pages/chat/components/chat-task-detail.ts", + "ui/src/pages/chat/components/chat-task-suggestions.ts", + "ui/src/pages/chat/components/chat-thread-interactions.ts", + "ui/src/pages/chat/components/chat-thread.ts", + "ui/src/pages/chat/components/chat-tool-cards.ts", + "ui/src/pages/chat/components/chat-transcript-announcement.ts", + "ui/src/pages/chat/components/chat-transcript-controller.ts", + "ui/src/pages/chat/components/chat-transcript-interaction-anchor.ts", + "ui/src/pages/chat/components/chat-transcript-projection.ts", + "ui/src/pages/chat/components/chat-transcript-range.ts", + "ui/src/pages/chat/components/chat-transcript-render-guard.ts", + "ui/src/pages/chat/components/chat-transcript-scroll-margin.ts", + "ui/src/pages/chat/components/chat-typing-indicator.ts", + "ui/src/pages/chat/components/chat-video-player.ts", + "ui/src/pages/chat/components/chat-voice-activity.ts", + "ui/src/pages/chat/components/chat-welcome.ts", + "ui/src/pages/chat/components/chat-working-indicator-surprise.ts", + "ui/src/pages/chat/components/chat-working-indicator.ts", + "ui/src/pages/chat/components/chat-workspace-conflict.ts", + "ui/src/pages/chat/components/continue-in-terminal-dialog.ts", + "ui/src/pages/chat/components/session-diff-menus.ts", + "ui/src/pages/chat/components/session-diff-panel.ts", + "ui/src/pages/chat/components/session-diff-render.ts", + "ui/src/pages/chat/components/widget-card.ts", + "ui/src/pages/chat/components/widget-export.ts", + "ui/src/pages/chat/composer-dictation.ts", + "ui/src/pages/chat/composer-persistence.ts", + "ui/src/pages/chat/connect-error.ts", + "ui/src/pages/chat/continue-in-terminal-command.ts", + "ui/src/pages/chat/durable-composer-persistence.ts", + "ui/src/pages/chat/export.ts", + "ui/src/pages/chat/history-merge.ts", + "ui/src/pages/chat/initial-turn-handoff.ts", + "ui/src/pages/chat/input-history.ts", + "ui/src/pages/chat/link-favicon-loader.ts", + "ui/src/pages/chat/models.ts", + "ui/src/pages/chat/performance.ts", + "ui/src/pages/chat/queued-message-edit.ts", + "ui/src/pages/chat/realtime-talk-audio.ts", + "ui/src/pages/chat/realtime-talk-camera-controller.ts", + "ui/src/pages/chat/realtime-talk-conversation.ts", + "ui/src/pages/chat/realtime-talk-gateway-relay.ts", + "ui/src/pages/chat/realtime-talk-google-live-lifecycle.ts", + "ui/src/pages/chat/realtime-talk-google-live-tools.ts", + "ui/src/pages/chat/realtime-talk-google-live.ts", + "ui/src/pages/chat/realtime-talk-input.ts", + "ui/src/pages/chat/realtime-talk-level.ts", + "ui/src/pages/chat/realtime-talk-shared.ts", + "ui/src/pages/chat/realtime-talk-transcript-owner.ts", + "ui/src/pages/chat/realtime-talk-video.ts", + "ui/src/pages/chat/realtime-talk-webrtc-support.ts", + "ui/src/pages/chat/realtime-talk-webrtc.ts", + "ui/src/pages/chat/realtime-talk.ts", + "ui/src/pages/chat/route-draft-focus-handoff.ts", + "ui/src/pages/chat/route-draft.ts", + "ui/src/pages/chat/route-loader-short-cache.ts", + "ui/src/pages/chat/route-loader-short-list-fallback.ts", + "ui/src/pages/chat/route-loader-short-resolve.ts", + "ui/src/pages/chat/route-loader.ts", + "ui/src/pages/chat/route.ts", + "ui/src/pages/chat/run-lifecycle.ts", + "ui/src/pages/chat/scroll.ts", + "ui/src/pages/chat/session-cache.ts", + "ui/src/pages/chat/session-message-apply.ts", + "ui/src/pages/chat/session-message-cache.ts", + "ui/src/pages/chat/session-prefetch.ts", + "ui/src/pages/chat/session-snapshot-database.ts", + "ui/src/pages/chat/session-snapshot-invalidation-events.ts", + "ui/src/pages/chat/session-snapshot-invalidation.runtime.ts", + "ui/src/pages/chat/session-snapshot-invalidation.ts", + "ui/src/pages/chat/session-snapshot-store.ts", + "ui/src/pages/chat/sidebar-layout-legacy-migration.ts", + "ui/src/pages/chat/sidebar-layout-normalize.ts", + "ui/src/pages/chat/sidebar-layout-persistence.ts", + "ui/src/pages/chat/sidebar-layout.ts", + "ui/src/pages/chat/split-drop-zone.ts", + "ui/src/pages/chat/split-layout-persistence.ts", + "ui/src/pages/chat/split-layout.ts", + "ui/src/pages/chat/stream-causal-boundary.ts", + "ui/src/pages/chat/stream-reconciliation.ts", + "ui/src/pages/chat/stream-segment-pruning.ts", + "ui/src/pages/chat/system-notice-kinds.ts", + "ui/src/pages/chat/terminal-message-identity.ts", + "ui/src/pages/chat/tool-stream-identity.ts", + "ui/src/pages/chat/tool-stream.ts", + "ui/src/pages/chat/tool-titles.ts", + "ui/src/pages/chat/user-message-content.ts", + "ui/src/pages/chat/workspace-conflict.ts", + "ui/src/pages/cloud-workers/route.ts", + "ui/src/pages/config/route-data.ts", + "ui/src/pages/config/route.ts", + "ui/src/pages/config/settings-targets.ts", + "ui/src/pages/connection/route.ts", + "ui/src/pages/cron/route.ts", + "ui/src/pages/custodian/route.ts", + "ui/src/pages/dashboards/route.ts", + "ui/src/pages/debug/debug-overlay-contract.ts", + "ui/src/pages/debug/route.ts", + "ui/src/pages/devices/route.ts", + "ui/src/pages/labs/route.ts", + "ui/src/pages/lobsterdex/route.ts", + "ui/src/pages/logs/route.ts", + "ui/src/pages/memory-import/route.ts", + "ui/src/pages/model-providers/route.ts", + "ui/src/pages/model-setup/detect-cache.ts", + "ui/src/pages/model-setup/first-run.ts", + "ui/src/pages/model-setup/route.ts", + "ui/src/pages/model-setup/rpc.ts", + "ui/src/pages/model-setup/state.ts", + "ui/src/pages/new-session/cloud-profile-discovery.ts", + "ui/src/pages/new-session/cloud-target.ts", + "ui/src/pages/new-session/discovery.ts", + "ui/src/pages/new-session/location.ts", + "ui/src/pages/new-session/route.ts", + "ui/src/pages/plugin/route.ts", + "ui/src/pages/plugins/icon-loader.ts", + "ui/src/pages/plugins/route-data.ts", + "ui/src/pages/plugins/route.ts", + "ui/src/pages/portals/route.ts", + "ui/src/pages/profile/route.ts", + "ui/src/pages/secrets/route.ts", + "ui/src/pages/sessions/route.ts", + "ui/src/pages/skill-workshop/route.ts", + "ui/src/pages/skills/route.ts", + "ui/src/pages/tasks/route.ts", + "ui/src/pages/usage/request-usage-snapshot.ts", + "ui/src/pages/usage/route.ts", + "ui/src/pages/workboard/board-filter.ts", + "ui/src/pages/workboard/route-location.ts", + "ui/src/pages/workboard/route.ts", + "ui/src/pages/worktrees/route.ts", + "ui/src/styles/chat.css", + "ui/src/styles/lobster-pet.css", + "ui/src/styles/sidebar-footer-update.css" +] diff --git a/ui/config/control-ui-chunking.ts b/ui/config/control-ui-chunking.ts index e8548fdad412..1212eaeeabe3 100644 --- a/ui/config/control-ui-chunking.ts +++ b/ui/config/control-ui-chunking.ts @@ -1,8 +1,36 @@ // Control UI config module wires control ui chunking behavior. +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const configDir = path.dirname(fileURLToPath(import.meta.url)); +const repoRoot = path.resolve(configDir, "../.."); +// Measured module set the default boot flow (app shell + sidebar + chat route) +// loads through dynamic imports. Regenerate with `pnpm ui:boot-manifest:gen` +// after a build; stale entries degrade gracefully back to automatic chunking. +const controlUiBootModules: ReadonlySet = new Set( + JSON.parse( + fs.readFileSync(path.join(configDir, "control-ui-boot-modules.json"), "utf8"), + ) as string[], +); + function normalizeModuleId(id: string): string { return id.replace(/\\/g, "/"); } +export function controlUiBootManifestKey(id: string): string { + // Canonical manifest key: vendor modules key from their innermost + // node_modules entry so pnpm virtual-store paths match; first-party modules + // key repo-relative. + const stripped = id.replace(/[?#].*$/u, ""); + const normalized = normalizeModuleId(stripped); + const vendorIndex = normalized.lastIndexOf("/node_modules/"); + if (vendorIndex !== -1) { + return `node_modules/${normalized.slice(vendorIndex + "/node_modules/".length)}`; + } + return normalizeModuleId(path.relative(repoRoot, stripped)); +} + function moduleIdIncludesPackage(id: string, packageName: string): boolean { const normalized = normalizeModuleId(id); return ( @@ -74,5 +102,23 @@ export const controlUiCodeSplitting = { // split it into two extra requests and added roughly 1 KiB of gzip. maxSize: 640 * 1024, }, + { + // Boot-path consolidation: the lazily-loaded modules the default boot + // flow always fetches (~124 automatic chunks without this group) merge + // into a handful of chunks so the gateway's HTTP/1.1 6-connection + // transport pays ~7 instead of ~24 serialized round-trips on high-latency + // links. Byte cost is ~zero: every captured module is fetched during boot + // either way. Recursive dependency inclusion is required for correctness + // here — merging without it emitted chunks whose execution order broke at + // startup ("TypeError: X is not a function" during application start). + name: "control-ui-boot", + test: (id: string) => controlUiBootModules.has(controlUiBootManifestKey(id)), + priority: 8, + includeDependenciesRecursively: true, + // Larger ceiling than the startup groups: this sizes pre-minification + // module bytes, and ~1.5 MiB keeps the largest emitted chunk near + // ~190 KiB gzip, inside the 215 KiB largest-JS budget. + maxSize: 1536 * 1024, + }, ], }; diff --git a/ui/src/app/app-host.panel-toggles.test.ts b/ui/src/app/app-host.panel-toggles.test.ts index 1bf722853bed..88b7858c176b 100644 --- a/ui/src/app/app-host.panel-toggles.test.ts +++ b/ui/src/app/app-host.panel-toggles.test.ts @@ -50,6 +50,13 @@ function configureTerminalShell(terminalElement: TestOptionalCustomElement): She configurable: true, get: () => Promise.resolve(true), }); + // The production shell keeps panel tags mounted before definition; replay is + // gated on the rendered element, so the harness mounts the tag the same way. + Object.defineProperty(shell, "renderRoot", { + configurable: true, + get: () => shell, + }); + (shell as unknown as HTMLElement).appendChild(document.createElement(terminalElement.tagName)); return shell; } diff --git a/ui/src/app/app-host.test-support.ts b/ui/src/app/app-host.test-support.ts index bb7e901fdfd6..db17e76efd8d 100644 --- a/ui/src/app/app-host.test-support.ts +++ b/ui/src/app/app-host.test-support.ts @@ -44,3 +44,15 @@ export function createLazyElementSpec( }, }; } + +/** + * Replay is gated on the rendered element; harnesses that model "rendered as + * soon as the module defines the tag" install this stub on the fake shell. + */ +export function stubRenderedWhenDefined(shell: object): void { + Object.defineProperty(shell, "queryRenderedElement", { + configurable: true, + value: (tagName: string) => + customElements.get(tagName) ? document.createElement(tagName) : null, + }); +} diff --git a/ui/src/app/app-host.test.ts b/ui/src/app/app-host.test.ts index 1dbb1e28a4a8..49c24d0242ad 100644 --- a/ui/src/app/app-host.test.ts +++ b/ui/src/app/app-host.test.ts @@ -22,6 +22,7 @@ import { resetAppHostTestGlobals, type ShellKeyboardState, type TestOptionalCustomElement, + stubRenderedWhenDefined, } from "./app-host.test-support.ts"; import { ShellGatewayOwner, type ShellGatewayHost } from "./app-shell-gateway.ts"; import type { @@ -890,16 +891,9 @@ describe("OpenClaw shell keyboard shortcuts", () => { it("normalizes an unloaded palette toggle shortcut to open", async () => { const element = createLazyElementSpec("command palette"); - const shell = document.createElement("openclaw-app-shell") as unknown as ShellLazySurfaceState; - shell.commandPaletteElement = element; const openPalette = vi.fn(); - Object.defineProperty(shell, "updateComplete", { get: () => Promise.resolve(true) }); - Object.defineProperty(shell, "commandPalette", { - get: () => - customElements.get(element.tagName) - ? { isOpen: false, openPalette, togglePalette: vi.fn() } - : undefined, - }); + const shell = configureLazyPaletteShell(element, openPalette); + stubRenderedWhenDefined(shell); const event = new KeyboardEvent("keydown", { key: "л", code: "KeyK", diff --git a/ui/src/app/app-host.ts b/ui/src/app/app-host.ts index 1e91f874dad6..9af237bdb6e6 100644 --- a/ui/src/app/app-host.ts +++ b/ui/src/app/app-host.ts @@ -162,6 +162,10 @@ class OpenClawShell () => hasStoredLazyShellAction() ? retryStaleChunkReloadWhenReachable() : Promise.resolve(false), ); + // Gates lazy-action replay on the element being rendered; while the shell is + // still splash-gated, replaying would loop through the open handlers forever. + readonly queryRenderedElement = (tagName: string): Element | null => + this.renderRoot?.querySelector(tagName) ?? null; @query("openclaw-command-palette") commandPalette: CommandPaletteElement | undefined; @query("openclaw-exec-approval") approvalOverlay: (HTMLElement & { show(): void; dialogOpen?: boolean }) | undefined; @@ -655,6 +659,9 @@ class OpenClawShell override updated() { this.syncDocumentTitle(); + // Render-gated pending lazy actions replay on the update that first + // renders their element, independent of further context updates. + this.restorePendingLazyAction(); if ( !customElements.get("openclaw-sidebar-update-card") && this.querySelector("openclaw-sidebar-update-card") diff --git a/ui/src/app/app-shell-chrome.ts b/ui/src/app/app-shell-chrome.ts index e566e841f662..e711c3df6165 100644 --- a/ui/src/app/app-shell-chrome.ts +++ b/ui/src/app/app-shell-chrome.ts @@ -629,14 +629,36 @@ export class ShellChromeOwner { } }; + private lazyElementForShellEvent(eventType: LazyShellEvent["eventType"]): OptionalCustomElement { + const host = this.host; + const elements: Record = { + [COMMAND_PALETTE_OPEN_EVENT]: host.commandPaletteElement, + [DEBUG_OVERLAY_REQUEST_EVENT]: DEBUG_OVERLAY_ELEMENT, + [KEYBOARD_SHORTCUTS_REQUEST_EVENT]: KEYBOARD_SHORTCUTS_ELEMENT, + [TERMINAL_PANEL_TOGGLE_EVENT]: host.terminalPanelElement, + [BROWSER_PANEL_TOGGLE_EVENT]: host.browserPanelElement, + [DESKTOP_PANEL_TOGGLE_EVENT]: host.desktopPanelElement, + [CUSTODIAN_PANEL_TOGGLE_EVENT]: host.custodianPanelElement, + [SHELL_APPROVALS_OPEN_EVENT]: host.execApprovalElement, + }; + return elements[eventType]; + } + restorePendingLazyAction(): void { const event = this.pendingLazyAction; - if ( - event && - !this.host.lazyCustomElements.visibleState && - this.dispatchLazyShellEvent(event) && - !this.host.lazyCustomElements.visibleState - ) { + if (!event || this.host.lazyCustomElements.visibleState) { + return; + } + const element = this.lazyElementForShellEvent(event.eventType); + if (isOptionalElementDefined(element) && !this.host.querySelector(element.tagName)) { + // Loaded but render-gated (e.g. the shell is still booting): nothing can + // consume the dispatch yet, and re-dispatching re-arms a request/update + // cycle whose microtasks starve the boot (Gateway socket included). + // The host retries after every completed update, so the replay fires on + // the update that first renders the element. + return; + } + if (this.dispatchLazyShellEvent(event) && !this.host.lazyCustomElements.visibleState) { this.clearPendingLazyAction(event); } } diff --git a/ui/src/app/control-ui-chunking.test.ts b/ui/src/app/control-ui-chunking.test.ts index 99ac00c304c0..91cbbbfc3293 100644 --- a/ui/src/app/control-ui-chunking.test.ts +++ b/ui/src/app/control-ui-chunking.test.ts @@ -1,6 +1,7 @@ // @vitest-environment node import { describe, expect, it } from "vitest"; import { + controlUiBootManifestKey, controlUiCodeSplitting, controlUiStableChunkName, } from "../../config/control-ui-chunking.ts"; @@ -49,6 +50,43 @@ describe("Control UI build chunking", () => { }); }); + it("consolidates the measured boot module set with recursive dependencies", () => { + // Recursive inclusion is a correctness requirement for this group: merging + // the lazy boot graph without it emitted chunks whose execution order broke + // at application start. + expect(controlUiCodeSplitting.groups[2]).toMatchObject({ + name: "control-ui-boot", + includeDependenciesRecursively: true, + }); + const bootGroup = controlUiCodeSplitting.groups[2] as { + test: (id: string) => boolean; + }; + const repoRoot = new URL("../../..", import.meta.url).pathname.replace(/\/$/, ""); + // Representative always-loaded boot surface and a lazy island that must + // keep its own chunk (terminal runtime is not part of the default boot). + expect(bootGroup.test(`${repoRoot}/ui/src/components/app-sidebar.ts`)).toBe(true); + expect(bootGroup.test(`${repoRoot}/node_modules/ghostty-web/dist/index.js`)).toBe(false); + }); + + it("derives stable manifest keys across pnpm layouts and platforms", () => { + expect( + controlUiBootManifestKey( + "/repo/node_modules/.pnpm/nanoid@5.0.0/node_modules/nanoid/index.browser.js", + ), + ).toBe("node_modules/nanoid/index.browser.js"); + expect( + controlUiBootManifestKey( + "/repo/node_modules/@awesome.me/webawesome/node_modules/nanoid/index.browser.js", + ), + ).toBe("node_modules/nanoid/index.browser.js"); + expect(controlUiBootManifestKey("/repo/ui/src/main.ts?html-proxy&index=0.js")).not.toContain( + "?", + ); + expect(controlUiBootManifestKey(String.raw`C:\repo\node_modules\nanoid\index.browser.js`)).toBe( + "node_modules/nanoid/index.browser.js", + ); + }); + it("normalizes Windows module paths before package matching", () => { expect( controlUiStableChunkName(String.raw`C:\repo\ui\node_modules\highlight.js\lib\core.js`), diff --git a/ui/src/app/device-scope-upgrade-registration.ts b/ui/src/app/device-scope-upgrade-registration.ts index 12ba1f42549d..c3fffd796518 100644 --- a/ui/src/app/device-scope-upgrade-registration.ts +++ b/ui/src/app/device-scope-upgrade-registration.ts @@ -158,9 +158,34 @@ class ScopeUpgradeSurface extends OpenClawLightDomContentsElement { this.reopenAfterClose = true; return; } + void this.openDetails(); + }; + + private async openDetails(): Promise { + if (!this.props?.mobile) { + await this.ensureDetailsPopoverAnchored(); + } this.detailsOpen = true; this.requestUpdate(); - }; + } + + private async ensureDetailsPopoverAnchored(): Promise { + const popover = this.querySelector< + HTMLElement & { anchor?: Element | null; for?: string; updateComplete?: Promise } + >("wa-popover.scope-upgrade-details-popover"); + if (!popover || popover.anchor?.isConnected) { + return; + } + // wa-popover resolves `for` only when the property changes and never + // re-resolves a missing or replaced anchor. The trigger with this id can + // render after the popover's first update (the header trigger ships with + // the lazy chat chunk), which would leave the opened popover permanently + // invisible. Re-arm the watcher so it re-runs the id lookup now. + popover.for = ""; + await popover.updateComplete; + popover.for = SCOPE_UPGRADE_TRIGGER_ID; + await popover.updateComplete; + } private readonly showDetailsFromTrigger = (event: Event) => { if (!this.props?.mobile) { diff --git a/ui/src/app/lazy-custom-element.test.ts b/ui/src/app/lazy-custom-element.test.ts index 09abb362aedf..d3772a46a9b6 100644 --- a/ui/src/app/lazy-custom-element.test.ts +++ b/ui/src/app/lazy-custom-element.test.ts @@ -101,6 +101,38 @@ describe("optional custom element requests", () => { expect(requests.visibleState).toBeUndefined(); }); + it("skips the action replay while the host has not rendered the element", async () => { + // Regression: replaying while the shell is still splash-gated re-dispatches + // an event nothing handles, which re-enters the controller in a microtask + // cycle that starves the boot (Gateway socket included). + const requestUpdate = vi.fn(); + const rendered = new Map(); + const host = { + requestUpdate, + updateComplete: Promise.resolve(true), + queryRenderedElement: (tagName: string) => rendered.get(tagName) ?? null, + }; + const requests = new LazyCustomElementRequestController(host, undefined, async () => false); + const action = vi.fn(); + const tagName = uniqueTag(); + const element = { + tagName, + label: "test panel", + loadModule: async () => { + customElements.define(tagName, class extends HTMLElement {}); + }, + }; + + requests.request(element, action); + await waitForFast(() => expect(requests.visibleState).toBeUndefined()); + expect(action).not.toHaveBeenCalled(); + + rendered.set(tagName, document.createElement(tagName)); + requests.request(element, action); + await waitForFast(() => expect(action).toHaveBeenCalledOnce()); + expect(requests.visibleState).toBeUndefined(); + }); + it("resumes an active request after a foreground request replaces its visible slot", async () => { let rejectActive: ((error: Error) => void) | undefined; let resolveForeground: (() => void) | undefined; diff --git a/ui/src/app/lazy-custom-element.ts b/ui/src/app/lazy-custom-element.ts index 7f95580a44da..db3428683581 100644 --- a/ui/src/app/lazy-custom-element.ts +++ b/ui/src/app/lazy-custom-element.ts @@ -42,6 +42,11 @@ export type OptionalCustomElement = { type UpdatingHost = { requestUpdate: () => unknown; readonly updateComplete?: Promise; + /** + * Render-root lookup used to gate action replay on the element actually + * being rendered. Hosts without it replay unconditionally. + */ + queryRenderedElement?: (tagName: string) => Element | null; }; type LazyCustomElementRequestState = @@ -182,7 +187,19 @@ export class LazyCustomElementRequestController { this.host.requestUpdate(); await this.host.updateComplete; if (this.current === request) { - request.action?.(); + // Replay only once the host has actually rendered the element. + // During boot the shell can still be splash-gated after this update; + // replaying then re-dispatches an event nothing handles, which + // re-enters this controller in a microtask cycle that starves the + // render (and the Gateway socket) forever. The skipped action stays + // persisted as the pending lazy shell action and replays through + // restorePendingLazyAction on a later context update. + const replayable = + !this.host.queryRenderedElement || + this.host.queryRenderedElement(request.element.tagName) !== null; + if (replayable) { + request.action?.(); + } if (this.current === request) { this.abandon(); } diff --git a/ui/src/app/lazy-shell-action.test.ts b/ui/src/app/lazy-shell-action.test.ts index ef2ad8f66e12..fc01f7ddf405 100644 --- a/ui/src/app/lazy-shell-action.test.ts +++ b/ui/src/app/lazy-shell-action.test.ts @@ -12,6 +12,7 @@ import { resetAppHostTestGlobals, type ShellKeyboardState, type TestOptionalCustomElement, + stubRenderedWhenDefined, } from "./app-host.test-support.ts"; import "./app-host.ts"; import { DEBUG_OVERLAY_ELEMENT, KEYBOARD_SHORTCUTS_ELEMENT } from "./lazy-custom-element.ts"; @@ -153,6 +154,7 @@ describe("shell lazy events", () => { Object.defineProperty(shell, "approvalOverlay", { get: () => (customElements.get(element.tagName) ? { show } : undefined), }); + stubRenderedWhenDefined(shell); await withConnectedShell(shell, async () => { shell.openApprovals(); diff --git a/ui/src/e2e/device-scope-upgrade.e2e.test.ts b/ui/src/e2e/device-scope-upgrade.e2e.test.ts index 2b7a3847dd12..5c213ea6374d 100644 --- a/ui/src/e2e/device-scope-upgrade.e2e.test.ts +++ b/ui/src/e2e/device-scope-upgrade.e2e.test.ts @@ -254,6 +254,19 @@ describeControlUiE2e("Control UI live device scope upgrade", () => { expect( await mobile.page.locator(".content > openclaw-device-scope-upgrade-banner").count(), ).toBe(0); + // Burn in the one-time dialog open: its first render fetches glyph + // subsets whose arrival reflows fractional text metrics document-wide, + // which would otherwise register as sub-pixel drift the open never + // caused. The stability assertion below compares settled layouts. + await status.click(); + await mobile.page.locator("openclaw-modal-dialog.scope-upgrade-details-dialog").waitFor(); + await mobile.page.getByRole("button", { name: "Close limited access details" }).click(); + await mobile.page + .locator("openclaw-modal-dialog.scope-upgrade-details-dialog") + .waitFor({ state: "detached" }); + await status.waitFor(); + await mobile.page.evaluate(() => document.fonts.ready); + const titleTopBefore = (await title.boundingBox())?.y; await captureProof(mobile.page, "mobile-automations-shell-status.png"); @@ -309,6 +322,14 @@ describeControlUiE2e("Control UI live device scope upgrade", () => { const status = desktop.page.locator(".scope-upgrade-shell-status"); await title.waitFor(); await status.waitFor(); + // Same burn-in as the mobile section: the first popover render fetches + // glyph subsets whose arrival reflows fractional text metrics. + await status.click(); + await desktop.page.locator(".scope-upgrade-details-popover").waitFor(); + await desktop.page.getByRole("button", { name: "Close limited access details" }).click(); + await status.waitFor(); + await desktop.page.evaluate(() => document.fonts.ready); + const titleTopBefore = (await title.boundingBox())?.y; await captureProof(desktop.page, "desktop-automations-shell-status.png");