From ef12b74c4a55b425310fe85bd70d4c71399be130 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sat, 21 Feb 2026 01:59:11 -0500 Subject: [PATCH] Chore: fix a2ui bundling after root lit dependency removal --- CHANGELOG.md | 1 + .../Tools/CanvasA2UI/rolldown.config.mjs | 25 ++++++++--- pnpm-lock.yaml | 41 +++++++++++++++++++ scripts/bundle-a2ui.sh | 9 ++++ ui/package.json | 4 ++ 5 files changed, 74 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6304302008e..59fbc94c178 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ Docs: https://docs.openclaw.ai - Dev tooling: remove unused root devDependencies `@lit/context` and `@lit-labs/signals` flagged as unused by Knip dead-code reports. (#22471) Thanks @vincentkoc. - Dev tooling: remove unused root dependency `lit` that is now scoped to `ui/` package dependencies. (#22471) Thanks @vincentkoc. - Dev tooling: remove unused root dependencies `long` and `rolldown`; keep A2UI bundling functional by falling back to `pnpm dlx rolldown` when the binary is not locally installed. (#22481) Thanks @vincentkoc. +- Dev tooling: fix A2UI bundle resolution for removed root `lit` deps by resolving `lit`, `@lit/context`, `@lit-labs/signals`, and `signal-utils` from UI workspace dependencies in `rolldown.config.mjs` during bundling. (#22481) Thanks @vincentkoc. - Agents/Subagents: default subagent spawn depth now uses shared `maxSpawnDepth=2`, enabling depth-1 orchestrator spawning by default while keeping depth policy checks consistent across spawn and prompt paths. (#22223) Thanks @tyler6204. - Channels/CLI: add per-account/channel `defaultTo` outbound routing fallback so `openclaw agent --deliver` can send without explicit `--reply-to` when a default target is configured. (#16985) Thanks @KirillShchetinin. - iOS/Chat: clean chat UI noise by stripping inbound untrusted metadata/timestamp prefixes, formatting tool outputs into concise summaries/errors, compacting the composer while typing, and supporting tap-to-dismiss keyboard in chat view. (#22122) thanks @mbelinky. diff --git a/apps/shared/OpenClawKit/Tools/CanvasA2UI/rolldown.config.mjs b/apps/shared/OpenClawKit/Tools/CanvasA2UI/rolldown.config.mjs index dbd4b86fff6..bd8677d5f0c 100644 --- a/apps/shared/OpenClawKit/Tools/CanvasA2UI/rolldown.config.mjs +++ b/apps/shared/OpenClawKit/Tools/CanvasA2UI/rolldown.config.mjs @@ -1,4 +1,5 @@ import path from "node:path"; +import { existsSync } from "node:fs"; import { fileURLToPath } from "node:url"; import { defineConfig } from "rolldown"; @@ -16,6 +17,17 @@ const outputFile = path.resolve( const a2uiLitDist = path.resolve(repoRoot, "vendor/a2ui/renderers/lit/dist/src"); const a2uiThemeContext = path.resolve(a2uiLitDist, "0.8/ui/context/theme.js"); +const a2uiNodeModules = path.resolve(repoRoot, "ui/node_modules"); +const rootNodeModules = path.resolve(repoRoot, "node_modules"); + +const resolveA2uiDep = (pkg, rel = "") => { + const uiPath = path.resolve(a2uiNodeModules, pkg, rel); + if (existsSync(uiPath)) { + return uiPath; + } + + return path.resolve(rootNodeModules, pkg, rel); +}; export default defineConfig({ input: fromHere("bootstrap.js"), @@ -28,12 +40,13 @@ export default defineConfig({ "@a2ui/lit": path.resolve(a2uiLitDist, "index.js"), "@a2ui/lit/ui": path.resolve(a2uiLitDist, "0.8/ui/ui.js"), "@openclaw/a2ui-theme-context": a2uiThemeContext, - "@lit/context": path.resolve(repoRoot, "node_modules/@lit/context/index.js"), - "@lit/context/": path.resolve(repoRoot, "node_modules/@lit/context/"), - "@lit-labs/signals": path.resolve(repoRoot, "node_modules/@lit-labs/signals/index.js"), - "@lit-labs/signals/": path.resolve(repoRoot, "node_modules/@lit-labs/signals/"), - lit: path.resolve(repoRoot, "node_modules/lit/index.js"), - "lit/": path.resolve(repoRoot, "node_modules/lit/"), + "@lit/context": resolveA2uiDep("@lit/context", "index.js"), + "@lit/context/": resolveA2uiDep("@lit/context"), + "@lit-labs/signals": resolveA2uiDep("@lit-labs/signals", "index.js"), + "@lit-labs/signals/": resolveA2uiDep("@lit-labs/signals"), + lit: resolveA2uiDep("lit", "index.js"), + "lit/": resolveA2uiDep("lit"), + "signal-utils/": resolveA2uiDep("signal-utils"), }, }, output: { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f6a5bcab9a4..e704fec7a8c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -555,6 +555,12 @@ importers: ui: dependencies: + '@lit-labs/signals': + specifier: ^0.1.3 + version: 0.1.3 + '@lit/context': + specifier: ^1.1.4 + version: 1.1.6 '@noble/ed25519': specifier: 3.0.0 version: 3.0.0 @@ -567,6 +573,12 @@ importers: marked: specifier: ^17.0.3 version: 17.0.3 + signal-polyfill: + specifier: ^0.2.2 + version: 0.2.2 + signal-utils: + specifier: ^0.21.1 + version: 0.21.1(signal-polyfill@0.2.2) vite: specifier: 7.3.1 version: 7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) @@ -1423,9 +1435,15 @@ packages: resolution: {integrity: sha512-4hSpglL/G/cW2JCcohaYz/BS0uOSJNV9IEYdMm0EiPEvDLayoI2hGq2D86uYPQFD2gvgkyhmzdShpWLG3P5r3w==} engines: {node: '>=20'} + '@lit-labs/signals@0.1.3': + resolution: {integrity: sha512-P0yWgH5blwVyEwBg+WFspLzeu1i0ypJP1QB0l1Omr9qZLIPsUu0p4Fy2jshOg7oQyha5n163K3GJGeUhQQ682Q==} + '@lit-labs/ssr-dom-shim@1.5.1': resolution: {integrity: sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==} + '@lit/context@1.1.6': + resolution: {integrity: sha512-M26qDE6UkQbZA2mQ3RjJ3Gzd8TxP+/0obMgE5HfkfLhEEyYE3Bui4A5XHiGPjy0MUGAyxB3QgVuw2ciS0kHn6A==} + '@lit/reactive-element@2.1.2': resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} @@ -5272,6 +5290,14 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + signal-polyfill@0.2.2: + resolution: {integrity: sha512-p63Y4Er5/eMQ9RHg0M0Y64NlsQKpiu6MDdhBXpyywRuWiPywhJTpKJ1iB5K2hJEbFZ0BnDS7ZkJ+0AfTuL37Rg==} + + signal-utils@0.21.1: + resolution: {integrity: sha512-i9cdLSvVH4j8ql8mz2lyrA93xL499P8wEbIev3ldSriXeUwqh+wM4Q5VPhIZ19gPtIS4BOopJuKB8l1+wH9LCg==} + peerDependencies: + signal-polyfill: ^0.2.0 + simple-git@3.31.1: resolution: {integrity: sha512-oiWP4Q9+kO8q9hHqkX35uuHmxiEbZNTrZ5IPxgMGrJwN76pzjm/jabkZO0ItEcqxAincqGAzL3QHSaHt4+knBg==} @@ -7208,8 +7234,17 @@ snapshots: transitivePeerDependencies: - debug + '@lit-labs/signals@0.1.3': + dependencies: + lit: 3.3.2 + signal-polyfill: 0.2.2 + '@lit-labs/ssr-dom-shim@1.5.1': {} + '@lit/context@1.1.6': + dependencies: + '@lit/reactive-element': 2.1.2 + '@lit/reactive-element@2.1.2': dependencies: '@lit-labs/ssr-dom-shim': 1.5.1 @@ -11449,6 +11484,12 @@ snapshots: signal-exit@4.1.0: {} + signal-polyfill@0.2.2: {} + + signal-utils@0.21.1(signal-polyfill@0.2.2): + dependencies: + signal-polyfill: 0.2.2 + simple-git@3.31.1: dependencies: '@kwsites/file-exists': 1.1.1 diff --git a/scripts/bundle-a2ui.sh b/scripts/bundle-a2ui.sh index ff85dd044f8..7ace9113f75 100755 --- a/scripts/bundle-a2ui.sh +++ b/scripts/bundle-a2ui.sh @@ -4,13 +4,16 @@ set -euo pipefail on_error() { echo "A2UI bundling failed. Re-run with: pnpm canvas:a2ui:bundle" >&2 echo "If this persists, verify pnpm deps and try again." >&2 + rm -f "$A2UI_VENDOR_NODE_MODULES" } trap on_error ERR +trap 'rm -f "$A2UI_VENDOR_NODE_MODULES"' EXIT ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" HASH_FILE="$ROOT_DIR/src/canvas-host/a2ui/.bundle.hash" OUTPUT_FILE="$ROOT_DIR/src/canvas-host/a2ui/a2ui.bundle.js" A2UI_RENDERER_DIR="$ROOT_DIR/vendor/a2ui/renderers/lit" +A2UI_VENDOR_NODE_MODULES="$A2UI_RENDERER_DIR/node_modules" A2UI_APP_DIR="$ROOT_DIR/apps/shared/OpenClawKit/Tools/CanvasA2UI" # Docker builds exclude vendor/apps via .dockerignore. @@ -24,6 +27,12 @@ if [[ ! -d "$A2UI_RENDERER_DIR" || ! -d "$A2UI_APP_DIR" ]]; then exit 1 fi +mkdir -p "$A2UI_RENDERER_DIR" +if [[ -L "$A2UI_VENDOR_NODE_MODULES" || -e "$A2UI_VENDOR_NODE_MODULES" ]]; then + rm -rf "$A2UI_VENDOR_NODE_MODULES" +fi +ln -s "$ROOT_DIR/ui/node_modules" "$A2UI_VENDOR_NODE_MODULES" + INPUT_PATHS=( "$ROOT_DIR/package.json" "$ROOT_DIR/pnpm-lock.yaml" diff --git a/ui/package.json b/ui/package.json index 14b4d42218b..bac33ae2471 100644 --- a/ui/package.json +++ b/ui/package.json @@ -9,10 +9,14 @@ "test": "vitest run --config vitest.config.ts" }, "dependencies": { + "@lit-labs/signals": "^0.1.3", + "@lit/context": "^1.1.4", "@noble/ed25519": "3.0.0", "dompurify": "^3.3.1", "lit": "^3.3.2", "marked": "^17.0.3", + "signal-polyfill": "^0.2.2", + "signal-utils": "^0.21.1", "vite": "7.3.1" }, "devDependencies": {