diff --git a/Cargo.lock b/Cargo.lock index a43aad5a..9ccdb0c3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2894,7 +2894,7 @@ dependencies = [ "libc", "log", "rustversion", - "windows-link 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "windows-link 0.1.3", "windows-result 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -7361,7 +7361,7 @@ dependencies = [ [[package]] name = "octosense-app-hub" version = "0.1.0" -source = "git+https://www.github.com/OctoSense-org/OctoSense-App-Hub?rev=8512be70b89b366e6d6ebf93e807188c4313c3c0#8512be70b89b366e6d6ebf93e807188c4313c3c0" +source = "git+https://www.github.com/OctoSense-org/OctoSense-App-Hub?rev=0f332112f0b5a379c5bb33790df74b21597190cf#0f332112f0b5a379c5bb33790df74b21597190cf" dependencies = [ "base64 0.22.1", "blake3", @@ -7377,7 +7377,7 @@ dependencies = [ [[package]] name = "octosense-app-hub-app" version = "0.1.0" -source = "git+https://www.github.com/OctoSense-org/OctoSense-App-Hub?rev=8512be70b89b366e6d6ebf93e807188c4313c3c0#8512be70b89b366e6d6ebf93e807188c4313c3c0" +source = "git+https://www.github.com/OctoSense-org/OctoSense-App-Hub?rev=0f332112f0b5a379c5bb33790df74b21597190cf#0f332112f0b5a379c5bb33790df74b21597190cf" dependencies = [ "makepad-app-module", "makepad-widgets", @@ -7405,7 +7405,7 @@ dependencies = [ [[package]] name = "octosense-app-policy" version = "0.1.0" -source = "git+https://www.github.com/OctoSense-org/OctoSense-App-Hub?rev=8512be70b89b366e6d6ebf93e807188c4313c3c0#8512be70b89b366e6d6ebf93e807188c4313c3c0" +source = "git+https://www.github.com/OctoSense-org/OctoSense-App-Hub?rev=0f332112f0b5a379c5bb33790df74b21597190cf#0f332112f0b5a379c5bb33790df74b21597190cf" dependencies = [ "blake3", "makepad-widgets", @@ -7426,7 +7426,7 @@ dependencies = [ [[package]] name = "octosense-appstore" version = "0.1.0" -source = "git+https://www.github.com/OctoSense-org/OctoSense-App-Hub?rev=8512be70b89b366e6d6ebf93e807188c4313c3c0#8512be70b89b366e6d6ebf93e807188c4313c3c0" +source = "git+https://www.github.com/OctoSense-org/OctoSense-App-Hub?rev=0f332112f0b5a379c5bb33790df74b21597190cf#0f332112f0b5a379c5bb33790df74b21597190cf" dependencies = [ "makepad-app-module", "makepad-widgets", @@ -10484,7 +10484,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.3", + "getrandom 0.3.4", "once_cell 1.21.4", "rustix", "windows-sys 0.61.2", diff --git a/Cargo.toml b/Cargo.toml index c4832fd8..197ca29e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -63,42 +63,42 @@ authors = ["octos-app contributors"] # BEGIN native-apps: pins (generated by tools/native_apps.py from native-apps.json; do not edit) rinx = { git = "https://github.com/hagency-org/Rinx.git", tag = "v1.0.0", default-features = false, features = ["octosense-module"] } octosense-reference = { path = "apps/reference" } -makepad-sheets = { git = "https://github.com/OctoSense-org/makepad.git", rev = "92a19b67218f8cd2361866c4554457b153766f48", default-features = false } -makepad-terminal = { git = "https://github.com/OctoSense-org/makepad.git", rev = "92a19b67218f8cd2361866c4554457b153766f48" } +makepad-sheets = { git = "https://github.com/OctoSense-org/makepad.git", rev = "1f3b1dedfbb81424eb8dbf69e5e2c634fa73dc54", default-features = false } +makepad-terminal = { git = "https://github.com/OctoSense-org/makepad.git", rev = "1f3b1dedfbb81424eb8dbf69e5e2c634fa73dc54" } octosense-appcard = { path = "apps/appcard/module" } -octosense-app-hub-app = { git = "https://github.com/OctoSense-org/OctoSense-App-Hub", rev = "8512be70b89b366e6d6ebf93e807188c4313c3c0" } +octosense-app-hub-app = { git = "https://github.com/OctoSense-org/OctoSense-App-Hub", rev = "0f332112f0b5a379c5bb33790df74b21597190cf" } # END native-apps: pins # --- Makepad (OctoSense-org/makepad), the revision Octoscript-Makepad's # runtime.json pins (native-runtime.lock.json); resolved to .sources/makepad. -makepad-widgets = { git = "https://github.com/OctoSense-org/makepad.git", rev = "92a19b67218f8cd2361866c4554457b153766f48" } -makepad-code-editor = { git = "https://github.com/OctoSense-org/makepad.git", rev = "92a19b67218f8cd2361866c4554457b153766f48" } -makepad-ai = { git = "https://github.com/OctoSense-org/makepad.git", rev = "92a19b67218f8cd2361866c4554457b153766f48" } -makepad-studio-protocol = { git = "https://github.com/OctoSense-org/makepad.git", rev = "92a19b67218f8cd2361866c4554457b153766f48" } -makepad-network = { git = "https://github.com/OctoSense-org/makepad.git", rev = "92a19b67218f8cd2361866c4554457b153766f48" } -makepad-wm-api = { git = "https://github.com/OctoSense-org/makepad.git", rev = "92a19b67218f8cd2361866c4554457b153766f48" } -makepad-ai-services = { git = "https://github.com/OctoSense-org/makepad.git", rev = "92a19b67218f8cd2361866c4554457b153766f48" } -makepad-strict-json = { git = "https://github.com/OctoSense-org/makepad.git", rev = "92a19b67218f8cd2361866c4554457b153766f48" } -makepad-app-module = { git = "https://github.com/OctoSense-org/makepad.git", rev = "92a19b67218f8cd2361866c4554457b153766f48" } -makepad-wm-theme = { git = "https://github.com/OctoSense-org/makepad.git", rev = "92a19b67218f8cd2361866c4554457b153766f48" } -makepad-aichat = { git = "https://github.com/OctoSense-org/makepad.git", rev = "92a19b67218f8cd2361866c4554457b153766f48", default-features = false } +makepad-widgets = { git = "https://github.com/OctoSense-org/makepad.git", rev = "1f3b1dedfbb81424eb8dbf69e5e2c634fa73dc54" } +makepad-code-editor = { git = "https://github.com/OctoSense-org/makepad.git", rev = "1f3b1dedfbb81424eb8dbf69e5e2c634fa73dc54" } +makepad-ai = { git = "https://github.com/OctoSense-org/makepad.git", rev = "1f3b1dedfbb81424eb8dbf69e5e2c634fa73dc54" } +makepad-studio-protocol = { git = "https://github.com/OctoSense-org/makepad.git", rev = "1f3b1dedfbb81424eb8dbf69e5e2c634fa73dc54" } +makepad-network = { git = "https://github.com/OctoSense-org/makepad.git", rev = "1f3b1dedfbb81424eb8dbf69e5e2c634fa73dc54" } +makepad-wm-api = { git = "https://github.com/OctoSense-org/makepad.git", rev = "1f3b1dedfbb81424eb8dbf69e5e2c634fa73dc54" } +makepad-ai-services = { git = "https://github.com/OctoSense-org/makepad.git", rev = "1f3b1dedfbb81424eb8dbf69e5e2c634fa73dc54" } +makepad-strict-json = { git = "https://github.com/OctoSense-org/makepad.git", rev = "1f3b1dedfbb81424eb8dbf69e5e2c634fa73dc54" } +makepad-app-module = { git = "https://github.com/OctoSense-org/makepad.git", rev = "1f3b1dedfbb81424eb8dbf69e5e2c634fa73dc54" } +makepad-wm-theme = { git = "https://github.com/OctoSense-org/makepad.git", rev = "1f3b1dedfbb81424eb8dbf69e5e2c634fa73dc54" } +makepad-aichat = { git = "https://github.com/OctoSense-org/makepad.git", rev = "1f3b1dedfbb81424eb8dbf69e5e2c634fa73dc54", default-features = false } # --- OctoScript (Octoscript dbd48cfb) and its Makepad runtime -# (Octoscript-Makepad ecab2b98, native-runtime.lock.json). +# (Octoscript-Makepad cb66de07, native-runtime.lock.json). octoscript-ui-l0 = { git = "https://github.com/OctoSense-org/Octoscript.git", rev = "dbd48cfb799551c11e30970c393777d29644a605" } # The bounded VM, capability-leased host modules and executable JSON schemas # (the system toolbox's workflow templates, crates/toolbox). octoscript-core = { git = "https://github.com/OctoSense-org/Octoscript.git", rev = "dbd48cfb799551c11e30970c393777d29644a605" } octoscript-capabilities = { git = "https://github.com/OctoSense-org/Octoscript.git", rev = "dbd48cfb799551c11e30970c393777d29644a605" } octoscript-schema = { git = "https://github.com/OctoSense-org/Octoscript.git", rev = "dbd48cfb799551c11e30970c393777d29644a605" } -octoscript-makepad = { git = "https://github.com/OctoSense-org/Octoscript-Makepad.git", rev = "ecab2b985a6f60376683cf7317dc82579393558f" } -octoscript-node = { git = "https://github.com/OctoSense-org/Octoscript-Makepad.git", rev = "ecab2b985a6f60376683cf7317dc82579393558f" } +octoscript-makepad = { git = "https://github.com/OctoSense-org/Octoscript-Makepad.git", rev = "cb66de073469063abeb2a5ab2a2bbf3cdb365745" } +octoscript-node = { git = "https://github.com/OctoSense-org/Octoscript-Makepad.git", rev = "cb66de073469063abeb2a5ab2a2bbf3cdb365745" } # --- App Hub's host service registry the Mail and llm services register # into; the same revision as App Hub's app crate (a native app, above). -octosense-appstore = { git = "https://github.com/OctoSense-org/OctoSense-App-Hub", rev = "8512be70b89b366e6d6ebf93e807188c4313c3c0" } +octosense-appstore = { git = "https://github.com/OctoSense-org/OctoSense-App-Hub", rev = "0f332112f0b5a379c5bb33790df74b21597190cf" } # The app policy (resolution, isolate settings, the Splash adapter) and the # Hub client the Card runner resolves an app's policy with; the shell's # glance tiles run cards under it (crates/shell/src/glance_card.rs). -octosense-app-policy = { git = "https://github.com/OctoSense-org/OctoSense-App-Hub", rev = "8512be70b89b366e6d6ebf93e807188c4313c3c0" } -octosense-app-hub = { git = "https://github.com/OctoSense-org/OctoSense-App-Hub", rev = "8512be70b89b366e6d6ebf93e807188c4313c3c0" } +octosense-app-policy = { git = "https://github.com/OctoSense-org/OctoSense-App-Hub", rev = "0f332112f0b5a379c5bb33790df74b21597190cf" } +octosense-app-hub = { git = "https://github.com/OctoSense-org/OctoSense-App-Hub", rev = "0f332112f0b5a379c5bb33790df74b21597190cf" } # --- octos: ONE source for every octos crate (octos-org/octos main at the # merge of octos#2645, Bing News's Chinese results with publisher links; # after #2644, the other lane's running turn in shared history, #2637, the @@ -251,10 +251,10 @@ octosense-llm-config = { path = "apps/ai-providers/config" } # every App Hub crate resolves through the www host alias of the same # repository, at the pin. Drop this once Rinx pins the same App Hub commit. [patch."https://github.com/OctoSense-org/OctoSense-App-Hub"] -octosense-app-hub = { git = "https://www.github.com/OctoSense-org/OctoSense-App-Hub", rev = "8512be70b89b366e6d6ebf93e807188c4313c3c0" } -octosense-app-policy = { git = "https://www.github.com/OctoSense-org/OctoSense-App-Hub", rev = "8512be70b89b366e6d6ebf93e807188c4313c3c0" } -octosense-appstore = { git = "https://www.github.com/OctoSense-org/OctoSense-App-Hub", rev = "8512be70b89b366e6d6ebf93e807188c4313c3c0" } -octosense-app-hub-app = { git = "https://www.github.com/OctoSense-org/OctoSense-App-Hub", rev = "8512be70b89b366e6d6ebf93e807188c4313c3c0" } +octosense-app-hub = { git = "https://www.github.com/OctoSense-org/OctoSense-App-Hub", rev = "0f332112f0b5a379c5bb33790df74b21597190cf" } +octosense-app-policy = { git = "https://www.github.com/OctoSense-org/OctoSense-App-Hub", rev = "0f332112f0b5a379c5bb33790df74b21597190cf" } +octosense-appstore = { git = "https://www.github.com/OctoSense-org/OctoSense-App-Hub", rev = "0f332112f0b5a379c5bb33790df74b21597190cf" } +octosense-app-hub-app = { git = "https://www.github.com/OctoSense-org/OctoSense-App-Hub", rev = "0f332112f0b5a379c5bb33790df74b21597190cf" } # Rinx's Matrix stack: the patched ruma its own workspace uses (Rinx's # [patch] sections do not reach a consumer workspace). diff --git a/apps/appcard/native-runtime.lock.json b/apps/appcard/native-runtime.lock.json index fd5ac574..be5bbb0d 100644 --- a/apps/appcard/native-runtime.lock.json +++ b/apps/appcard/native-runtime.lock.json @@ -1,5 +1,5 @@ { "schema_version": 1, "url": "https://github.com/OctoSense-org/Octoscript-Makepad.git", - "revision": "ecab2b985a6f60376683cf7317dc82579393558f" + "revision": "cb66de073469063abeb2a5ab2a2bbf3cdb365745" } diff --git a/native-apps.json b/native-apps.json index c0385fa7..da008c9c 100644 --- a/native-apps.json +++ b/native-apps.json @@ -41,7 +41,7 @@ { "id": "sheets", "crate": "makepad-sheets", - "source": { "git": "https://github.com/OctoSense-org/makepad.git", "rev": "92a19b67218f8cd2361866c4554457b153766f48", "local": ".sources/makepad/apps/sheets" }, + "source": { "git": "https://github.com/OctoSense-org/makepad.git", "rev": "1f3b1dedfbb81424eb8dbf69e5e2c634fa73dc54", "local": ".sources/makepad/apps/sheets" }, "module": "makepad_sheets::SHEETS_MODULE", "bin": "sheets", "default_features": false, @@ -57,7 +57,7 @@ { "id": "terminal", "crate": "makepad-terminal", - "source": { "git": "https://github.com/OctoSense-org/makepad.git", "rev": "92a19b67218f8cd2361866c4554457b153766f48", "local": ".sources/makepad/apps/terminal" }, + "source": { "git": "https://github.com/OctoSense-org/makepad.git", "rev": "1f3b1dedfbb81424eb8dbf69e5e2c634fa73dc54", "local": ".sources/makepad/apps/terminal" }, "module": "makepad_terminal::TERMINAL_MODULE", "bin": "terminal", "default_features": true, @@ -98,7 +98,7 @@ "id": "apphub", "feature": "app-hub", "crate": "octosense-app-hub-app", - "source": { "git": "https://github.com/OctoSense-org/OctoSense-App-Hub", "rev": "8512be70b89b366e6d6ebf93e807188c4313c3c0", "local": null }, + "source": { "git": "https://github.com/OctoSense-org/OctoSense-App-Hub", "rev": "0f332112f0b5a379c5bb33790df74b21597190cf", "local": null }, "module": ["octosense_app_hub_app::APP_HUB_MODULE", "octosense_app_hub_app::CARD_MODULE"], "bin": null, "default_features": true, diff --git a/native-runtime.lock.json b/native-runtime.lock.json index fd5ac574..be5bbb0d 100644 --- a/native-runtime.lock.json +++ b/native-runtime.lock.json @@ -1,5 +1,5 @@ { "schema_version": 1, "url": "https://github.com/OctoSense-org/Octoscript-Makepad.git", - "revision": "ecab2b985a6f60376683cf7317dc82579393558f" + "revision": "cb66de073469063abeb2a5ab2a2bbf3cdb365745" } diff --git a/phone/docs/build-tool.md b/phone/docs/build-tool.md index 42aaced6..6e52d13a 100644 --- a/phone/docs/build-tool.md +++ b/phone/docs/build-tool.md @@ -73,7 +73,7 @@ move that touches `tools/cargo_makepad` is the usual trigger): cargo install --path .sources/makepad/tools/cargo_makepad --force ``` -The shared release selects Makepad main `92a19b67`, which includes App Hub's +The shared release selects Makepad main `1f3b1ded`, which includes App Hub's isolate containment (#22), contained script apps (#30), the QR scanner (#31), Splash `reapply_text` (#35) self-confirmed assistant tools (#36) and the one-call-site Slug, cursor and glass shaders (#37, #39), the terminal's confirmed runs (#41), trackpad scrolling (#42), gestures (#46), Chinese text (#48), tabs and installed fonts (#47), and every app's system-font fallback (#49, #51), WebReader's close ending the page (#43), the OpenHarmony packager's workspace target dir (#52), the `sys.dataset` and `sys.news_digest` helpers (#53) the peer-link client (#54), the Linux Vulkan build (#45), the map's hosted-archive source (#55) HTTPS on OpenHarmony (#56) the keyboard's hide after a cancelled search (#57, #59) and the terminal's tab titles, wide-character reflow, non-blocking PTY writes, control-request timeout and running-job close confirmation (#61–#65), and its grapheme clusters, Kitty keyboard and synchronized output, close handshake and rendering polish (#66–#69); the consumer lock needs no `makepad_override`. diff --git a/phone/docs/makepad-fork.md b/phone/docs/makepad-fork.md index e1b1fc2d..3b40a597 100644 --- a/phone/docs/makepad-fork.md +++ b/phone/docs/makepad-fork.md @@ -20,9 +20,9 @@ Makepad and that no fork is required do not. The revision is pinned as a chain, not in one place: 1. `native-runtime.lock.json` here names one revision of - `OctoSense-org/Octoscript-Makepad` (`ecab2b98`, its main). + `OctoSense-org/Octoscript-Makepad` (`cb66de07`, its main). 2. That repo's `runtime.json` names the Makepad fork revision - (`92a19b67`, Makepad main: the enforced isolate policy of PR #22, module + (`1f3b1ded`, Makepad main: the enforced isolate policy of PR #22, module windows, the ROM's Splash fixes, the contained script apps and host services of PR #30, the QR scanner of PR #31, Splash `reapply_text` of PR #35, the self-confirmed assistant tools of PR #36, the one-call-site diff --git a/rom/docs/home-build.md b/rom/docs/home-build.md index d4ef326a..7851eff9 100644 --- a/rom/docs/home-build.md +++ b/rom/docs/home-build.md @@ -29,7 +29,7 @@ assistant (`octos-app`, `apps/appcard/app/app`) is built only with `--features app-appcard`: it is not shipped for now, so default, `mobile-apps` and native mobile builds leave its UI out. -The runtime's Makepad (main `92a19b67`, OctoScript-Makepad `ecab2b98`) +The runtime's Makepad (main `1f3b1ded`, OctoScript-Makepad `cb66de07`) includes the contained-app and isolate controls from makepad#30, the camera QR scanner AI providers uses (makepad#31), Splash `reapply_text` (makepad#35) with stateful mini-app inputs (OctoScript-Makepad#46) for Rinx, diff --git a/runtime-patches.lock.json b/runtime-patches.lock.json index 79604b3a..fd8c4813 100644 --- a/runtime-patches.lock.json +++ b/runtime-patches.lock.json @@ -1,15 +1,14 @@ { "schema_version": 1, "makepad": { - "base_revision": "92a19b67218f8cd2361866c4554457b153766f48", + "base_revision": "1f3b1dedfbb81424eb8dbf69e5e2c634fa73dc54", "patch": "tools/runtime-patches/makepad-settings.patch", "sha256": "1bf3c9d5367bb35a0e2ab0eb92b614507817066d31d8030404cbb0655c758268", - "tree": "e0ece11a3735a7eb7f4422167f3b61dd63c73339", + "tree": "b4493dba6f372c61188e50fc2a9f069c40f887d0", "product_fixes": [ "Settings integration: Android IME synchronization, accessibility and reduced motion, GLES program-cache validation, obscured-gesture cancellation and scroll-position observation.", "Contained-app isolation and secret-input restrictions come from the pinned upstream runtime; the Settings overlay preserves those gates.", "System Back callback owners suppress compatibility Back keys to avoid duplicate navigation on Android 13+.", - "A system browser's WebView renderer crash no longer takes the app down (OctoSense-org/makepad#58, onRenderProcessGone; merged, drops at the next makepad repin).", "A cancelled search's keyboard hides once: an editor session going inactive retires its input connection without restarting input, which brought the keyboard back empty while it was hiding (Android 11)." ], "stacked": [ @@ -17,10 +16,6 @@ "patch": "tools/runtime-patches/makepad-system-back.patch", "sha256": "3268cb486bbd05db7bb6920c26007e437017b6234a4d9f045a99a7d1954b7427" }, - { - "patch": "tools/runtime-patches/makepad-webview-render-gone.patch", - "sha256": "49903a6e3d20489ed8a0cc6969f4fb90eba172b0677998f7a368077f67f0ff6c" - }, { "patch": "tools/runtime-patches/makepad-ime-inactive-no-restart.patch", "sha256": "8ae6a6aceb93a013234c724ffdc6efc614cc8b9dddd7cae6ed8b1c569b94fdf1" diff --git a/tools/runtime-patches/makepad-webview-render-gone.patch b/tools/runtime-patches/makepad-webview-render-gone.patch deleted file mode 100644 index 7ed789b6..00000000 --- a/tools/runtime-patches/makepad-webview-render-gone.patch +++ /dev/null @@ -1,50 +0,0 @@ -diff --git a/tools/cargo_makepad/src/android/java/dev/makepad/android/MakepadActivity.java b/tools/cargo_makepad/src/android/java/dev/makepad/android/MakepadActivity.java -index ede68f2e0..274f2bbad 100644 ---- a/tools/cargo_makepad/src/android/java/dev/makepad/android/MakepadActivity.java -+++ b/tools/cargo_makepad/src/android/java/dev/makepad/android/MakepadActivity.java -@@ -113,6 +113,7 @@ import android.webkit.WebChromeClient; - import android.webkit.WebSettings; - import android.webkit.WebResourceRequest; - import android.webkit.WebResourceError; -+import android.webkit.RenderProcessGoneDetail; - import android.webkit.JavascriptInterface; - - // note: //% is a special miniquad's pre-processor for plugins -@@ -4153,6 +4154,9 @@ public class MakepadActivity - // a proper origin (YouTube and other referer-gated embeds refuse file:// / - // null-origin pages). - -+ /** Page-error code for a WebView whose renderer process is gone. */ -+ static final int RENDER_PROCESS_GONE = -1000; -+ - private WebView ensureSystemBrowser(long browserId) { - WebView view = mSystemBrowserViews.get(browserId); - if (view != null) { -@@ -4246,6 +4250,27 @@ public class MakepadActivity - Log.i("MakepadWeb", "page error id=" + boundBrowserId + " code=" + code + " url=" + url); - MakepadNative.onSystemBrowserPageError(boundBrowserId, code, description, url); - } -+ -+ // The WebView's renderer process died (a heavy page ran it out of -+ // memory, or it crashed). Unhandled, Android kills the whole app -+ // with it. Drop this WebView (it cannot be used again), keep the -+ // app, and tell Rust: the next spawn gets a fresh one. -+ @Override -+ public boolean onRenderProcessGone(WebView view, RenderProcessGoneDetail detail) { -+ boolean crashed = detail != null && detail.didCrash(); -+ Log.w("MakepadWeb", "renderer gone id=" + boundBrowserId + " crashed=" + crashed); -+ if (mSystemBrowserViews.get(boundBrowserId) == view) { -+ mSystemBrowserViews.remove(boundBrowserId); -+ } -+ ViewGroup parent = (ViewGroup) view.getParent(); -+ if (parent != null) { -+ parent.removeView(view); -+ } -+ view.destroy(); -+ MakepadNative.onSystemBrowserPageError(boundBrowserId, RENDER_PROCESS_GONE, -+ crashed ? "renderer process crashed" : "renderer process killed", ""); -+ return true; -+ } - }); - // JS→native bridge: the card calls window.octos_native.invoke(callId, tool, args); - // we forward it to Rust (WebCard widget dispatches the tool and resolves the