From a6b2a32a3330e0330d34a21070db02f9e0d83038 Mon Sep 17 00:00:00 2001 From: 0thernet Date: Mon, 5 Oct 2026 09:06:53 -0400 Subject: [PATCH 1/2] Drop the Dioxus renderer examples to terminal-only adapters MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Dioxus web/desktop adapters in examples/malleable-site and examples/local-triage pulled the wry/GTK/WebKit/servo dependency tree into both Cargo.locks — glib 0.18/0.20, gtk3, webkit2gtk, kuchikiki 0.8.8-speedreader, selectors/phf, rand 0.7.3, fxhash, paste, and proc-macro-error. Every one of those advisories is unreachable: wry pins kuchikiki exactly, no gtk4 wry exists, and the crates themselves carry no fixed releases. The example surface could not reach a clean lock while the adapters stayed, and the packaged local-triage artifact does not need a desktop renderer to demonstrate the ALGAL host lifecycle. Keep the Ratatui terminal adapter as the one renderer path. The triage package becomes an unsigned bin/-only archive (triage-host + triage-tui + optional native inference siblings): the .app bundle, plist, ad-hoc codesigning, desktop performance observer, and dedicated macOS renderer CI leg are removed with the renderer. The measured Dioxus evidence stays in the dated measurement records. Verified: cargo fmt/test/clippy --locked on both workspaces; the local triage package builds and passes the full 23-check package smoke on macOS arm64 through the mac-native lane. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 25 - .gitignore | 1 + examples/local-triage/package-smoke.ts | 2 - examples/local-triage/package.ts | 23 +- examples/local-triage/renderers/Cargo.lock | 5744 ++------------ examples/local-triage/renderers/Cargo.toml | 7 - examples/local-triage/renderers/README.md | 74 +- .../renderers/performance/README.md | 31 +- .../renderers/performance/browser.ts | 2 +- .../renderers/performance/cua-lease.ts | 40 - .../renderers/performance/native.swift | 83 - .../renderers/performance/native.ts | 22 +- .../local-triage/renderers/src/bin/desktop.rs | 439 -- examples/malleable-site/renderers/Cargo.lock | 6755 ++--------------- examples/malleable-site/renderers/Cargo.toml | 9 - examples/malleable-site/renderers/README.md | 66 +- examples/malleable-site/renderers/Trunk.toml | 8 - examples/malleable-site/renderers/index.html | 10 - .../renderers/src/bin/dioxus.rs | 21 - .../renderers/src/dioxus_adapter.rs | 53 - examples/malleable-site/renderers/src/lib.rs | 2 - 21 files changed, 1021 insertions(+), 12396 deletions(-) delete mode 100644 examples/local-triage/renderers/performance/cua-lease.ts delete mode 100644 examples/local-triage/renderers/performance/native.swift delete mode 100644 examples/local-triage/renderers/src/bin/desktop.rs delete mode 100644 examples/malleable-site/renderers/Trunk.toml delete mode 100644 examples/malleable-site/renderers/index.html delete mode 100644 examples/malleable-site/renderers/src/bin/dioxus.rs delete mode 100644 examples/malleable-site/renderers/src/dioxus_adapter.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 10d5948f..7b4c8340 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -248,28 +248,6 @@ jobs: - run: cargo test --manifest-path examples/local-triage/renderers/Cargo.toml --locked - run: cargo clippy --manifest-path examples/local-triage/renderers/Cargo.toml --locked --all-targets -- -D warnings - # macOS runs only the desktop feature surface; the generic renderer checks - # run once on Linux above. - surface-renderers-macos: - name: Surface renderer contract (macos-14) - needs: changes - if: needs.changes.outputs.code == 'true' - runs-on: macos-14 - timeout-minutes: 20 - steps: - - uses: actions/checkout@v7 - - uses: dtolnay/rust-toolchain@master - with: - toolchain: ${{ env.RUST_TOOLCHAIN }} - components: clippy - - uses: Swatinem/rust-cache@v2 - with: - shared-key: surface-renderers-desktop - save-if: ${{ github.ref == 'refs/heads/main' }} - workspaces: examples/local-triage/renderers -> target - - run: cargo test --manifest-path examples/local-triage/renderers/Cargo.toml --locked --features desktop - - run: cargo clippy --manifest-path examples/local-triage/renderers/Cargo.toml --locked --all-targets --features desktop -- -D warnings - # One Linux build of the kernel: fmt, clippy, the test suite (which builds # the debug binary) and the debug binary as an artifact that the parity, # application-parity and demo jobs download instead of compiling again. @@ -513,7 +491,6 @@ jobs: - coding-harness - browser-grow - surface-renderers - - surface-renderers-macos - native - native-parity-build - native-macos @@ -534,7 +511,6 @@ jobs: CODING_HARNESS: ${{ needs.coding-harness.result }} BROWSER_GROW: ${{ needs.browser-grow.result }} SURFACE_RENDERERS: ${{ needs.surface-renderers.result }} - SURFACE_RENDERERS_MACOS: ${{ needs.surface-renderers-macos.result }} NATIVE: ${{ needs.native.result }} NATIVE_PARITY_BUILD: ${{ needs.native-parity-build.result }} NATIVE_MACOS: ${{ needs.native-macos.result }} @@ -561,7 +537,6 @@ jobs: require coding-harness "$CODING_HARNESS" "$code_skip" require browser-grow "$BROWSER_GROW" "$browser_skip" require surface-renderers "$SURFACE_RENDERERS" "$code_skip" - require surface-renderers-macos "$SURFACE_RENDERERS_MACOS" "$code_skip" require native "$NATIVE" "$code_skip" require native-parity-build "$NATIVE_PARITY_BUILD" "$code_skip" require native-macos "$NATIVE_MACOS" "$code_skip" diff --git a/.gitignore b/.gitignore index 123f0e4b..ee3f24c0 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ promoted/ coverage/ .env* site/.production-browser/ +**/target/ diff --git a/examples/local-triage/package-smoke.ts b/examples/local-triage/package-smoke.ts index 9da17ef9..eb613807 100644 --- a/examples/local-triage/package-smoke.ts +++ b/examples/local-triage/package-smoke.ts @@ -84,8 +84,6 @@ try { assert(opened.status === 200 && body.capture.head === capture.head && body.capture.tasks[0]?.title === "Extracted app task", "Extracted browser host serves the same captured application"); assert((await fetch(`${url.origin}/api/open`, { signal: AbortSignal.timeout(5000) })).status === 403, "Extracted browser host requires owner authorization"); } finally { reader.releaseLock(); clearTimeout(serverTimer); if (server.exitCode === null) server.kill("SIGKILL"); await server.exited; } - await command(["/usr/bin/codesign", "--verify", "--deep", "--strict", join(root, "ALGAL Triage.app")]); - checks.push("Extracted .app ad-hoc signature verifies"); const report = { contract: "algal.triage-package-smoke.v1", ok: true, archive: resolve(archive), archiveSha256: createHash("sha256").update(await readFile(resolve(archive))).digest("hex"), sourceSha256: manifest.provenance.source.sha256, gitHeadAtBuild: manifest.provenance.gitHead, dirtyAtBuild: manifest.provenance.gitWorktreeDirty, platform: `${process.platform}-${process.arch}`, noSourceCheckoutRequired: true, noBunInstallationRequired: true, networkDenied: "not-tested-here", checks, finalHead: capture.head, states: transfer.states.length }; if (reportPath) await writeFile(reportPath, JSON.stringify(report, null, 2) + "\n"); console.log(JSON.stringify(report)); diff --git a/examples/local-triage/package.ts b/examples/local-triage/package.ts index f1b3f8aa..2dbfbb35 100644 --- a/examples/local-triage/package.ts +++ b/examples/local-triage/package.ts @@ -18,9 +18,9 @@ for (let i = 0; i < args.length; i++) { } if (process.platform !== "darwin" || process.arch !== "arm64") throw new Error("This package target requires macOS arm64"); if (!!native !== !!bridge) throw new Error("Explicit --native and --bridge paths must be supplied together"); -const label = "algal-triage-macos-arm64", directory = join(output, label), app = join(directory, "ALGAL Triage.app"), bin = join(directory, "bin"), resources = join(app, "Contents/Resources/bin"); +const label = "algal-triage-macos-arm64", directory = join(output, label), bin = join(directory, "bin"); try { await stat(directory); throw new Error("Package directory already exists; choose a fresh --output directory. Existing artifacts are never overwritten."); } catch (e) { if ((e as NodeJS.ErrnoException).code !== "ENOENT") throw e; } -await mkdir(resources, { recursive: true }); await mkdir(join(app, "Contents/MacOS"), { recursive: true }); await mkdir(bin, { recursive: true }); +await mkdir(bin, { recursive: true }); async function command(argv: string[]): Promise { const child = Bun.spawn(argv, { cwd: root, stdin: "ignore", stdout: "inherit", stderr: "inherit" }); if (await child.exited !== 0) throw new Error(`Package command failed: ${argv[0]}`); @@ -40,30 +40,25 @@ async function sourceSnapshot() { return { scope: "declared-source-superset-including-tests", patterns, sha256: createHash("sha256").update(JSON.stringify(files)).digest("hex"), files }; } const source = await sourceSnapshot(); -const provenance = { gitHead: await commandText(["/usr/bin/git", "rev-parse", "HEAD"]), gitWorktreeDirty: (await commandText(["/usr/bin/git", "status", "--porcelain"])).length > 0, bunVersion: Bun.version, rustcVersion: await commandText([join(process.env.HOME ?? "", ".cargo/bin/rustc"), "--version"]), cargoVersion: await commandText([join(process.env.HOME ?? "", ".cargo/bin/cargo"), "--version"]), darwinRelease: release(), rendererBuild: skipRust ? "reuse-existing-explicitly-requested" : "cargo build --locked --offline --features desktop (debug)", hostBuild: "bun build --compile --target=bun-darwin-arm64", bundledInferenceSourceRebuilt: false, source }; -if (!skipRust) await command([join(process.env.HOME ?? "", ".cargo/bin/cargo"), "build", "--manifest-path", join(root, "examples/local-triage/renderers/Cargo.toml"), "--locked", "--offline", "--features", "desktop", "--target-dir", target]); +const provenance = { gitHead: await commandText(["/usr/bin/git", "rev-parse", "HEAD"]), gitWorktreeDirty: (await commandText(["/usr/bin/git", "status", "--porcelain"])).length > 0, bunVersion: Bun.version, rustcVersion: await commandText([join(process.env.HOME ?? "", ".cargo/bin/rustc"), "--version"]), cargoVersion: await commandText([join(process.env.HOME ?? "", ".cargo/bin/cargo"), "--version"]), darwinRelease: release(), rendererBuild: skipRust ? "reuse-existing-explicitly-requested" : "cargo build --locked --offline (debug)", hostBuild: "bun build --compile --target=bun-darwin-arm64", bundledInferenceSourceRebuilt: false, source }; +if (!skipRust) await command([join(process.env.HOME ?? "", ".cargo/bin/cargo"), "build", "--manifest-path", join(root, "examples/local-triage/renderers/Cargo.toml"), "--locked", "--offline", "--target-dir", target]); await command([process.execPath, "build", join(root, "examples/local-triage/packaged-entry.ts"), "--compile", "--target=bun-darwin-arm64", "--outfile", join(bin, "triage-host")]); -await copyFile(join(target, "debug/triage-desktop"), join(app, "Contents/MacOS/triage-desktop")); await copyFile(join(target, "debug/triage-tui"), join(bin, "triage-tui")); -await copyFile(join(bin, "triage-host"), join(resources, "triage-host")); if (native && bridge) { for (const [source, name] of [[native, "algal-native"], [bridge, "algal-apple"]] as const) { const info = await stat(source); if (!info.isFile() || info.size > 268_435_456 || !(info.mode & 0o111)) throw new Error("Bundled inference path is not a bounded executable"); - await copyFile(source, join(bin, name)); await copyFile(source, join(resources, name)); + await copyFile(source, join(bin, name)); } } -const plist = `CFBundleExecutabletriage-desktopCFBundleIdentifiercomputer.algal.triageCFBundleNameALGAL TriageCFBundleDisplayNameALGAL TriageCFBundlePackageTypeAPPLCFBundleVersion1CFBundleShortVersionString0.1.0LSMinimumSystemVersion14.0NSHighResolutionCapable`; -await writeFile(join(app, "Contents/Info.plist"), plist); -const executablePaths = ["bin/triage-host", "bin/triage-tui", "ALGAL Triage.app/Contents/MacOS/triage-desktop", "ALGAL Triage.app/Contents/Resources/bin/triage-host", ...(native ? ["bin/algal-native", "bin/algal-apple", "ALGAL Triage.app/Contents/Resources/bin/algal-native", "ALGAL Triage.app/Contents/Resources/bin/algal-apple"] : [])]; +const executablePaths = ["bin/triage-host", "bin/triage-tui", ...(native ? ["bin/algal-native", "bin/algal-apple"] : [])]; for (const path of executablePaths) await chmod(join(directory, path), 0o755); -await command(["/usr/bin/codesign", "--force", "--sign", "-", "--deep", app]); -const readme = `# ALGAL Triage — macOS arm64\n\nOpen ALGAL Triage.app for the Dioxus desktop app, or run bin/triage-tui in a terminal.\nBoth use the standalone bin/triage-host; no source checkout or Bun installation is required.\nFor the same application in a browser, run bin/triage-host DIRECTORY APPLICATION serve and open its local owner URL. Initialize a new identity with init first. Keep the owner URL private.\n\nDefault state: ~/Library/Application Support/ALGAL Triage\nOptional args: --dir DIRECTORY --application ID --host EXECUTABLE\nUse a separate directory for experiments. Existing state is preserved on errors.\n\n32 tasks / 128 lifecycle states per identity. Save drafts before closing.\nExact-head commands, retained receipts, explicit migration and authority-free forks.\nDesktop uses the system WebView; this local artifact is ad-hoc signed, not notarized.\n${native ? "Apple native runtime and bridge are bundled in bin/ and the app Resources/bin/. Apple Intelligence requires a supported Apple Silicon Mac, macOS 26+, enabled Apple Intelligence and downloaded model assets. No cloud fallback.\n" : "This build does not bundle an inference provider. Explicit proposal import remains available.\n"}\nCLI: bin/triage-host DIRECTORY APPLICATION init|capture|command|propose-evaluate|adopt|export|verify|import|fork|review-merge|adopt-merge|load-session|save-session|propose-apple|serve ...\n\nIn the TUI: n add, e edit, p priority, c category, space complete/reopen, f filter, / query, Ctrl-S save draft, Ctrl-R refresh, r rebase, v preview, a adopt, S/G/V/R adjust policy, d transfer path, x export, o import, b fork, i proposal import, q save and quit.\n\nAll required byte hashes, source inventory, build provenance and platform requirements are in manifest.json. Content hashes identify the exact artifact; they do not establish publisher authentication.\n`; +const readme = `# ALGAL Triage — macOS arm64\n\nRun bin/triage-tui in a terminal, or bin/triage-host for the standalone CLI.\nNeither needs a source checkout or Bun installation.\nFor the same application in a browser, run bin/triage-host DIRECTORY APPLICATION serve and open its local owner URL. Initialize a new identity with init first. Keep the owner URL private.\n\nDefault state: ~/Library/Application Support/ALGAL Triage\nOptional args: --dir DIRECTORY --application ID --host EXECUTABLE\nUse a separate directory for experiments. Existing state is preserved on errors.\n\n32 tasks / 128 lifecycle states per identity. Save drafts before closing.\nExact-head commands, retained receipts, explicit migration and authority-free forks.\nThis local artifact is unsigned.\n${native ? "Apple native runtime and bridge are bundled in bin/. Apple Intelligence requires a supported Apple Silicon Mac, macOS 26+, enabled Apple Intelligence and downloaded model assets. No cloud fallback.\n" : "This build does not bundle an inference provider. Explicit proposal import remains available.\n"}\nCLI: bin/triage-host DIRECTORY APPLICATION init|capture|command|propose-evaluate|adopt|export|verify|import|fork|review-merge|adopt-merge|load-session|save-session|propose-apple|serve ...\n\nIn the TUI: n add, e edit, p priority, c category, space complete/reopen, f filter, / query, Ctrl-S save draft, Ctrl-R refresh, r rebase, v preview, a adopt, S/G/V/R adjust policy, d transfer path, x export, o import, b fork, i proposal import, q save and quit.\n\nAll required byte hashes, source inventory, build provenance and platform requirements are in manifest.json. Content hashes identify the exact artifact; they do not establish publisher authentication.\n`; await writeFile(join(directory, "README.md"), readme); -const files = [...executablePaths, "ALGAL Triage.app/Contents/Info.plist", "README.md"]; +const files = [...executablePaths, "README.md"]; const rows = await Promise.all(files.sort().map(async path => { const bytes = await readFile(join(directory, path)); return { path, bytes: bytes.length, sha256: createHash("sha256").update(bytes).digest("hex") }; })); const evaluator = await readFile(join(root, "src/algal_expr.wasm")); if ((await sourceSnapshot()).sha256 !== source.sha256) throw new Error("Package sources changed during assembly; keep this partial artifact and rebuild into a fresh output directory"); -const manifest = { contract: "algal.triage-package.v1", platform: "macos-arm64", hostRuntime: "embedded-bun", renderer: "dioxus-system-webview-and-ratatui", minimumMacOS: "14.0", appleInferenceBundled: native !== null, inferenceMinimumMacOS: native ? "26.0" : null, networkFallback: false, signing: "ad-hoc-not-notarized", evaluatorSha256: createHash("sha256").update(evaluator).digest("hex"), provenance, files: rows }; +const manifest = { contract: "algal.triage-package.v1", platform: "macos-arm64", hostRuntime: "embedded-bun", renderer: "ratatui-tui", minimumMacOS: "14.0", appleInferenceBundled: native !== null, inferenceMinimumMacOS: native ? "26.0" : null, networkFallback: false, signing: "unsigned", evaluatorSha256: createHash("sha256").update(evaluator).digest("hex"), provenance, files: rows }; await writeFile(join(directory, "manifest.json"), JSON.stringify(manifest, null, 2) + "\n"); await command(["/usr/bin/tar", "-czf", join(output, `${label}.tar.gz`), "-C", output, label]); console.log(JSON.stringify({ directory, archive: join(output, `${label}.tar.gz`), sourceSha256: source.sha256, manifest: join(directory, "manifest.json"), archiveBytes: (await stat(join(output, `${label}.tar.gz`))).size })); diff --git a/examples/local-triage/renderers/Cargo.lock b/examples/local-triage/renderers/Cargo.lock index ce6081ee..81469e9c 100644 --- a/examples/local-triage/renderers/Cargo.lock +++ b/examples/local-triage/renderers/Cargo.lock @@ -2,53 +2,22 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - [[package]] name = "algal-triage-renderers" version = "0.0.0" dependencies = [ "crossterm", - "dioxus", "ratatui", "serde", "serde_json", ] -[[package]] -name = "aligned" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" -dependencies = [ - "as-slice", -] - -[[package]] -name = "aligned-vec" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" -dependencies = [ - "equator", -] - [[package]] name = "allocator-api2" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" -[[package]] -name = "anyhow" -version = "1.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" - [[package]] name = "approx" version = "0.5.1" @@ -59,5590 +28,819 @@ dependencies = [ ] [[package]] -name = "arbitrary" -version = "1.4.2" +name = "autocfg" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] -name = "arg_enum_proc_macro" -version = "0.3.4" +name = "bitflags" +version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" [[package]] -name = "arrayvec" -version = "0.7.8" +name = "by_address" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" +checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" [[package]] -name = "as-slice" -version = "0.2.1" +name = "castaway" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" dependencies = [ - "stable_deref_trait", + "rustversion", ] [[package]] -name = "async-trait" -version = "0.1.92" +name = "cfg-if" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.6", -] +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" [[package]] -name = "atk" -version = "0.18.2" +name = "compact_str" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +checksum = "9dfdd1c2274d9aa354115b09dc9a901d6c5576818cdf70d14cae2bdb47df00ab" dependencies = [ - "atk-sys", - "glib", - "libc", + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "static_assertions", ] [[package]] -name = "atk-sys" -version = "0.18.2" +name = "convert_case" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", + "unicode-segmentation", ] [[package]] -name = "autocfg" -version = "1.5.1" +name = "crossterm" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" +checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" +dependencies = [ + "bitflags", + "crossterm_winapi", + "derive_more", + "document-features", + "mio", + "parking_lot", + "rustix", + "signal-hook", + "signal-hook-mio", + "winapi", +] [[package]] -name = "av-scenechange" -version = "0.14.1" +name = "crossterm_winapi" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" dependencies = [ - "aligned", - "anyhow", - "arg_enum_proc_macro", - "arrayvec", - "log", - "num-rational", - "num-traits", - "pastey", - "rayon", - "thiserror 2.0.20", - "v_frame", - "y4m", + "winapi", ] [[package]] -name = "av1-grain" -version = "0.2.5" +name = "darling" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" +checksum = "ed17f5901b6630b993ca003def43f2f8ef4014fc13b047b57aad617ff32bc2ec" dependencies = [ - "anyhow", - "arrayvec", - "log", - "nom", - "num-rational", - "v_frame", + "darling_core", + "darling_macro", ] [[package]] -name = "avif-serialize" -version = "0.8.9" +name = "darling_core" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7178fe5f7d460b13895ebb9dcb28a3a6216d2df2574a0806cb51b555d297f38" +checksum = "6837e2cf7485aaae18f86181d2f0e9a7ed297a025e220aeabf63fdebd3a2ddff" dependencies = [ - "arrayvec", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 3.0.6", ] [[package]] -name = "base64" -version = "0.22.1" +name = "darling_macro" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" +dependencies = [ + "darling_core", + "quote", + "syn 3.0.6", +] [[package]] -name = "bit_field" -version = "0.10.3" +name = "deranged" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" [[package]] -name = "bitflags" -version = "1.3.2" +name = "derive_more" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] [[package]] -name = "bitflags" -version = "2.13.2" +name = "derive_more-impl" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" dependencies = [ - "serde_core", + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.119", ] [[package]] -name = "bitstream-io" -version = "4.10.0" +name = "document-features" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eff00be299a18769011411c9def0d827e8f2d7bf0c3dbf53633147a8867fd1f" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" dependencies = [ - "no_std_io2", + "litrs", ] [[package]] -name = "block" -version = "0.1.6" +name = "either" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" [[package]] -name = "block-buffer" -version = "0.10.4" +name = "equivalent" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] -name = "block2" -version = "0.6.2" +name = "errno" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ - "objc2", + "libc", + "windows-sys", ] [[package]] -name = "built" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c0e531d93d39c34eef561e929e8a7f86d77a5af08aac4f6d6e39976c51858e9" - -[[package]] -name = "bumpalo" -version = "3.20.3" +name = "foldhash" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] -name = "by_address" -version = "1.2.1" +name = "hashbrown" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] -name = "bytemuck" -version = "1.25.2" +name = "hashbrown" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] -name = "byteorder" -version = "1.5.0" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "byteorder-lite" -version = "0.1.0" +name = "ident_case" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] -name = "bytes" -version = "1.12.1" +name = "indoc" +version = "2.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" dependencies = [ - "serde", + "rustversion", ] [[package]] -name = "cairo-rs" -version = "0.18.5" +name = "instability" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +checksum = "4c3b5acc1e2fd9375041a388da33d1eb8aed5f7a8c0dd3543e3ea2805adfbe20" dependencies = [ - "bitflags 2.13.2", - "cairo-sys-rs", - "glib", - "libc", - "once_cell", - "thiserror 1.0.69", + "darling", + "indoc", + "proc-macro2", + "quote", + "syn 3.0.6", ] [[package]] -name = "cairo-sys-rs" -version = "0.18.2" +name = "itertools" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ - "glib-sys", - "libc", - "system-deps", + "either", ] [[package]] -name = "castaway" -version = "0.2.4" +name = "itoa" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" -dependencies = [ - "rustversion", -] +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] -name = "cc" -version = "1.4.7" +name = "kasuari" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54413ede23c2daf518f35156dfde027feb2374004d63bd497f983c8db9c0e313" +checksum = "bde5057d6143cc94e861d90f591b9303d6716c6b9602309150bd068853c10899" dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex", + "hashbrown 0.16.1", + "portable-atomic", + "thiserror", ] [[package]] -name = "cesu8" -version = "1.1.0" +name = "libc" +version = "0.2.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" +checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" [[package]] -name = "cfb" -version = "0.7.3" +name = "libm" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" -dependencies = [ - "byteorder", - "fnv", - "uuid", -] +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] -name = "cfg-expr" -version = "0.15.8" +name = "line-clipping" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +checksum = "e752191d037c44ad111a8caa762921926658402f01cc1253f7bef2020ece4f5e" dependencies = [ - "smallvec", - "target-lexicon", + "bitflags", ] [[package]] -name = "cfg-if" -version = "1.0.5" +name = "linux-raw-sys" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] -name = "cocoa" -version = "0.26.1" +name = "litrs" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad36507aeb7e16159dfe68db81ccc27571c3ccd4b76fb2fb72fc59e7a4b1b64c" -dependencies = [ - "bitflags 2.13.2", - "block", - "cocoa-foundation", - "core-foundation", - "core-graphics 0.24.0", - "foreign-types 0.5.0", - "libc", - "objc", -] +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] -name = "cocoa-foundation" -version = "0.2.1" +name = "lock_api" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81411967c50ee9a1fc11365f8c585f863a22a9697c89239c452292c40ba79b0d" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "bitflags 2.13.2", - "block", - "core-foundation", - "core-graphics-types", - "objc", + "scopeguard", ] [[package]] -name = "color_quant" -version = "1.1.0" +name = "log" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] -name = "combine" -version = "4.6.8" +name = "lru" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfc320937d09e6de266b31b9afb480f197d7a861be86be7cb2ea7e5d1bfffc5e" +checksum = "ef9ac18847474e638e3702b76c65d4eb93428471a74778ef0f1be711717f89b5" dependencies = [ - "bytes", - "memchr", + "hashbrown 0.17.1", ] [[package]] -name = "compact_str" -version = "0.9.1" +name = "memchr" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dfdd1c2274d9aa354115b09dc9a901d6c5576818cdf70d14cae2bdb47df00ab" -dependencies = [ - "castaway", - "cfg-if", - "itoa", - "rustversion", - "ryu", - "static_assertions", -] +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] -name = "const_format" -version = "0.2.36" +name = "mio" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" -dependencies = [ - "const_format_proc_macros", - "konst", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "convert_case" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "convert_case" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "cookie" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a373e3602691c3cdea496d2f0ee5935151e6168fe87739483c463db1b2f2f87" -dependencies = [ - "time", - "version_check", -] - -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core-graphics" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" -dependencies = [ - "bitflags 2.13.2", - "core-foundation", - "core-graphics-types", - "foreign-types 0.5.0", - "libc", -] - -[[package]] -name = "core-graphics" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" -dependencies = [ - "bitflags 2.13.2", - "core-foundation", - "core-graphics-types", - "foreign-types 0.5.0", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" -dependencies = [ - "bitflags 2.13.2", - "core-foundation", - "libc", -] - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" dependencies = [ "libc", + "log", + "wasi", + "windows-sys", ] [[package]] -name = "crc32fast" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01a7799fd6b852db0e61728dde9a204c423b44d689dbd432522543614b490e78" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98b0cc327b5bc766e7fda9c9260cc0fa81b43a8e240440422dff70788e3f9ef1" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" - -[[package]] -name = "crossterm" -version = "0.29.0" +name = "num-conv" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" -dependencies = [ - "bitflags 2.13.2", - "crossterm_winapi", - "derive_more 2.1.1", - "document-features", - "mio", - "parking_lot", - "rustix", - "signal-hook", - "signal-hook-mio", - "winapi", -] +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] -name = "crossterm_winapi" -version = "0.9.1" +name = "num-traits" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ - "winapi", + "autocfg", ] [[package]] -name = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - -[[package]] -name = "crypto-common" +name = "num_threads" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "cssparser" -version = "0.29.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" -dependencies = [ - "cssparser-macros", - "dtoa-short", - "itoa", - "matches", - "phf 0.10.1", - "proc-macro2", - "quote", - "smallvec", - "syn 1.0.109", -] - -[[package]] -name = "cssparser-macros" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" -dependencies = [ - "quote", - "syn 2.0.119", -] - -[[package]] -name = "darling" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" -dependencies = [ - "darling_core 0.21.3", - "darling_macro 0.21.3", -] - -[[package]] -name = "darling" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed17f5901b6630b993ca003def43f2f8ef4014fc13b047b57aad617ff32bc2ec" -dependencies = [ - "darling_core 0.24.1", - "darling_macro 0.24.1", -] - -[[package]] -name = "darling_core" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "darling_core" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6837e2cf7485aaae18f86181d2f0e9a7ed297a025e220aeabf63fdebd3a2ddff" -dependencies = [ - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 3.0.6", -] - -[[package]] -name = "darling_macro" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" -dependencies = [ - "darling_core 0.21.3", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "darling_macro" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" -dependencies = [ - "darling_core 0.24.1", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "data-encoding" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" - -[[package]] -name = "deranged" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" - -[[package]] -name = "derive_more" -version = "0.99.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" dependencies = [ - "convert_case 0.4.0", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.119", + "libc", ] [[package]] -name = "derive_more" -version = "2.1.1" +name = "palette" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +checksum = "ddeed8580d347d2abf3dcf06a5f0b3dc020258338526b277847cd4248a70fc64" dependencies = [ - "derive_more-impl", + "approx", + "libm", + "palette_derive", + "palette_math", ] [[package]] -name = "derive_more-impl" -version = "2.1.1" +name = "palette_derive" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +checksum = "88537020289b719d81be994ccf1bbf4990f477e2f69ee52fe3e45f43a02e56be" dependencies = [ - "convert_case 0.10.0", + "by_address", "proc-macro2", "quote", - "rustc_version", "syn 2.0.119", ] [[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "dioxus" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9320593eda4f01858f046698b42441603d2af5fcb62a6c1f9046a0c2eebd6d9b" -dependencies = [ - "dioxus-config-macro", - "dioxus-config-macros", - "dioxus-core", - "dioxus-core-macro", - "dioxus-desktop", - "dioxus-hooks", - "dioxus-html", - "dioxus-signals", - "dioxus-stores", - "subsecond", -] - -[[package]] -name = "dioxus-asset-resolver" -version = "0.7.10" +name = "palette_math" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84235ff0e272f15d4537603cdd50df6d45d50e51bb96326dbc0bdfd01d825226" +checksum = "6e6eb142958d64335fb0e345c5b9ead2ecd6fc438c307e9d7d3c4fd428dbaf12" dependencies = [ - "dioxus-cli-config", - "http", - "infer", - "jni 0.21.1", - "ndk", - "ndk-context", - "ndk-sys", - "percent-encoding", - "thiserror 2.0.20", - "tokio", + "libm", ] [[package]] -name = "dioxus-cli-config" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322d10f47effebd85ee0662a2cb083ff920d40dd6295a4afd8cfa4f9bc2e05c6" - -[[package]] -name = "dioxus-config-macro" -version = "0.7.10" +name = "parking_lot" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3a906c8219e94fa48189a793c760a4e3193cbb7791f799e9d37633fe41161d" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "dioxus-config-macros" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20de015bc89c20f4ffc7b4f849943420308365fa66f991250b5c075261990a21" - -[[package]] -name = "dioxus-core" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b232228ada232c0adc151e41ebd9ef70cc04683db097fa0dc6015979fa01722" -dependencies = [ - "anyhow", - "const_format", - "dioxus-core-types", - "futures-channel", - "futures-util", - "generational-box", - "longest-increasing-subsequence", - "rustc-hash 2.1.3", - "rustversion", - "serde", - "slab", - "slotmap", - "subsecond", - "tracing", -] - -[[package]] -name = "dioxus-core-macro" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6256a68462222f0600f5fd7d9542cbd9f299bc19355d900f7827dd3fc9e09fdb" -dependencies = [ - "convert_case 0.8.0", - "dioxus-rsx", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "dioxus-core-types" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96007ed6cbad951dfed82d83c581aabd95bc591f351f5666d454ddbe7845b324" - -[[package]] -name = "dioxus-desktop" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "236deb81f1a04de704fb80cf7838c65607441c76914de2e036709540c540a39d" -dependencies = [ - "anyhow", - "async-trait", - "base64", - "bytes", - "cocoa", - "core-foundation", - "dioxus-asset-resolver", - "dioxus-cli-config", - "dioxus-core", - "dioxus-devtools", - "dioxus-document", - "dioxus-history", - "dioxus-hooks", - "dioxus-html", - "dioxus-interpreter-js", - "dioxus-signals", - "dunce", - "futures-channel", - "futures-util", - "generational-box", - "global-hotkey", - "image", - "infer", - "jni 0.21.1", - "lazy-js-bundle", - "libc", - "muda", - "ndk", - "ndk-context", - "ndk-sys", - "objc", - "objc_id", - "percent-encoding", - "rand 0.9.5", - "rfd", - "rustc-hash 2.1.3", - "serde", - "serde_json", - "signal-hook", - "slab", - "subtle", - "tao", - "thiserror 2.0.20", - "tokio", - "tracing", - "tray-icon", - "tungstenite", - "webbrowser", - "wry", -] - -[[package]] -name = "dioxus-devtools" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434cebb282b3f820a341582ebfd37dab907d5a25c3eeafd87802468afcd2a959" -dependencies = [ - "dioxus-cli-config", - "dioxus-core", - "dioxus-devtools-types", - "dioxus-signals", - "serde", - "serde_json", - "subsecond", - "thiserror 2.0.20", - "tracing", - "tungstenite", -] - -[[package]] -name = "dioxus-devtools-types" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfd6f3475e38c93be245a664a9ce11679a8f2b99832620705cf7837f42aa39ce" -dependencies = [ - "dioxus-core", - "serde", - "subsecond-types", -] - -[[package]] -name = "dioxus-document" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f6fadd5c6d886b48b762820abae1a08142a2159f8a1136c0466b4b4ed9f547e" -dependencies = [ - "dioxus-core", - "dioxus-core-macro", - "dioxus-core-types", - "dioxus-html", - "futures-channel", - "futures-util", - "generational-box", - "lazy-js-bundle", - "serde", - "serde_json", - "tracing", -] - -[[package]] -name = "dioxus-history" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2404b77d4441e694a5e93afb5c9a729efb26a3f6920f769cfe6cfedf5c7ac210" -dependencies = [ - "dioxus-core", - "tracing", -] - -[[package]] -name = "dioxus-hooks" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d3807a1bc039299cd37ad85f1c56ae7088210e8a38e3e877f01034d68c15fbb" -dependencies = [ - "dioxus-core", - "dioxus-signals", - "futures-channel", - "futures-util", - "generational-box", - "rustversion", - "slab", - "tracing", -] - -[[package]] -name = "dioxus-html" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b9a85679c4dfd8699407a9ad5041a6a4fe6be0ee386353951cd03b57a12030" -dependencies = [ - "async-trait", - "bytes", - "dioxus-core", - "dioxus-core-macro", - "dioxus-core-types", - "dioxus-hooks", - "dioxus-html-internal-macro", - "enumset", - "euclid", - "futures-channel", - "futures-util", - "generational-box", - "keyboard-types", - "lazy-js-bundle", - "rustversion", - "serde", - "serde_json", - "serde_repr", - "tracing", -] - -[[package]] -name = "dioxus-html-internal-macro" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500282dad5b62e91f93e127cbf41c587bf1c457d52514a75f3ff2a55fd0ea9f6" -dependencies = [ - "convert_case 0.8.0", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "dioxus-interpreter-js" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faa22cc3431e7efdbae28069542a1763c977d5edbe4d4fbfb0b7667b9c9966e9" -dependencies = [ - "dioxus-core", - "dioxus-core-types", - "dioxus-html", - "lazy-js-bundle", - "rustc-hash 2.1.3", - "serde", - "sledgehammer_bindgen", - "sledgehammer_utils", -] - -[[package]] -name = "dioxus-rsx" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aea662c9e13a91279d8acbc0d02a80430c7081704c20e8c791e4c4a151268596" -dependencies = [ - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "rustversion", - "syn 2.0.119", -] - -[[package]] -name = "dioxus-signals" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95d85e36fcaf7abdc986836801bf248776da7d5961f5fac65fdbf5ed491afb4f" -dependencies = [ - "dioxus-core", - "futures-channel", - "futures-util", - "generational-box", - "parking_lot", - "rustc-hash 2.1.3", - "tracing", - "warnings", -] - -[[package]] -name = "dioxus-stores" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15eaa9f2ccc5ce962d056515e61345c846a54b13a2b880cf7e8ac93faa53a178" -dependencies = [ - "dioxus-core", - "dioxus-signals", - "dioxus-stores-macro", - "generational-box", -] - -[[package]] -name = "dioxus-stores-macro" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13bd8a693d7042544fa3ac79698a08783bbc698d1ed257e88c5d4059e9ac476" -dependencies = [ - "convert_case 0.8.0", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.61.2", -] - -[[package]] -name = "dispatch2" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" -dependencies = [ - "bitflags 2.13.2", - "block2", - "libc", - "objc2", -] - -[[package]] -name = "displaydoc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "dlopen2" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" -dependencies = [ - "dlopen2_derive", - "libc", - "once_cell", - "winapi", -] - -[[package]] -name = "dlopen2_derive" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "document-features" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" -dependencies = [ - "litrs", -] - -[[package]] -name = "dpi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" - -[[package]] -name = "dtoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" - -[[package]] -name = "dtoa-short" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" -dependencies = [ - "dtoa", -] - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "either" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" - -[[package]] -name = "enumset" -version = "1.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccc5801fd11762e24d1e420d01d2ac518f2a2ca4329d4fbb6639f2412b6204e0" -dependencies = [ - "enumset_derive", -] - -[[package]] -name = "enumset_derive" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd536557b58c682b217b8fb199afdff47cd3eff260623f19e77074eb073d63a" -dependencies = [ - "darling 0.21.3", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "equator" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" -dependencies = [ - "equator-macro", -] - -[[package]] -name = "equator-macro" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "euclid" -version = "0.22.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" -dependencies = [ - "num-traits", - "serde", -] - -[[package]] -name = "exr" -version = "1.74.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711fe42c9964295e01ee3fba3f9fe0e1d24b98886950d68efe81b1c76e21adf3" -dependencies = [ - "bit_field", - "half", - "lebe", - "miniz_oxide 0.8.9", - "num-complex", - "pulp", - "rayon-core", - "smallvec", - "zune-inflate", -] - -[[package]] -name = "fastrand" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" - -[[package]] -name = "fax" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a" - -[[package]] -name = "fdeflate" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "field-offset" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" -dependencies = [ - "memoffset", - "rustc_version", -] - -[[package]] -name = "find-msvc-tools" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25905e51abafe4dcea6c15fec58c57b601cdbd0ee53d22ea1d3016c587d39b" - -[[package]] -name = "flate2" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" -dependencies = [ - "crc32fast", - "miniz_oxide 0.9.1", - "zlib-rs", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared 0.1.1", -] - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared 0.3.1", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" -dependencies = [ - "mac", - "new_debug_unreachable", -] - -[[package]] -name = "futures-channel" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" -dependencies = [ - "futures-core", -] - -[[package]] -name = "futures-core" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" - -[[package]] -name = "futures-executor" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" - -[[package]] -name = "futures-macro" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "futures-task" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" - -[[package]] -name = "futures-util" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" -dependencies = [ - "futures-core", - "futures-macro", - "futures-task", - "pin-project-lite", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "gdk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" -dependencies = [ - "cairo-rs", - "gdk-pixbuf", - "gdk-sys", - "gio", - "glib", - "libc", - "pango", -] - -[[package]] -name = "gdk-pixbuf" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" -dependencies = [ - "gdk-pixbuf-sys", - "gio", - "glib", - "libc", - "once_cell", -] - -[[package]] -name = "gdk-pixbuf-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" -dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gdk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" -dependencies = [ - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "pkg-config", - "system-deps", -] - -[[package]] -name = "gdkwayland-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" -dependencies = [ - "gdk-sys", - "glib-sys", - "gobject-sys", - "libc", - "pkg-config", - "system-deps", -] - -[[package]] -name = "gdkx11-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" -dependencies = [ - "gdk-sys", - "glib-sys", - "libc", - "system-deps", - "x11", -] - -[[package]] -name = "generational-box" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8b2dc9b873cd1a8adb80aa5dcef9a8205f781a8a313d5ffb867248cb3bcb764" -dependencies = [ - "parking_lot", - "tracing", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "gethostname" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" -dependencies = [ - "rustix", - "windows-link 0.2.1", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "libc", - "r-efi 5.3.0", - "wasip2", -] - -[[package]] -name = "getrandom" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" -dependencies = [ - "cfg-if", - "libc", - "r-efi 6.0.0", -] - -[[package]] -name = "gif" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" -dependencies = [ - "color_quant", - "weezl", -] - -[[package]] -name = "gio" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "gio-sys", - "glib", - "libc", - "once_cell", - "pin-project-lite", - "smallvec", - "thiserror 1.0.69", -] - -[[package]] -name = "gio-sys" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", - "winapi", -] - -[[package]] -name = "glib" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" -dependencies = [ - "bitflags 2.13.2", - "futures-channel", - "futures-core", - "futures-executor", - "futures-task", - "futures-util", - "gio-sys", - "glib-macros", - "glib-sys", - "gobject-sys", - "libc", - "memchr", - "once_cell", - "smallvec", - "thiserror 1.0.69", -] - -[[package]] -name = "glib-macros" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" -dependencies = [ - "heck 0.4.1", - "proc-macro-crate 2.0.2", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "glib-sys" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" -dependencies = [ - "libc", - "system-deps", -] - -[[package]] -name = "global-hotkey" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9247516746aa8e53411a0db9b62b0e24efbcf6a76e0ba73e5a91b512ddabed7" -dependencies = [ - "crossbeam-channel", - "keyboard-types", - "objc2", - "objc2-app-kit", - "once_cell", - "thiserror 2.0.20", - "windows-sys 0.59.0", - "x11rb", - "xkeysym", -] - -[[package]] -name = "gobject-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" -dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gtk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" -dependencies = [ - "atk", - "cairo-rs", - "field-offset", - "futures-channel", - "gdk", - "gdk-pixbuf", - "gio", - "glib", - "gtk-sys", - "gtk3-macros", - "libc", - "pango", - "pkg-config", -] - -[[package]] -name = "gtk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" -dependencies = [ - "atk-sys", - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "system-deps", -] - -[[package]] -name = "gtk3-macros" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "half" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" -dependencies = [ - "cfg-if", - "crunchy", - "zerocopy", -] - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", -] - -[[package]] -name = "hashbrown" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "html5ever" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" -dependencies = [ - "log", - "mac", - "markup5ever", - "match_token", -] - -[[package]] -name = "http" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" -dependencies = [ - "bytes", - "itoa", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "icu_collections" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" -dependencies = [ - "displaydoc", - "potential_utf", - "utf8_iter", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" - -[[package]] -name = "icu_properties" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" - -[[package]] -name = "icu_provider" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "image" -version = "0.25.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" -dependencies = [ - "bytemuck", - "byteorder-lite", - "color_quant", - "exr", - "gif", - "image-webp", - "moxcms", - "num-traits", - "png 0.18.1", - "qoi", - "ravif", - "rayon", - "rgb", - "tiff", - "zune-core", - "zune-jpeg", -] - -[[package]] -name = "image-webp" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" -dependencies = [ - "byteorder-lite", - "quick-error", -] - -[[package]] -name = "imgref" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e44b0a4eaa4c82f441d50a963f2d5f05a787240aeee097597033e72accfd22f" - -[[package]] -name = "indexmap" -version = "2.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" -dependencies = [ - "equivalent", - "hashbrown 0.17.1", -] - -[[package]] -name = "indoc" -version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" -dependencies = [ - "rustversion", -] - -[[package]] -name = "infer" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" -dependencies = [ - "cfb", -] - -[[package]] -name = "instability" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c3b5acc1e2fd9375041a388da33d1eb8aed5f7a8c0dd3543e3ea2805adfbe20" -dependencies = [ - "darling 0.24.1", - "indoc", - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "interpolate_name" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" - -[[package]] -name = "javascriptcore-rs" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" -dependencies = [ - "bitflags 1.3.2", - "glib", - "javascriptcore-rs-sys", -] - -[[package]] -name = "javascriptcore-rs-sys" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys 0.3.1", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" -dependencies = [ - "cfg-if", - "combine", - "jni-macros", - "jni-sys 0.4.1", - "log", - "simd_cesu8", - "thiserror 2.0.20", - "walkdir", - "windows-link 0.2.1", -] - -[[package]] -name = "jni-macros" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" -dependencies = [ - "proc-macro2", - "quote", - "rustc_version", - "simd_cesu8", - "syn 2.0.119", -] - -[[package]] -name = "jni-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" -dependencies = [ - "jni-sys 0.4.1", -] - -[[package]] -name = "jni-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" -dependencies = [ - "jni-sys-macros", -] - -[[package]] -name = "jni-sys-macros" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" -dependencies = [ - "quote", - "syn 2.0.119", -] - -[[package]] -name = "jobserver" -version = "0.1.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" -dependencies = [ - "getrandom 0.4.3", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e" -dependencies = [ - "cfg-if", - "futures-util", - "wasm-bindgen", -] - -[[package]] -name = "kasuari" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde5057d6143cc94e861d90f591b9303d6716c6b9602309150bd068853c10899" -dependencies = [ - "hashbrown 0.16.1", - "portable-atomic", - "thiserror 2.0.20", -] - -[[package]] -name = "keyboard-types" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" -dependencies = [ - "bitflags 2.13.2", - "serde", - "unicode-segmentation", -] - -[[package]] -name = "konst" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" -dependencies = [ - "konst_macro_rules", -] - -[[package]] -name = "konst_macro_rules" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" - -[[package]] -name = "kuchikiki" -version = "0.8.8-speedreader" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" -dependencies = [ - "cssparser", - "html5ever", - "indexmap", - "selectors", -] - -[[package]] -name = "lazy-js-bundle" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51cdaa5abc885e2d606e6985281ace220778bde190be20aab1ec2346ed8bd1fa" - -[[package]] -name = "lebe" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" - -[[package]] -name = "libappindicator" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" -dependencies = [ - "glib", - "gtk", - "gtk-sys", - "libappindicator-sys", - "log", -] - -[[package]] -name = "libappindicator-sys" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" -dependencies = [ - "gtk-sys", - "libloading 0.7.4", - "once_cell", -] - -[[package]] -name = "libc" -version = "0.2.189" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" - -[[package]] -name = "libfuzzer-sys" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9fd2f41a1cba099f79a0b6b6c35656cf7c03351a7bae8ff0f28f25270f929d2" -dependencies = [ - "arbitrary", - "cc", -] - -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if", - "winapi", -] - -[[package]] -name = "libloading" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" -dependencies = [ - "cfg-if", - "windows-link 0.2.1", -] - -[[package]] -name = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - -[[package]] -name = "libredox" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d" -dependencies = [ - "libc", -] - -[[package]] -name = "libxdo" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00333b8756a3d28e78def82067a377de7fa61b24909000aeaa2b446a948d14db" -dependencies = [ - "libxdo-sys", -] - -[[package]] -name = "libxdo-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db23b9e7e2b7831bbd8aac0bbeeeb7b68cbebc162b227e7052e8e55829a09212" -dependencies = [ - "libc", - "x11", -] - -[[package]] -name = "line-clipping" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e752191d037c44ad111a8caa762921926658402f01cc1253f7bef2020ece4f5e" -dependencies = [ - "bitflags 2.13.2", -] - -[[package]] -name = "linux-raw-sys" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" - -[[package]] -name = "litemap" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" - -[[package]] -name = "litrs" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" - -[[package]] -name = "longest-increasing-subsequence" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3bd0dd2cd90571056fdb71f6275fada10131182f84899f4b2a916e565d81d86" - -[[package]] -name = "loop9" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" -dependencies = [ - "imgref", -] - -[[package]] -name = "lru" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef9ac18847474e638e3702b76c65d4eb93428471a74778ef0f1be711717f89b5" -dependencies = [ - "hashbrown 0.17.1", -] - -[[package]] -name = "mac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - -[[package]] -name = "markup5ever" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" -dependencies = [ - "log", - "phf 0.11.3", - "phf_codegen 0.11.3", - "string_cache", - "string_cache_codegen", - "tendril", -] - -[[package]] -name = "match_token" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - -[[package]] -name = "maybe-rayon" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" -dependencies = [ - "cfg-if", - "rayon", -] - -[[package]] -name = "memchr" -version = "2.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" - -[[package]] -name = "memfd" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57804b2c9b69967f1536a56f86297e367a33b19e98852ed624b84551cdbc0d90" -dependencies = [ - "rustix", -] - -[[package]] -name = "memmap2" -version = "0.9.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" -dependencies = [ - "libc", -] - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "miniz_oxide" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mio" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" -dependencies = [ - "libc", - "log", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.61.2", -] - -[[package]] -name = "moxcms" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" -dependencies = [ - "num-traits", - "pxfm", -] - -[[package]] -name = "muda" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c9fec5a4e89860383d778d10563a605838f8f0b2f9303868937e5ff32e86177" -dependencies = [ - "crossbeam-channel", - "dpi", - "gtk", - "keyboard-types", - "libxdo", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "once_cell", - "png 0.17.16", - "thiserror 2.0.20", - "windows-sys 0.60.2", -] - -[[package]] -name = "native-tls" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "ndk" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" -dependencies = [ - "bitflags 2.13.2", - "jni-sys 0.3.1", - "log", - "ndk-sys", - "num_enum", - "raw-window-handle 0.6.2", - "thiserror 1.0.69", -] - -[[package]] -name = "ndk-context" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" - -[[package]] -name = "ndk-sys" -version = "0.6.0+11769913" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" -dependencies = [ - "jni-sys 0.3.1", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - -[[package]] -name = "no_std_io2" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418abd1b6d34fbf6cae440dc874771b0525a604428704c76e48b29a5e67b8003" -dependencies = [ - "memchr", -] - -[[package]] -name = "nodrop" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" - -[[package]] -name = "nom" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" -dependencies = [ - "memchr", -] - -[[package]] -name = "noop_proc_macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" - -[[package]] -name = "num-bigint" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "bytemuck", - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" - -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "num-integer" -version = "0.1.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_enum" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" -dependencies = [ - "proc-macro-crate 3.5.0", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", -] - -[[package]] -name = "objc2" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" -dependencies = [ - "objc2-encode", - "objc2-exception-helper", -] - -[[package]] -name = "objc2-app-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" -dependencies = [ - "bitflags 2.13.2", - "block2", - "objc2", - "objc2-core-foundation", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" -dependencies = [ - "bitflags 2.13.2", - "dispatch2", - "objc2", -] - -[[package]] -name = "objc2-core-graphics" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" -dependencies = [ - "bitflags 2.13.2", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "objc2-exception-helper" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" -dependencies = [ - "cc", -] - -[[package]] -name = "objc2-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" -dependencies = [ - "bitflags 2.13.2", - "block2", - "objc2", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-ui-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" -dependencies = [ - "bitflags 2.13.2", - "objc2", - "objc2-core-foundation", - "objc2-foundation", -] - -[[package]] -name = "objc2-web-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" -dependencies = [ - "bitflags 2.13.2", - "block2", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", -] - -[[package]] -name = "objc_id" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" -dependencies = [ - "objc", -] - -[[package]] -name = "once_cell" -version = "1.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" - -[[package]] -name = "openssl" -version = "0.10.81" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" -dependencies = [ - "bitflags 2.13.2", - "cfg-if", - "foreign-types 0.3.2", - "libc", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "openssl-probe" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" - -[[package]] -name = "openssl-sys" -version = "0.9.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "palette" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddeed8580d347d2abf3dcf06a5f0b3dc020258338526b277847cd4248a70fc64" -dependencies = [ - "approx", - "libm", - "palette_derive", - "palette_math", -] - -[[package]] -name = "palette_derive" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88537020289b719d81be994ccf1bbf4990f477e2f69ee52fe3e45f43a02e56be" -dependencies = [ - "by_address", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "palette_math" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e6eb142958d64335fb0e345c5b9ead2ecd6fc438c307e9d7d3c4fd428dbaf12" -dependencies = [ - "libm", -] - -[[package]] -name = "pango" -version = "0.18.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" -dependencies = [ - "gio", - "glib", - "libc", - "once_cell", - "pango-sys", -] - -[[package]] -name = "pango-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-link 0.2.1", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pastey" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "phf" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" -dependencies = [ - "phf_shared 0.8.0", -] - -[[package]] -name = "phf" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" -dependencies = [ - "phf_macros", - "phf_shared 0.10.0", - "proc-macro-hack", -] - -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_shared 0.11.3", -] - -[[package]] -name = "phf_codegen" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" -dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", -] - -[[package]] -name = "phf_codegen" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" -dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", -] - -[[package]] -name = "phf_generator" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" -dependencies = [ - "phf_shared 0.8.0", - "rand 0.7.3", -] - -[[package]] -name = "phf_generator" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" -dependencies = [ - "phf_shared 0.10.0", - "rand 0.8.8", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared 0.11.3", - "rand 0.8.8", -] - -[[package]] -name = "phf_macros" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" -dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "phf_shared" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" -dependencies = [ - "siphasher 0.3.11", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher 0.3.11", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher 1.0.3", -] - -[[package]] -name = "pin-project" -version = "1.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" - -[[package]] -name = "pkg-config" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" - -[[package]] -name = "png" -version = "0.17.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide 0.8.9", -] - -[[package]] -name = "png" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" -dependencies = [ - "bitflags 2.13.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide 0.8.9", -] - -[[package]] -name = "pollster" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" - -[[package]] -name = "portable-atomic" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" - -[[package]] -name = "potential_utf" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" -dependencies = [ - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro-crate" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" -dependencies = [ - "toml_datetime 0.6.3", - "toml_edit 0.20.2", -] - -[[package]] -name = "proc-macro-crate" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" -dependencies = [ - "toml_edit 0.25.15+spec-1.1.0", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" - -[[package]] -name = "proc-macro2" -version = "1.0.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proc-macro2-diagnostics" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", - "version_check", -] - -[[package]] -name = "profiling" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" -dependencies = [ - "profiling-procmacros", -] - -[[package]] -name = "profiling-procmacros" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4488a4a36b9a4ba6b9334a32a39971f77c1436ec82c38707bce707699cc3bbcb" -dependencies = [ - "quote", - "syn 2.0.119", -] - -[[package]] -name = "pulp" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046aa45b989642ec2e4717c8e72d677b13edd831a4d3b6cf37d9a3e54912496a" -dependencies = [ - "bytemuck", - "cfg-if", - "libm", - "num-complex", - "paste", - "pulp-wasm-simd-flag", - "raw-cpuid", - "reborrow", - "version_check", -] - -[[package]] -name = "pulp-wasm-simd-flag" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d8f70e07b9c3962945a74e59ca1c511bba65b6419468acc217c457d93f3c740" - -[[package]] -name = "pxfm" -version = "0.1.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" - -[[package]] -name = "qoi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "quick-error" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" - -[[package]] -name = "quote" -version = "1.0.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "r-efi" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", - "rand_pcg", -] - -[[package]] -name = "rand" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", -] - -[[package]] -name = "rand_core" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" -dependencies = [ - "getrandom 0.3.4", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_pcg" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "ratatui" -version = "0.30.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3274ba0a2c5e1bcad2a2005d20f4dc59dad26b2eb0940fb094500dba4099d57d" -dependencies = [ - "instability", - "ratatui-core", - "ratatui-crossterm", - "ratatui-widgets", - "serde", -] - -[[package]] -name = "ratatui-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbb175c433c8e28a809d1f5773a2ae96e68c0ce40db865cbab1020bf33ae479c" -dependencies = [ - "bitflags 2.13.2", - "compact_str", - "hashbrown 0.17.1", - "itertools", - "kasuari", - "lru", - "palette", - "serde", - "strum", - "thiserror 2.0.20", - "unicode-segmentation", - "unicode-truncate", - "unicode-width", -] - -[[package]] -name = "ratatui-crossterm" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567584a3b0e6a8203c23de40b4861497266725eb5363dbfd18a1edd603cca9f0" -dependencies = [ - "cfg-if", - "crossterm", - "instability", - "ratatui-core", -] - -[[package]] -name = "ratatui-widgets" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66e3d19bcc9130ca376277d93b60767ff121ace3be06f5f95f81dd68956407d1" -dependencies = [ - "bitflags 2.13.2", - "hashbrown 0.17.1", - "indoc", - "instability", - "itertools", - "line-clipping", - "ratatui-core", - "serde", - "strum", - "time", - "unicode-segmentation", - "unicode-width", -] - -[[package]] -name = "rav1e" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" -dependencies = [ - "aligned-vec", - "arbitrary", - "arg_enum_proc_macro", - "arrayvec", - "av-scenechange", - "av1-grain", - "bitstream-io", - "built", - "cfg-if", - "interpolate_name", - "itertools", - "libc", - "libfuzzer-sys", - "log", - "maybe-rayon", - "new_debug_unreachable", - "noop_proc_macro", - "num-derive", - "num-traits", - "paste", - "profiling", - "rand 0.9.5", - "rand_chacha 0.9.0", - "simd_helpers", - "thiserror 2.0.20", - "v_frame", - "wasm-bindgen", -] - -[[package]] -name = "ravif" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" -dependencies = [ - "avif-serialize", - "imgref", - "loop9", - "quick-error", - "rav1e", - "rayon", - "rgb", -] - -[[package]] -name = "raw-cpuid" -version = "11.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" -dependencies = [ - "bitflags 2.13.2", -] - -[[package]] -name = "raw-window-handle" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" - -[[package]] -name = "raw-window-handle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" - -[[package]] -name = "rayon" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "reborrow" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags 2.13.2", -] - -[[package]] -name = "redox_users" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60dc65c0ff1a7ae1294b0c67b9f14baf70b644404010370171787bfac1038fc0" -dependencies = [ - "libredox", - "thiserror 2.0.20", -] - -[[package]] -name = "rfd" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20dafead71c16a34e1ff357ddefc8afc11e7d51d6d2b9fbd07eaa48e3e540220" -dependencies = [ - "block2", - "dispatch2", - "js-sys", - "libc", - "log", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "percent-encoding", - "pollster", - "raw-window-handle 0.6.2", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rgb" -version = "0.8.53" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.17", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hash" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" -dependencies = [ - "bitflags 2.13.2", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.23.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634" -dependencies = [ - "once_cell", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pki-types" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" -dependencies = [ - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" - -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "security-framework" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" -dependencies = [ - "bitflags 2.13.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "selectors" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" -dependencies = [ - "bitflags 1.3.2", - "cssparser", - "derive_more 0.99.20", - "fxhash", - "log", - "phf 0.8.0", - "phf_codegen 0.8.0", - "precomputed-hash", - "servo_arc", - "smallvec", -] - -[[package]] -name = "semver" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "serde_json" -version = "1.0.145" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", - "serde_core", -] - -[[package]] -name = "serde_repr" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "servo_arc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" -dependencies = [ - "nodrop", - "stable_deref_trait", -] - -[[package]] -name = "sha1" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shlex" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" - -[[package]] -name = "signal-hook" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-mio" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" -dependencies = [ - "libc", - "mio", - "signal-hook", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - -[[package]] -name = "simd-adler32" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" - -[[package]] -name = "simd_cesu8" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" -dependencies = [ - "rustc_version", - "simdutf8", -] - -[[package]] -name = "simd_helpers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" -dependencies = [ - "quote", -] - -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[package]] -name = "siphasher" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "sledgehammer_bindgen" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49e83e178d176459c92bc129cfd0958afac3ced925471b889b3a75546cfc4133" -dependencies = [ - "sledgehammer_bindgen_macro", -] - -[[package]] -name = "sledgehammer_bindgen_macro" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb251b407f50028476a600541542b605bb864d35d9ee1de4f6cab45d88475e6d" -dependencies = [ - "quote", - "syn 2.0.119", -] - -[[package]] -name = "sledgehammer_utils" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "debdd4b83524961983cea3c55383b3910fd2f24fd13a188f5b091d2d504a61ae" -dependencies = [ - "rustc-hash 1.1.0", -] - -[[package]] -name = "slotmap" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" -dependencies = [ - "serde", - "version_check", -] - -[[package]] -name = "smallvec" -version = "1.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba467056f1b547ed52077911161fc86985becbc60e8e1857c8a144dab0def891" - -[[package]] -name = "soup3" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" -dependencies = [ - "futures-channel", - "gio", - "glib", - "libc", - "soup3-sys", -] - -[[package]] -name = "soup3-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" -dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "string_cache" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" -dependencies = [ - "new_debug_unreachable", - "parking_lot", - "phf_shared 0.11.3", - "precomputed-hash", - "serde", -] - -[[package]] -name = "string_cache_codegen" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" -dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", - "proc-macro2", - "quote", -] - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "subsecond" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d350d5788fa94d560d92269266a50efc77b036bfca6675e420b64df7b3211f37" -dependencies = [ - "js-sys", - "libc", - "libloading 0.8.9", - "memfd", - "memmap2", - "serde", - "subsecond-types", - "thiserror 2.0.20", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "subsecond-types" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf32d66269b5fbb8558334e8d22b657b2f7af0dd2ef56c231541099a862e464" -dependencies = [ - "serde", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.119" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "synstructure" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "system-deps" -version = "6.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" -dependencies = [ - "cfg-expr", - "heck 0.5.0", - "pkg-config", - "toml", - "version-compare", -] - -[[package]] -name = "tao" -version = "0.34.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9103edf55f2da3c82aea4c7fab7c4241032bfeea0e71fa557d98e00e7ce7cc20" -dependencies = [ - "bitflags 2.13.2", - "block2", - "core-foundation", - "core-graphics 0.25.0", - "crossbeam-channel", - "dispatch2", - "dlopen2", - "dpi", - "gdkwayland-sys", - "gdkx11-sys", - "gtk", - "jni 0.21.1", - "libc", - "log", - "ndk", - "ndk-context", - "ndk-sys", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "once_cell", - "parking_lot", - "raw-window-handle 0.5.2", - "raw-window-handle 0.6.2", - "tao-macros", - "unicode-segmentation", - "url", - "windows", - "windows-core", - "windows-version", - "x11-dl", -] - -[[package]] -name = "tao-macros" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7eeb6d99155545da6150a1795945f16ac9c178deb2a5f2e74d776107bd5849" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "target-lexicon" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" - -[[package]] -name = "tempfile" -version = "3.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" -dependencies = [ - "fastrand", - "getrandom 0.4.3", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - -[[package]] -name = "tendril" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" -dependencies = [ - "futf", - "mac", - "utf-8", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" -dependencies = [ - "thiserror-impl 2.0.20", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "tiff" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" -dependencies = [ - "fax", - "flate2", - "half", - "quick-error", - "weezl", - "zune-jpeg", -] - -[[package]] -name = "time" -version = "0.3.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" -dependencies = [ - "deranged", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" - -[[package]] -name = "time-macros" -version = "0.2.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tokio" -version = "1.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" -dependencies = [ - "bytes", - "pin-project-lite", - "tokio-macros", -] - -[[package]] -name = "tokio-macros" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "toml" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime 0.6.3", - "toml_edit 0.20.2", -] - -[[package]] -name = "toml_datetime" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "1.1.1+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap", - "toml_datetime 0.6.3", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime 0.6.3", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.25.15+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1340ea94a5856333492c9064b02c778b191dd2c853778d9609debdcdfea3a614" -dependencies = [ - "indexmap", - "toml_datetime 1.1.1+spec-1.1.0", - "toml_parser", - "winnow 1.0.4", -] - -[[package]] -name = "toml_parser" -version = "1.1.3+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" -dependencies = [ - "winnow 1.0.4", -] - -[[package]] -name = "tracing" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "tracing-core" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "tray-icon" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c" -dependencies = [ - "crossbeam-channel", - "dirs", - "libappindicator", - "muda", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-foundation", - "once_cell", - "png 0.17.16", - "thiserror 2.0.20", - "windows-sys 0.60.2", -] - -[[package]] -name = "tungstenite" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" -dependencies = [ - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "native-tls", - "rand 0.9.5", - "rustls", - "sha1", - "thiserror 2.0.20", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" - -[[package]] -name = "unicode-ident" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" - -[[package]] -name = "unicode-segmentation" -version = "1.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" - -[[package]] -name = "unicode-truncate" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b380a1238663e5f8a691f9039c73e1cdae598a30e9855f541d29b08b53e9a5" -dependencies = [ - "itertools", - "unicode-segmentation", - "unicode-width", -] - -[[package]] -name = "unicode-width" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "uuid" -version = "1.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ef6dac1e96601b4fb3acccccff2139741fcb757cb9a36089bf5be91cfb285ce" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "v_frame" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" -dependencies = [ - "aligned-vec", - "num-traits", - "wasm-bindgen", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version-compare" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "warnings" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f68998838dab65727c9b30465595c6f7c953313559371ca8bf31759b3680ad" -dependencies = [ - "pin-project", - "tracing", - "warnings-macro", -] - -[[package]] -name = "warnings-macro" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59195a1db0e95b920366d949ba5e0d3fc0e70b67c09be15ce5abb790106b0571" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasip2" -version = "1.0.4+wasi-0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.128" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef4c5d3d2cdf5c54f4231181768f5510842e350db025faf1f7163b1030ed928" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.128" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.128" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 3.0.6", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.128" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "web-sys" -version = "0.3.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbddc4a036f00ec4f18c83445bd3115cb306a91da554919a099d9222fe4a7f8" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webbrowser" -version = "1.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62c35be770821a214dbc362fc26908c853e776c0004294d0b10b8a6bad582f94" -dependencies = [ - "jni 0.22.4", - "log", - "ndk-context", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "url", - "web-sys", -] - -[[package]] -name = "webkit2gtk" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" -dependencies = [ - "bitflags 1.3.2", - "cairo-rs", - "gdk", - "gdk-sys", - "gio", - "gio-sys", - "glib", - "glib-sys", - "gobject-sys", - "gtk", - "gtk-sys", - "javascriptcore-rs", - "libc", - "once_cell", - "soup3", - "webkit2gtk-sys", -] - -[[package]] -name = "webkit2gtk-sys" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" -dependencies = [ - "bitflags 1.3.2", - "cairo-sys-rs", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "gtk-sys", - "javascriptcore-rs-sys", - "libc", - "pkg-config", - "soup3-sys", - "system-deps", -] - -[[package]] -name = "webview2-com" -version = "0.38.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" -dependencies = [ - "webview2-com-macros", - "webview2-com-sys", - "windows", - "windows-core", - "windows-implement", - "windows-interface", -] - -[[package]] -name = "webview2-com-macros" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "webview2-com-sys" -version = "0.38.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" -dependencies = [ - "thiserror 2.0.20", - "windows", - "windows-core", -] - -[[package]] -name = "weezl" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.61.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" -dependencies = [ - "windows-collections", - "windows-core", - "windows-future", - "windows-link 0.1.3", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" -dependencies = [ - "windows-core", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link 0.1.3", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-future" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" -dependencies = [ - "windows-core", - "windows-link 0.1.3", - "windows-threading", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-numerics" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core", - "windows-link 0.1.3", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link 0.2.1", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows-threading" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-version" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + "lock_api", + "parking_lot_core", +] [[package]] -name = "windows_i686_gnu" -version = "0.52.6" +name = "parking_lot_core" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] [[package]] -name = "windows_i686_gnu" -version = "0.53.1" +name = "portable-atomic" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" [[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" +name = "powerfmt" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +checksum = "4a6394b9e965e73d0a289ee54f589087e2c676aedf60885baf52c76b771e4958" [[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" +name = "proc-macro2" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] [[package]] -name = "windows_i686_msvc" -version = "0.42.2" +name = "quote" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] [[package]] -name = "windows_i686_msvc" -version = "0.52.6" +name = "ratatui" +version = "0.30.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +checksum = "3274ba0a2c5e1bcad2a2005d20f4dc59dad26b2eb0940fb094500dba4099d57d" +dependencies = [ + "instability", + "ratatui-core", + "ratatui-crossterm", + "ratatui-widgets", + "serde", +] [[package]] -name = "windows_i686_msvc" -version = "0.53.1" +name = "ratatui-core" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +checksum = "cbb175c433c8e28a809d1f5773a2ae96e68c0ce40db865cbab1020bf33ae479c" +dependencies = [ + "bitflags", + "compact_str", + "hashbrown 0.17.1", + "itertools", + "kasuari", + "lru", + "palette", + "serde", + "strum", + "thiserror", + "unicode-segmentation", + "unicode-truncate", + "unicode-width", +] [[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" +name = "ratatui-crossterm" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "567584a3b0e6a8203c23de40b4861497266725eb5363dbfd18a1edd603cca9f0" +dependencies = [ + "cfg-if", + "crossterm", + "instability", + "ratatui-core", +] [[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" +name = "ratatui-widgets" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +checksum = "66e3d19bcc9130ca376277d93b60767ff121ace3be06f5f95f81dd68956407d1" +dependencies = [ + "bitflags", + "hashbrown 0.17.1", + "indoc", + "instability", + "itertools", + "line-clipping", + "ratatui-core", + "serde", + "strum", + "time", + "unicode-segmentation", + "unicode-width", +] [[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" +name = "redox_syscall" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] [[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" +name = "rustc_version" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] [[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" +name = "rustix" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] [[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" +name = "rustversion" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" +name = "ryu" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" +name = "scopeguard" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" +name = "semver" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] -name = "winnow" -version = "0.5.40" +name = "serde" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ - "memchr", + "serde_core", + "serde_derive", ] [[package]] -name = "winnow" -version = "1.0.4" +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ - "memchr", + "serde_derive", ] [[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" - -[[package]] -name = "writeable" -version = "0.6.4" +name = "serde_derive" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] [[package]] -name = "wry" -version = "0.53.5" +name = "serde_json" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ - "base64", - "block2", - "cookie", - "crossbeam-channel", - "dirs", - "dpi", - "dunce", - "gtk", - "html5ever", - "http", - "javascriptcore-rs", - "jni 0.21.1", - "kuchikiki", - "libc", - "ndk", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "objc2-ui-kit", - "objc2-web-kit", - "once_cell", - "percent-encoding", - "raw-window-handle 0.6.2", - "sha2", - "soup3", - "tao-macros", - "thiserror 2.0.20", - "url", - "webkit2gtk", - "webkit2gtk-sys", - "webview2-com", - "windows", - "windows-core", - "windows-version", + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", ] [[package]] -name = "x11" -version = "2.21.0" +name = "signal-hook" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" dependencies = [ "libc", - "pkg-config", + "signal-hook-registry", ] [[package]] -name = "x11-dl" -version = "2.21.0" +name = "signal-hook-mio" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" dependencies = [ "libc", - "once_cell", - "pkg-config", + "mio", + "signal-hook", ] [[package]] -name = "x11rb" -version = "0.13.2" +name = "signal-hook-registry" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ - "gethostname", - "rustix", - "x11rb-protocol", + "errno", + "libc", ] [[package]] -name = "x11rb-protocol" -version = "0.13.2" +name = "smallvec" +version = "1.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" [[package]] -name = "xkeysym" -version = "0.2.1" +name = "static_assertions" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] -name = "y4m" -version = "0.8.0" +name = "strsim" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] -name = "yoke" -version = "0.8.3" +name = "strum" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", + "strum_macros", ] [[package]] -name = "yoke-derive" -version = "0.8.3" +name = "strum_macros" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33811428bee40dbceb6d545e95754741d17a6aef9a4849f0fd62e2ba4f412a78" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" dependencies = [ + "heck", "proc-macro2", "quote", - "syn 3.0.6", - "synstructure", + "syn 2.0.119", ] [[package]] -name = "zerocopy" -version = "0.8.57" +name = "syn" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d35102a9f36d089ccae9e4c6802bc118be4487b80aaffc0ab4e0cf5ce92d2873" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" dependencies = [ - "zerocopy-derive", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] -name = "zerocopy-derive" -version = "0.8.57" +name = "syn" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c01f5ab44258da43cf276c74a2763db2ff3969c9c652c3f2de07041d0b2bc" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "unicode-ident", ] [[package]] -name = "zerofrom" -version = "0.1.8" +name = "thiserror" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ - "zerofrom-derive", + "thiserror-impl", ] [[package]] -name = "zerofrom-derive" -version = "0.1.8" +name = "thiserror-impl" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" dependencies = [ "proc-macro2", "quote", "syn 3.0.6", - "synstructure", ] [[package]] -name = "zeroize" -version = "1.9.0" +name = "time" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +dependencies = [ + "deranged", + "libc", + "num-conv", + "num_threads", + "powerfmt", + "serde_core", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] -name = "zerotrie" -version = "0.2.5" +name = "unicode-ident" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" [[package]] -name = "zerovec" -version = "0.11.8" +name = "unicode-segmentation" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] -name = "zerovec-derive" -version = "0.11.6" +name = "unicode-truncate" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" +checksum = "16b380a1238663e5f8a691f9039c73e1cdae598a30e9855f541d29b08b53e9a5" dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.6", + "itertools", + "unicode-segmentation", + "unicode-width", ] [[package]] -name = "zlib-rs" -version = "0.6.8" +name = "unicode-width" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] -name = "zune-core" -version = "0.5.3" +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56377fd46368984a170bc5aac5567e52ca5da874caa60bea39fcbca78fb658b" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "zune-inflate" -version = "0.2.54" +name = "winapi" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ - "simd-adler32", + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", ] [[package]] -name = "zune-jpeg" -version = "0.5.15" +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "zune-core", + "windows-link", ] diff --git a/examples/local-triage/renderers/Cargo.toml b/examples/local-triage/renderers/Cargo.toml index a4ce2acc..15bd4a53 100644 --- a/examples/local-triage/renderers/Cargo.toml +++ b/examples/local-triage/renderers/Cargo.toml @@ -9,12 +9,10 @@ publish = false [features] default = ["tui"] tui = ["dep:ratatui", "dep:crossterm"] -desktop = ["dep:dioxus", "dioxus/desktop"] [dependencies] serde = { version = "=1.0.228", features = ["derive"] } serde_json = "=1.0.145" -dioxus = { version = "=0.7.10", optional = true, default-features = false, features = ["macro", "html", "signals", "hooks", "launch"] } ratatui = { version = "=0.30.2", optional = true, default-features = false, features = ["crossterm", "crossterm_0_29", "unstable-rendered-line-info"] } crossterm = { version = "=0.29.0", optional = true } @@ -23,11 +21,6 @@ name = "triage-tui" path = "src/bin/tui.rs" required-features = ["tui"] -[[bin]] -name = "triage-desktop" -path = "src/bin/desktop.rs" -required-features = ["desktop"] - [profile.release] opt-level = "s" lto = true diff --git a/examples/local-triage/renderers/README.md b/examples/local-triage/renderers/README.md index 8cd02ab9..1248d8d2 100644 --- a/examples/local-triage/renderers/README.md +++ b/examples/local-triage/renderers/README.md @@ -1,64 +1,33 @@ # Local triage renderers and package -This isolated Rust workspace renders the local-triage captured DTO in a Dioxus -desktop app (system WebView) and a Ratatui terminal application. Both invoke a -bounded local `triage-host` executable with argv and JSON files. They do not +This isolated Rust workspace renders the local-triage captured DTO in a +Ratatui terminal application. The renderer invokes a +bounded local `triage-host` executable with argv and JSON files. It does not invoke a shell, execute model text, make network requests, or substitute a cloud provider. Policy, update and migration semantics stay in ALGAL. ```sh -cargo build --manifest-path examples/local-triage/renderers/Cargo.toml --locked --offline --features desktop -cargo test --manifest-path examples/local-triage/renderers/Cargo.toml --locked --features desktop -cargo clippy --manifest-path examples/local-triage/renderers/Cargo.toml --locked --all-targets --features desktop -- -D warnings +cargo build --manifest-path examples/local-triage/renderers/Cargo.toml --locked --offline +cargo test --manifest-path examples/local-triage/renderers/Cargo.toml --locked +cargo clippy --manifest-path examples/local-triage/renderers/Cargo.toml --locked --all-targets -- -D warnings cargo fmt --manifest-path examples/local-triage/renderers/Cargo.toml --all -- --check ``` On a Hraness machine, run build/native/packaging work through the installed -`host-run`, using the `mac-native` lane for desktop builds and packaging. +`host-run`, using the `mac-native` lane for packaging. `--target-dir examples/malleable-site/renderers/target` reuses the existing isolated renderer cache without adding dependencies to the root Rust workspace. -## Desktop - -The task pane supports add/edit, priorities, categories after v2 migration, -complete/reopen, title search, filtering and ordering explanations. Form fields -and task rows have stable keys. Composition events defer command, navigation, -refresh and adoption controls until text composition ends. Shared session -fixtures cover added fields, changed kind/parent, removal and unchanged identity; -all retain draft text, with explicit rebasing and incompatible focus clearing. -Text fields keep their live DOM value across delayed WebView messages; only -explicit draft replacement remounts the editor. Dropdowns initialize each -option's selection before mounting. Native mutation-stream regressions cover -rapid text echoes, deliberate replacement and nonfirst default options. -Typing changes only the session draft; no -inference or authoritative write occurs on a keystroke. **Save draft before -closing**. Submit writes a typed exact-head command, clears the successfully -submitted draft and saves that session. - -The workflow pane previews sorting, grouping, reopening and schema revisions, -shows independent checks, and explicitly adopts a candidate. Captured facts and -candidate presentation stay separate. The portability pane exports immutable -evidence, imports without adoption and forks into a new identity. Field-conflict -review/resolution remains in the bundled CLI; this UI never silently merges. - -A stale captured state retains the draft and exposes explicit refresh/rebase. -Concurrent saves fail their session compare-and-set. Loading the saved draft is -an explicit discard of unsaved edits. The host rejects corrupt retained session -files and preserves them for reconciliation. - -Apple inference is an explicit button and instruction field in the workflow -pane. It selects only bundled sibling `algal-native` / `algal-apple` binaries and -creates a fresh bounded attempt directory for that click. The UI runs the call on a -worker thread, retains the live draft, evaluates the returned proposal, and -requires a separate adoption. It never retries an admitted attempt or falls -back to network inference. A changed application head can reject evaluation; -the model attempt remains retained for inspection. Typing never starts a call. +The earlier Dioxus desktop renderer was removed: its WebView, GTK and servo +dependency tree dominated this workspace's lockfile while carrying advisories +the example could not reach a fix for. The packaged artifact is now the +terminal application plus the standalone host. ## Terminal Run `triage-tui [--host PATH] [--dir DIRECTORY] [--application ID]`. `--snapshot` prints the actual captured task/draft view without opening an interactive -terminal. The same flags work for `triage-desktop`. +terminal. | Key | Action | | --- | --- | @@ -79,9 +48,8 @@ terminal. The same flags work for `triage-desktop`. | `x`, `o`, `b`, `i` | export / verify-import / fork / import model proposal | | `q`, Ctrl-Q | save-and-quit / quit keeping only the saved draft | -The TUI imports model proposals produced by the bundled host CLI. The desktop -also offers the explicit on-device call. Both use the same authoritative -captured semantic tree, command admission and bounded state. +The TUI imports model proposals produced by the bundled host CLI. It uses the +authoritative captured semantic tree, command admission and bounded state. ## Standalone macOS arm64 artifact @@ -100,9 +68,8 @@ must be fresh; the script never overwrites an existing artifact directory. The archive contains: -- `ALGAL Triage.app`: Dioxus desktop executable and bundled standalone host. - `bin/triage-tui` and `bin/triage-host`: independently runnable terminal/CLI. -- Optional `algal-native` / `algal-apple` siblings, also in app Resources/bin. +- Optional `algal-native` / `algal-apple` siblings. - `manifest.json`: exact executable/file sizes and SHA-256 hashes, evaluator hash, platform, signing and inference requirements. It also records the Git HEAD and dirty status at assembly, Bun/Rust versions, build flags and a @@ -114,13 +81,12 @@ The compiled host embeds Bun and the committed expression WASM. Fresh-extraction smoke runs the host with no project/tool directories on PATH, initializes and reopens facts, retries commands, saves/restores drafts, migrates schema, replays exports, forks, renders the TUI, serves the same captured application -through its authenticated loopback web host, verifies hashes, checks that -executables link only macOS system libraries and verifies the app's ad-hoc -signature. It does not qualify window interaction or network denial; -those require the separate native acceptance run. +through its authenticated loopback web host, verifies hashes, and checks that +executables link only macOS system libraries. It does not qualify network denial; +that requires the separate native acceptance run. -The package is ad-hoc signed, **not notarized**. The UI targets macOS arm64 and -uses its system WebView. On-device Apple inference additionally requires macOS +The package is unsigned. The TUI targets macOS arm64 in this artifact. +On-device Apple inference additionally requires macOS 26+, compatible Apple Silicon, enabled Apple Intelligence and downloaded model assets. The shipped source is cross-platform for the TUI, but this packaging script qualifies only the explicit macOS artifact. There is no mobile signing, diff --git a/examples/local-triage/renderers/performance/README.md b/examples/local-triage/renderers/performance/README.md index 02198dbf..02c574b9 100644 --- a/examples/local-triage/renderers/performance/README.md +++ b/examples/local-triage/renderers/performance/README.md @@ -41,10 +41,13 @@ not a terminal emulator's presentation latency. The earlier [Dioxus Web spike](../../../malleable-site/renderers/measurement.json) weighed 362,713 raw / 148,449 gzip bytes. It is a passive captured-tree renderer, -so this is not an equivalent interactive workload comparison. Keep the measured -lightweight embed for sites and Dioxus for the packaged desktop. An interactive -Dioxus Web port remains a separate decision requiring equivalent behavior and -measurements; no performance advantage is inferred from the passive spike. +so this is not an equivalent interactive workload comparison. + +The Dioxus desktop renderer and its WebView/GTK/servo dependency tree were +subsequently removed: the example could not reach fixes for advisories the tree +carried. The desktop rows and the CUA/native observer scripts that produced them +are retained here only as this dated record; the package is now the terminal +application plus the standalone host. ## Reproduce @@ -66,23 +69,7 @@ host-run --mode=shared --lane=mac-native --label=algal-renderer-performance-host PACKAGE_ROOT FRESH_ACTION_OUTPUT ``` -Resolve these tools to installed absolute paths for reviewed host access. The -first native observer lacked inherited accessibility permission; its report -preserves unavailable desktop checks and a failing aggregate status. It made no -permission request. Actual desktop measurements instead used the authorized CUA -service while [cua-lease.ts](cua-lease.ts) held `mac-native` custody, launched the -exact package with the generated state, and sampled only that process's RSS: - -```sh -host-run --mode=shared --lane=mac-native --label=algal-renderer-performance-cua -- \ - bun examples/local-triage/renderers/performance/cua-lease.ts \ - PACKAGE_ROOT INITIALIZED_STATE FRESH_CUA_OUTPUT -``` - -The CUA observer recorded launch-to-visible content as an upper bound, then -alternated Complete/Reopen twenty times, locating controls in each fresh -accessibility tree and checking the resulting status. It recorded each -click-plus-observation duration and quit normally. The process sampler did not -synthesize UI events. Preserve failed/unavailable reports alongside successful +Resolve these tools to installed absolute paths for reviewed host access. +Preserve failed/unavailable reports alongside successful diagnostics. Raw local receipts are identified by name and SHA-256 in the summary; they remain outside the repository with the package qualification evidence. diff --git a/examples/local-triage/renderers/performance/browser.ts b/examples/local-triage/renderers/performance/browser.ts index 05b11e4e..40ca5c6f 100644 --- a/examples/local-triage/renderers/performance/browser.ts +++ b/examples/local-triage/renderers/performance/browser.ts @@ -71,7 +71,7 @@ try { check("Additional gzip embed assets", gzipBytes <= budgets.browser.additionalGzipBytesMax, gzipBytes, budgets.browser.additionalGzipBytesMax); check("No browser runtime errors", pageErrors.length === 0, pageErrors); const spike = JSON.parse(await readFile(new URL("../../../malleable-site/renderers/measurement.json", import.meta.url), "utf8")) as { artifacts: { webReleaseTotalBytes: number; webRelease: { gzipBytes: number }[] } }; - const report = { contract: "algal.renderer-browser-performance.v1", ok: checks.every(item => item.passed), declaration, browser: await browser.version(), startup, update, memory, checks, dioxusWeb: { rawBytes: spike.artifacts.webReleaseTotalBytes, gzipBytes: spike.artifacts.webRelease.reduce((n, file) => n + file.gzipBytes, 0), decision: "Keep the qualified lightweight embed and Dioxus desktop. The Dioxus Web spike is passive, so its payload is not an interactive apples-to-apples comparison." }, limitations: ["Local cold browser contexts and uncompressed loopback transport; no WAN or device-fleet claim", "Startup starts before module import and ends at the first animation frame after both mounts; static fallback precedes import", "Update timings cover synchronous VM evaluation and DOM patching, not complete paint latency", "Heap qualification is post-GC JavaScript retention; it is not a proof of total native/WASM memory behavior", "Measured host interference covers the sentinel, outside draft, route and independent mount in the declared harness"] }; + const report = { contract: "algal.renderer-browser-performance.v1", ok: checks.every(item => item.passed), declaration, browser: await browser.version(), startup, update, memory, checks, dioxusWeb: { rawBytes: spike.artifacts.webReleaseTotalBytes, gzipBytes: spike.artifacts.webRelease.reduce((n, file) => n + file.gzipBytes, 0), decision: "Keep the qualified lightweight embed. The Dioxus renderers were removed over their WebView/GTK/servo dependency advisories. The recorded Dioxus Web spike is passive, so its payload is not an interactive apples-to-apples comparison." }, limitations: ["Local cold browser contexts and uncompressed loopback transport; no WAN or device-fleet claim", "Startup starts before module import and ends at the first animation frame after both mounts; static fallback precedes import", "Update timings cover synchronous VM evaluation and DOM patching, not complete paint latency", "Heap qualification is post-GC JavaScript retention; it is not a proof of total native/WASM memory behavior", "Measured host interference covers the sentinel, outside draft, route and independent mount in the declared harness"] }; await writeFile(join(output, "result.json"), JSON.stringify(report, null, 2) + "\n", { flag: "wx" }); console.log(JSON.stringify({ ok: report.ok, report: join(output, "result.json"), checks: checks.map(({ name, passed, maximum }) => ({ name, passed, maximum })), startup, update, memory, rawBytes, gzipBytes })); if (!report.ok) process.exitCode = 1; diff --git a/examples/local-triage/renderers/performance/cua-lease.ts b/examples/local-triage/renderers/performance/cua-lease.ts deleted file mode 100644 index ba7bfe6c..00000000 --- a/examples/local-triage/renderers/performance/cua-lease.ts +++ /dev/null @@ -1,40 +0,0 @@ -/** Hold scheduled native custody while the authorized CUA service observes the - * exact packaged app. A delayed launch lets the observer be ready before start. - * This driver synthesizes no UI events and requests no accessibility permission. */ -import { readFile, writeFile, mkdir } from "node:fs/promises"; -import { join, resolve } from "node:path"; -import { createHash } from "node:crypto"; -import budgets from "./budgets.json"; - -const [packageArg, stateArg, outputArg] = process.argv.slice(2); -if (!packageArg || !stateArg || !outputArg) throw new Error("Usage: bun cua-lease.ts PACKAGE_ROOT INITIALIZED_STATE FRESH_OUTPUT"); -const pkg = resolve(packageArg), state = resolve(stateArg), output = resolve(outputArg), executable = join(pkg, "ALGAL Triage.app/Contents/MacOS/triage-desktop"); -await mkdir(output, { recursive: true }); -const hash = (bytes: Uint8Array) => createHash("sha256").update(bytes).digest("hex"); -const manifest = JSON.parse(await readFile(join(pkg, "manifest.json"), "utf8")) as { provenance: { gitHead: string; source: { sha256: string } }; files: { path: string; sha256: string }[] }; -const identity = hash(await readFile(executable)); -if (!manifest.files.some(file => file.path === "ALGAL Triage.app/Contents/MacOS/triage-desktop" && file.sha256 === identity)) throw new Error("Package identity mismatch"); -await writeFile(join(output, "declaration.json"), JSON.stringify({ budgets, budgetsSha256: hash(await readFile(new URL("./budgets.json", import.meta.url))), scriptSha256: hash(await readFile(import.meta.path)), declaredAt: new Date().toISOString(), packageCommit: manifest.provenance.gitHead, packageSource: manifest.provenance.source.sha256, desktopSha256: identity, method: "Exact packaged app launch and main-process RSS; interactions and visible readiness observed only through authorized CUA service" }, null, 2) + "\n", { flag: "wx" }); -console.log(JSON.stringify({ armed: true, launchDelayMs: 6000, output })); -await new Promise(resolve => setTimeout(resolve, 6000)); -const startedEpochMs = Date.now(); -const child = Bun.spawn([executable, "--dir", state, "--application", "performance"], { stdin: "ignore", stdout: "ignore", stderr: "ignore" }); -await writeFile(join(output, "started.json"), JSON.stringify({ pid: child.pid, startedEpochMs, tasks: budgets.local.tasks }) + "\n", { flag: "wx" }); -console.log(JSON.stringify({ pid: child.pid, startedEpochMs })); -const samples: { epochMs: number; rssBytes: number }[] = []; -let reading = false; -const sample = async () => { - if (reading || child.exitCode !== null) return; - reading = true; - try { - const probe = Bun.spawn(["/bin/ps", "-o", "rss=", "-p", String(child.pid)], { stdout: "pipe", stderr: "ignore" }); - const rssBytes = Number((await new Response(probe.stdout).text()).trim()) * 1024; - if (await probe.exited === 0 && Number.isFinite(rssBytes) && rssBytes > 0) samples.push({ epochMs: Date.now(), rssBytes }); - } finally { reading = false; } -}; -const timer = setInterval(() => { void sample(); }, 500); -const deadline = setTimeout(() => child.kill("SIGTERM"), 180000); -try { await child.exited; } finally { clearInterval(timer); clearTimeout(deadline); } -while (reading) await new Promise(resolve => setTimeout(resolve, 10)); -await writeFile(join(output, "process.json"), JSON.stringify({ startedEpochMs, exitedEpochMs: Date.now(), exitCode: child.exitCode, samples, memoryScope: "Main process RSS only; separately managed WebKit processes excluded" }, null, 2) + "\n", { flag: "wx" }); -console.log(JSON.stringify({ closed: true, output, samples: samples.length })); diff --git a/examples/local-triage/renderers/performance/native.swift b/examples/local-triage/renderers/performance/native.swift deleted file mode 100644 index 248b612e..00000000 --- a/examples/local-triage/renderers/performance/native.swift +++ /dev/null @@ -1,83 +0,0 @@ -import AppKit -import ApplicationServices -import Foundation - -// Read only this task-owned application's accessibility tree. Never request a -// new permission, inspect another app, or use inference to perform the actions. -func attribute(_ node: AXUIElement, _ name: CFString) -> CFTypeRef? { - var value: CFTypeRef? - return AXUIElementCopyAttributeValue(node, name, &value) == .success ? value : nil -} -func nodes(_ root: AXUIElement) -> [AXUIElement] { - var result: [AXUIElement] = [] - var queue: [(AXUIElement, Int)] = [(root, 0)] - var cursor = 0 - while cursor < queue.count && cursor < 4096 { - let (node, depth) = queue[cursor]; cursor += 1; result.append(node) - if depth < 24, let children = attribute(node, kAXChildrenAttribute as CFString) as? [AXUIElement] { - for child in children.prefix(256) { queue.append((child, depth + 1)) } - } - } - return result -} -func text(_ node: AXUIElement) -> [String] { - [kAXTitleAttribute, kAXValueAttribute, kAXDescriptionAttribute].compactMap { - attribute(node, $0 as CFString) as? String - } -} -func button(_ nodes: [AXUIElement], _ label: String) -> AXUIElement? { - nodes.first { (attribute($0, kAXRoleAttribute as CFString) as? String) == kAXButtonRole && text($0).contains(label) } -} -func waitFor(_ predicate: () -> Bool, seconds: Double = 8) -> Bool { - let deadline = ProcessInfo.processInfo.systemUptime + seconds - repeat { if predicate() { return true }; Thread.sleep(forTimeInterval: 0.02) } - while ProcessInfo.processInfo.systemUptime < deadline - return false -} -func rss(_ pid: Int32) -> Int { - let process = Process(); process.executableURL = URL(fileURLWithPath: "/bin/ps") - process.arguments = ["-o", "rss=", "-p", String(pid)] - let pipe = Pipe(); process.standardOutput = pipe; process.standardError = FileHandle.nullDevice - do { try process.run(); let bytes = pipe.fileHandleForReading.readDataToEndOfFile(); process.waitUntilExit() - return (Int(String(decoding: bytes, as: UTF8.self).trimmingCharacters(in: .whitespacesAndNewlines)) ?? 0) * 1024 - } catch { return 0 } -} -func emit(_ object: [String: Any], code: Int32) -> Never { - if let bytes = try? JSONSerialization.data(withJSONObject: object, options: [.sortedKeys]) { - print(String(decoding: bytes, as: UTF8.self)) - } - exit(code) -} -guard CommandLine.arguments.count == 4, - let pid = Int32(CommandLine.arguments[1]), - let started = Double(CommandLine.arguments[2]), - let count = Int(CommandLine.arguments[3]), count > 0 && count <= 24 else { - emit(["ok": false, "reason": "Expected PID, start epoch milliseconds and at most 24 actions"], code: 2) -} -guard AXIsProcessTrusted() else { - emit(["ok": false, "available": false, "reason": "Inherited accessibility permission unavailable; no permission prompt was requested"], code: 2) -} -let app = AXUIElementCreateApplication(pid) -guard waitFor({ nodes(app).contains { text($0).contains { $0.contains("Performance task") } } }, seconds: 12) else { - emit(["ok": false, "available": true, "reason": "Task content did not become accessibility-visible within the readiness deadline"], code: 3) -} -let readyMs = Date().timeIntervalSince1970 * 1000 - started -let beforeRss = rss(pid) -var elapsed: [Double] = [] -for index in 0.. createHash("sha256").update(bytes).digest("hex"); const manifest = JSON.parse(await readFile(join(pkg, "manifest.json"), "utf8")) as { provenance: { gitHead: string; source: { sha256: string } }; files: { path: string; sha256: string }[] }; -const declared = { contract: "algal.renderer-performance-declaration.v1", declaredAt: new Date().toISOString(), budgets, budgetsSha256: hash(await readFile(new URL("./budgets.json", import.meta.url))), scriptSha256: hash(await readFile(import.meta.path)), helperSha256: hash(await readFile(new URL("./native.swift", import.meta.url))), packageSource: manifest.provenance.source.sha256, gitHead: manifest.provenance.gitHead }; +const declared = { contract: "algal.renderer-performance-declaration.v1", declaredAt: new Date().toISOString(), budgets, budgetsSha256: hash(await readFile(new URL("./budgets.json", import.meta.url))), scriptSha256: hash(await readFile(import.meta.path)), packageSource: manifest.provenance.source.sha256, gitHead: manifest.provenance.gitHead }; await writeFile(join(directory, "declaration.json"), JSON.stringify(declared, null, 2) + "\n", { flag: "wx" }); const checks: { name: string; passed: boolean; observed: unknown; maximum?: number }[] = []; const check = (name: string, passed: boolean, observed: unknown, maximum?: number) => checks.push({ name, passed, observed, ...(maximum === undefined ? {} : { maximum }) }); @@ -24,7 +24,7 @@ async function command(args: string[], deadlineMs = 30000) { return { stdout, stderr, status, ms: performance.now() - started }; } finally { clearTimeout(deadline); if (child.exitCode === null) child.kill("SIGKILL"); await child.exited; } } -for (const path of ["bin/triage-host", "bin/triage-tui", "ALGAL Triage.app/Contents/MacOS/triage-desktop"]) { +for (const path of ["bin/triage-host", "bin/triage-tui"]) { const expected = manifest.files.find(file => file.path === path); if (!expected || hash(await readFile(join(pkg, path))) !== expected.sha256) throw new Error("Package identity mismatch"); } @@ -50,21 +50,7 @@ const host = quantiles(hostSamples), terminal = quantiles(terminalSamples); check("Packaged host cold process capture p95", host.p95 <= budgets.local.hostCaptureP95MsMax, host, budgets.local.hostCaptureP95MsMax); check("Packaged TUI process-to-complete-snapshot p95", terminal.p95 <= budgets.local.terminalStartupP95MsMax, terminal, budgets.local.terminalStartupP95MsMax); check("CLI/TUI Darwin peak resident bytes", Math.max(...peakRss) <= budgets.local.processPeakRssBytesMax, peakRss, budgets.local.processPeakRssBytesMax); -const helper = join(directory, "native-observer"); -const compiled = await command(["/usr/bin/xcrun", "swiftc", new URL("./native.swift", import.meta.url).pathname, "-o", helper], 60000); -if (compiled.status !== 0) throw new Error(compiled.stderr); -const started = Date.now(), desktop = Bun.spawn([join(pkg, "ALGAL Triage.app/Contents/MacOS/triage-desktop"), "--dir", state, "--application", "performance"], { cwd: directory, stdin: "ignore", stdout: "ignore", stderr: "ignore" }); -let native: { ok: boolean; available: boolean; reason?: string; readyMs?: number; actionsMs?: number[]; mainProcessRssBeforeBytes?: number; mainProcessRssAfterBytes?: number }; -try { - const observed = await command([helper, String(desktop.pid), String(started), String(budgets.local.desktopActions)], 210000); - native = JSON.parse(observed.stdout); -} finally { if (desktop.exitCode === null) desktop.kill("SIGTERM"); await desktop.exited; } -check("Desktop content becomes accessibility-visible", native.ok && native.readyMs !== undefined && native.readyMs <= budgets.local.desktopReadyMsMax, native.readyMs ?? native.reason, budgets.local.desktopReadyMsMax); -const actions = native.actionsMs?.length ? quantiles(native.actionsMs) : null; -check("Desktop complete/reopen action p95 including AX observation", native.ok && actions !== null && actions.p95 <= budgets.local.desktopActionP95MsMax, actions, budgets.local.desktopActionP95MsMax); -const growth = native.mainProcessRssAfterBytes !== undefined && native.mainProcessRssBeforeBytes !== undefined ? native.mainProcessRssAfterBytes - native.mainProcessRssBeforeBytes : null; -check("Desktop main-process retained growth after task updates", native.ok && growth !== null && growth <= budgets.local.desktopMainRssGrowthBytesMax, growth, budgets.local.desktopMainRssGrowthBytesMax); -const report = { contract: "algal.renderer-native-performance.v1", ok: checks.every(item => item.passed), declaration: declared, platform: { platform: process.platform, arch: process.arch }, initMs: init.ms, host, terminal, native, checks, limitations: ["Local development Mac and bounded 32-task profile only; not a production SLO or cross-platform benchmark", "CLI/TUI memory is Darwin time maximum resident size; desktop growth covers its main process only, excluding separately managed WebKit processes", "Desktop action latency includes bounded accessibility-tree observation overhead", "No model call, provider network operation or generated revision occurred in this measurement"] }; +const report = { contract: "algal.renderer-native-performance.v1", ok: checks.every(item => item.passed), declaration: declared, platform: { platform: process.platform, arch: process.arch }, initMs: init.ms, host, terminal, checks, limitations: ["Local development Mac and bounded 32-task profile only; not a production SLO or cross-platform benchmark", "CLI/TUI memory is Darwin time maximum resident size", "No model call, provider network operation or generated revision occurred in this measurement"] }; await writeFile(join(directory, "result.json"), JSON.stringify(report, null, 2) + "\n", { flag: "wx" }); console.log(JSON.stringify({ ok: report.ok, report: join(directory, "result.json"), checks })); if (!report.ok) process.exitCode = 1; diff --git a/examples/local-triage/renderers/src/bin/desktop.rs b/examples/local-triage/renderers/src/bin/desktop.rs deleted file mode 100644 index ef00cc6d..00000000 --- a/examples/local-triage/renderers/src/bin/desktop.rs +++ /dev/null @@ -1,439 +0,0 @@ -use algal_triage_renderers::{Model, Options, Result}; -use dioxus::prelude::*; -use serde_json::json; -use std::{ - sync::{Arc, Mutex}, - task::{Poll, Waker}, -}; - -fn main() { - dioxus::LaunchBuilder::desktop() - .with_cfg( - dioxus::desktop::Config::new().with_window( - dioxus::desktop::WindowBuilder::new() - .with_title("ALGAL Triage") - .with_inner_size(dioxus::desktop::LogicalSize::new(1120.0, 820.0)), - ), - ) - .launch(app); -} -type State = Signal>; -fn run(mut state: State, composing: bool, action: impl FnOnce(&mut Model) -> Result<()>) { - if composing { - return; - } - if let Ok(model) = state.write().as_mut() - && let Err(error) = action(model) - { - model.message = error; - } -} -fn edit(mut state: State, action: impl FnOnce(&mut Model)) { - if let Ok(model) = state.write().as_mut() { - action(model); - model.dirty = true; - } -} -// Native input events cross an asynchronous WebView bridge. Echoing `value` -// back on each render can overwrite text that the browser has already accepted. -// Draft replacement is explicit; ordinary typing/refresh/adoption keeps nodes. -fn replace_draft( - mut state: State, - composing: bool, - mut generation: Signal, - action: impl FnOnce(&mut Model) -> Result<()>, -) { - if composing { - return; - } - if let Ok(model) = state.write().as_mut() { - let before = model.session.clone(); - if let Err(error) = action(model) { - model.message = error; - } - if model.session.draft != before.draft || model.session.query != before.query { - generation += 1; - } - } -} - -fn submit_form(model: &mut Model, event: &FormEvent) -> Result<()> { - for (name, destination) in [ - ("title", &mut model.session.draft.title), - ("priority", &mut model.session.draft.priority), - ("category", &mut model.session.draft.category), - ] { - if let Some(FormValue::Text(value)) = event.get_first(name) { - *destination = value; - } - } - model.submit() -} - -#[component] -fn LocalSelect( - value: String, - choices: Vec<(String, String)>, - oninput: EventHandler, - name: String, -) -> Element { - rsx! { - select { name, onchange: move |event| oninput.call(event), - for (option, label) in choices { - option { key: "{option}", value: "{option}", initial_selected: value == option, "{label}" } - } - } - } -} - -#[component] -fn LocalText( - value: String, - name: String, - limit: i64, - placeholder: String, - kind: String, - oninput: EventHandler, -) -> Element { - rsx! { - input { name: "{name}", "aria-label": "{name}", r#type: "{kind}", initial_value: "{value}", maxlength: limit, placeholder, autocomplete: "off", oninput: move |event| oninput.call(event) } - } -} -fn generate_apple( - mut state: State, - mut busy: Signal, - instruction: String, - composing: Signal, - mut pending: Signal>>, -) { - if busy() { - return; - } - let Ok(model) = state.read().clone() else { - return; - }; - busy.set(true); - if let Ok(m) = state.write().as_mut() { - m.message = - "One on-device proposal attempt is running. Typing does not invoke inference.".into(); - } - type Completion = (Option>, Option); - let shared = Arc::new(Mutex::new((None, None) as Completion)); - let writer = shared.clone(); - std::thread::spawn(move || { - let result = model - .options - .apple_options(&instruction) - .and_then(|options| { - model - .options - .call(&["propose-apple", "@json"], Some(&options)) - }) - .and_then(|value| { - let proposal = value.get("proposal").ok_or("Missing model proposal")?; - model - .options - .call(&["propose-evaluate", "@json"], Some(proposal)) - }); - if let Ok(mut completed) = writer.lock() { - completed.0 = Some(result); - if let Some(waker) = completed.1.take() { - waker.wake(); - } - } - }); - spawn(async move { - let result = std::future::poll_fn(|cx| { - let Ok(mut completed) = shared.lock() else { - return Poll::Ready(Err("Inference completion lock failed".into())); - }; - if let Some(result) = completed.0.take() { - Poll::Ready(result) - } else { - completed.1 = Some(cx.waker().clone()); - Poll::Pending - } - }) - .await; - busy.set(false); - if composing() { - pending.set(Some(result)); - } else { - apply_apple_completion(state, result); - } - }); -} - -fn apply_apple_completion(mut state: State, result: Result) { - if let Ok(model) = state.write().as_mut() { - match result.and_then(|value| serde_json::from_value(value).map_err(|e| e.to_string())) { - Ok(preview) => { - model.preview = Some(preview); - model.message = "On-device proposal retained and evaluated. Inspect it before explicit adoption; your draft is unchanged.".into(); - } - Err(error) => { - model.message = - format!("No automatic retry. Inspect the retained inference attempt: {error}") - } - } - } -} - -fn app() -> Element { - let state = use_signal(|| Options::parse().and_then(Model::open)); - let mut panel = use_signal(|| "tasks".to_owned()); - let busy = use_signal(|| false); - let mut composing = use_signal(|| false); - let draft_generation = use_signal(|| 0u64); - let mut pending: Signal>> = use_signal(|| None); - let mut instruction = - use_signal(|| "Put urgent open tasks first while keeping every task.".to_owned()); - let current = state.read().clone(); - let model = match current { - Ok(model) => model, - Err(error) => { - return rsx! { style { "{STYLE}" } main { class: "startup", h1 { "Local triage" } p { "The local host could not open this application." } pre { "{error}" } p { "Existing state has been preserved. Inspect the host error before reopening." } } }; - } - }; - let capture = &model.capture; - let draft = &model.session.draft; - let stale = model.stale; - let groups = capture.view.groups.clone(); - let fields = capture.view.form.fields.clone(); - let filters = capture.view.filters.clone(); - rsx! { - style { "{STYLE}" } - main { - oncompositionstart: move |_| composing.set(true), - oncompositionend: move |_| { composing.set(false); let result = pending.write().take(); if let Some(result) = result { apply_apple_completion(state, result); } }, - header { - div { p { class: "eyebrow", "ALGAL · LOCAL APPLICATION" } h1 { "Local triage" } p { class: "subtitle", "A small place to think. A workflow you can change." } } - div { class: "capacity", strong { "{capture.capacity.tasks}" } span { "task slots remaining" } small { "{capture.capacity.states} changes available" } } - } - nav { "aria-label": "Workspace", - for (value, label) in [("tasks", "Tasks"), ("evolve", "Evolve workflow"), ("portable", "History & portability")] { - button { key: "{value}", class: if panel() == value { "tab active" } else { "tab" }, onclick: move |_| { if !composing() { panel.set(value.into()); } }, "{label}" } - } - button { class: "quiet refresh", onclick: move |_| run(state, composing(), Model::refresh), "Refresh" } - } - section { class: "notice", role: "status", "{model.message}" } - if stale { - section { class: "stale", strong { "Your draft needs review." } p { "Inspect refreshed task facts, then explicitly rebase the retained draft. A newer saved draft is never overwritten." } - button { onclick: move |_| run(state, composing(), |m| m.save(true)), "Rebase draft" } - button { class: "quiet", onclick: move |_| replace_draft(state, composing(), draft_generation, Model::reload_draft), "Discard unsaved edits & load saved draft" } - } - } - if panel() == "tasks" { - div { class: "workspace", - section { class: "tasks", - div { class: "tools", - div { class: "filters", for f in filters { button { key: "{f.value}", class: if f.selected { "pill selected" } else { "pill" }, onclick: move |_| { let value = f.value.clone(); run(state, composing(), |m| m.filter(&value)); }, "{f.label}" } } } - form { onsubmit: move |event| { event.prevent_default(); if composing() { return; } run(state, composing(), Model::refresh); }, - for generation in [draft_generation()] { - LocalText { key: "query-{generation}", kind: "search", name: "Filter task titles", placeholder: "Filter titles…", value: model.session.query.clone(), limit: 120, oninput: move |event: FormEvent| edit(state, |m| { m.session.query = event.value(); m.session.focused_field = Some("query".into()); }) } - } - button { class: "quiet", r#type: "submit", "Apply" } - } - } - if groups.is_empty() { div { class: "empty", h2 { "Room for your next thought." } p { "Add a task, or adjust the current filter." } } } - for group in groups { - section { key: "{group.id}", class: "task-group", h2 { "{group.label}" } - for row in group.tasks { - article { key: "{row.task.id}", class: if row.task.status == "done" { "task done" } else { "task" }, - div { class: "task-copy", h3 { "{row.task.title}" } div { class: "tags", span { class: "priority {row.task.priority}", "{row.task.priority}" } if capture.definition.schema_version == 2 { span { "{row.task.category}" } } span { "{row.task.status}" } } - details { summary { "Why here?" } p { "{capture.view.ordering}" } code { "{row.task.id}" } } - } - div { class: "task-actions", - for action in row.actions { - if action.kind == "edit" || action.enabled { - button { key: "{action.kind}", class: "quiet", disabled: !action.enabled || stale || composing(), onclick: { let task = row.task.clone(); let kind = action.kind.clone(); move |_| { let task = task.clone(); let kind = kind.clone(); if kind == "edit" { replace_draft(state, composing(), draft_generation, |m| { m.edit(&task); Ok(()) }); } else { run(state, composing(), |m| { m.action(json!({ "kind":kind, "taskId":task.id }))?; m.refresh() }); } } }, "{action.label}" } - } - } - } - } - } - } - } - } - aside { class: "editor", h2 { if draft.task_id.is_some() { "Edit task" } else { "New task" } } - p { class: "muted", "Your draft is separate from the saved task." } - form { onsubmit: move |event| { event.prevent_default(); if composing() { return; } replace_draft(state, composing(), draft_generation, |m| submit_form(m, &event)); }, - for field in fields { - label { key: "{field.name}-{draft_generation}", "{field.label}" - if field.name == "priority" { - LocalSelect { name: "priority", value: draft.priority.clone(), choices: field.options.iter().map(|option| (option.clone(), option.clone())).collect(), oninput: move |event: FormEvent| edit(state, |m| { m.session.draft.priority = event.value(); m.session.focused_field = Some("priority".into()); }) - } - } else if field.name == "title" { - LocalText { kind: "text", name: "title", value: draft.title.clone(), limit: field.max_length as i64, placeholder: "What needs your attention?", oninput: move |event: FormEvent| edit(state, |m| { m.session.draft.title = event.value(); m.session.focused_field = Some("title".into()); }) } - } else if field.name == "category" { - LocalText { kind: "text", name: "category", value: draft.category.clone(), limit: field.max_length as i64, placeholder: "", oninput: move |event: FormEvent| edit(state, |m| { m.session.draft.category = event.value(); m.session.focused_field = Some("category".into()); }) } - } - } - } - button { class: "primary", r#type: "submit", disabled: stale || composing() || draft.title.trim().is_empty(), if draft.task_id.is_some() { "Save task" } else { "Add task" } } - } - div { class: "draft-tools", button { class: "quiet", onclick: move |_| run(state, composing(), |m| m.save(false)), "Save draft" } button { class: "quiet", onclick: move |_| replace_draft(state, composing(), draft_generation, |m| { m.new_draft(); Ok(()) }), "Clear draft" } } - small { if model.dirty { "Unsaved draft · Save draft before closing." } else { "Draft saved locally." } } - } - } - } else if panel() == "evolve" { - section { class: "evolve", h2 { "Change how work is presented." } p { class: "muted", "Preview a bounded revision. The host checks it independently; adoption keeps every task." } - for revision in [capture.revision.clone()] { div { key: "{revision}", class: "policy-grid", - label { "Order", LocalSelect { name: "Order", value: model.policy.sort.clone(), choices: ["priority", "title", "created"].map(|v| (v.into(), v.into())).to_vec(), oninput: move |e: FormEvent| edit(state, |m| m.policy.sort = e.value()) } } - label { "Group", LocalSelect { name: "Group", value: model.policy.group.clone(), choices: ["none", "status", "priority", "category"].map(|v| (v.into(), v.into())).to_vec(), oninput: move |e: FormEvent| edit(state, |m| m.policy.group = e.value()) } } - label { "Task schema", LocalSelect { name: "Task schema", value: model.schema_version.to_string(), choices: vec![("1".into(), "v1 · Core tasks".into()), ("2".into(), "v2 · Add categories".into())], oninput: move |e: FormEvent| edit(state, |m| m.schema_version = e.value().parse().unwrap_or(1)) } } - label { class: "checkbox", input { r#type: "checkbox", initial_checked: model.policy.allow_reopen, onchange: move |e| edit(state, |m| m.policy.allow_reopen = e.checked()) } "Allow reopening completed tasks" } - } } - button { class: "primary", disabled: stale || composing(), onclick: move |_| run(state, composing(), Model::evaluate), "Evaluate & preview" } - if let Some(preview) = model.preview.clone() { - section { class: "preview", h3 { if preview.evaluation.accepted { "Compatible candidate" } else { "Candidate rejected" } } p { "{preview.preview.view.ordering}" } - ul { for check in preview.evaluation.checks { li { "{check.name}: ", if check.passed { "passed" } else { "failed" } } } } - p { "{preview.evaluation.receipts.len()} pure execution receipts. A compatible workflow is not a productivity claim." } - button { class: "primary", disabled: !preview.evaluation.accepted || stale || composing(), onclick: move |_| run(state, composing(), Model::adopt), "Adopt this revision" } - } - } - section { class: "import-proposal", h3 { "Inspect a model proposal" } p { "Choose a proposal JSON produced by an explicit local inference attempt. Importing it only evaluates and previews." } - LocalText { kind: "text", name: "Proposal JSON path", value: model.path.clone(), limit: 2048, placeholder: "/path/to/proposal.json", oninput: move |e: FormEvent| edit(state, |m| m.path = e.value()) } - button { class: "quiet", onclick: move |_| run(state, composing(), Model::import_proposal), "Import & evaluate proposal" } - label { "How should your workflow change?", LocalText { kind: "text", name: "Workflow instruction", value: instruction(), limit: 512, placeholder: "", oninput: move |e: FormEvent| instruction.set(e.value()) } } - p { "Apple Intelligence runs on this Mac. Generate once, inspect the proposal, then choose whether to adopt it. No cloud fallback." } - button { class: "quiet", disabled: busy() || stale || composing() || !model.options.apple_available(), onclick: move |_| { if !composing() { generate_apple(state, busy, instruction(), composing, pending); } }, if busy() { "Generating locally…" } else { "Generate one Apple proposal" } } - if !model.options.apple_available() { small { "This package does not include the Apple runtime. Proposal import is available above." } } - } - } - } else { - section { class: "portability", h2 { "Keep the evidence. Explore another direction." } - dl { dt { "Application" } dd { "{capture.application}" } dt { "Captured head" } dd { code { "{capture.head}" } } dt { "Revision" } dd { code { "{capture.revision}" } } dt { "Memory" } dd { code { "{capture.memory}" } } } - p { "Export retains immutable facts and pure execution evidence. Imports remain separate. Forks begin with a new identity and no copied drafts, credentials or mutable custody." } - label { "Transfer JSON path", LocalText { kind: "text", name: "Transfer JSON path", value: model.path.clone(), limit: 2048, placeholder: "/path/to/triage.json", oninput: move |e: FormEvent| edit(state, |m| m.path = e.value()) } } - div { class: "row", button { onclick: move |_| run(state, composing(), Model::export), "Export new file" } button { onclick: move |_| run(state, composing(), Model::import), "Verify & import" } } - label { "New fork identity", LocalText { kind: "text", name: "New fork identity", value: model.fork_name.clone(), limit: 48, placeholder: "", oninput: move |e: FormEvent| edit(state, |m| m.fork_name = e.value()) } } - button { onclick: move |_| run(state, composing(), Model::fork), "Fork this transfer" } - p { class: "muted", "Divergent field conflicts require an explicit review and resolution through the bundled triage-host CLI. This screen never silently merges changes." } - } - } - footer { span { "LOCAL ONLY · Schema v{capture.definition.schema_version} · State {capture.sequence}" } span { "Session drafts are never model inputs." } } - } - } -} - -const STYLE: &str = r#" -:root{color-scheme:light dark;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;color:#28332c;background:#f5f4ee;font-size:14px}*{box-sizing:border-box}body{margin:0}main{max-width:1180px;margin:auto;padding:38px 40px 20px}header{display:flex;justify-content:space-between;gap:30px;align-items:center;margin-bottom:32px}h1{font-size:38px;font-weight:560;letter-spacing:-1.6px;margin:8px 0}h2{font-size:18px;font-weight:580;margin:0 0 16px}h3{font-size:15px;margin:0 0 9px;font-weight:550}.eyebrow{font-size:10px;letter-spacing:2px;font-weight:700;color:#6d816e}.subtitle,.muted{color:#738077;line-height:1.6}.subtitle{font-size:15px;margin:0}.capacity{text-align:right;display:flex;flex-direction:column;color:#758178;gap:5px}.capacity strong{font-size:30px;color:#354f39;font-weight:500}.capacity span{font-size:12px}.capacity small{font-size:10px}nav{display:flex;border-bottom:1px solid #dce1d7;gap:5px}button,input,select{font:inherit}button{cursor:pointer;border:1px solid #cdd6c9;border-radius:6px;padding:9px 13px;background:#eef1e8;color:inherit}button:disabled{opacity:.45;cursor:default}button:hover:enabled{background:#e1e9d7}button:focus-visible,input:focus-visible,select:focus-visible{outline:2px solid #698b56;outline-offset:2px}.tab{border:0;border-radius:0;padding:13px 18px;background:transparent;color:#829082}.tab.active{border-bottom:2px solid #5c7a49;color:#283b2b}.quiet{background:transparent;border-color:transparent}.refresh{margin-left:auto}.notice{font-size:12px;color:#667869;margin:17px 0 27px;overflow-wrap:anywhere}.workspace{display:grid;grid-template-columns:minmax(0,1fr) 290px;gap:35px}.tools{display:flex;gap:12px;flex-wrap:wrap;justify-content:space-between;margin-bottom:25px}.filters{display:flex;gap:5px}.pill{font-size:12px;border:0;border-radius:20px;background:transparent}.selected{background:#e1e9d7}.tools form{display:flex;gap:4px}.tools input{width:160px}.editor{background:#edece3;border:1px solid #e0e2d8;border-radius:10px;padding:23px;height:fit-content}.editor .muted{font-size:12px}label{display:block;font-size:12px;color:#526b56;font-weight:500;margin:20px 0 12px}input,select{width:100%;display:block;margin-top:8px;padding:11px 12px;border:1px solid #d3d8ce;border-radius:5px;background:#fafaf5;color:inherit;min-width:0}.primary{background:#435e3c;color:#fff;border-color:#435e3c}.primary:hover:enabled{background:#354d30}.editor .primary{width:100%;margin-top:9px}.draft-tools{display:flex;gap:6px;margin:17px -10px 6px}.draft-tools button{font-size:11px;padding:8px}.editor small{font-size:10px;color:#7c887b}.task-group h2{font-size:10px;text-transform:uppercase;letter-spacing:1.8px;color:#86907e;margin:24px 0 10px}.task{display:flex;justify-content:space-between;gap:15px;padding:20px 0;border-bottom:1px solid #e2e4d9}.task-copy{min-width:0}.task h3{overflow-wrap:anywhere;line-height:1.5}.done h3{color:#84927c;text-decoration:line-through}.tags{display:flex;gap:10px;font-size:10px;color:#85917e}.priority.high{color:#946443}.task-actions{display:flex;align-items:flex-start;gap:2px}.task-actions button{font-size:11px;padding:7px}.task details{font-size:10px;color:#8e9988;margin-top:12px}.task details p{max-width:400px;line-height:1.6}.empty{padding:75px 10px;color:#82937e}.empty h2{font-size:20px;font-weight:400}.empty p{font-size:13px}.stale{padding:20px;background:#fff1cd;border:1px solid #d8c585;border-radius:8px;margin-bottom:24px}.stale p{line-height:1.6}.stale button{margin-right:10px}.policy-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;max-width:800px}.checkbox{grid-column:1/-1;display:flex;align-items:center;gap:10px}.checkbox input{width:auto;margin:0}.evolve,.portability{max-width:820px;padding:10px 0 30px;line-height:1.7}.preview{padding:25px;border:1px solid #ced9c4;border-radius:9px;margin-top:25px;background:#eef2e8}.preview ul{font:11px ui-monospace,monospace;line-height:1.9}.import-proposal{margin-top:40px;border-top:1px solid #dce1d7;padding-top:25px}.import-proposal button{margin-top:12px}.row{display:flex;gap:10px}dl{display:grid;grid-template-columns:115px minmax(0,1fr);gap:12px;font-size:11px;margin:25px 0}dt{color:#83917e}dd{margin:0;overflow-wrap:anywhere}code{font:10px ui-monospace,monospace;overflow-wrap:anywhere}footer{display:flex;justify-content:space-between;gap:15px;border-top:1px solid #dce1d7;margin-top:45px;padding-top:18px;font-size:9px;letter-spacing:.5px;color:#8d9987}.startup{max-width:700px}.startup pre{white-space:pre-wrap;overflow-wrap:anywhere}@media(max-width:850px){main{padding:25px}.workspace{grid-template-columns:1fr}.editor{max-width:500px}.policy-grid{grid-template-columns:1fr}.capacity{display:none}.tab{padding:12px 10px}.task-actions{flex-direction:column}footer{flex-direction:column}}@media(prefers-color-scheme:dark){:root{background:#171d19;color:#e0e8da}.capacity strong{color:#afc69d}.tab.active{color:#d6e4c9}.editor{background:#202821;border-color:#344031}input,select{background:#1b221c;border-color:#465240}.selected,.preview{background:#2a3829}.task,nav,footer{border-color:#364330}button{background:#283526;border-color:#495743}button:hover:enabled{background:#354b30}.quiet,.tab,.pill{background:transparent}.selected{background:#33472d}.primary{background:#587b45;color:white}.stale{background:#3b3420;border-color:#7c6c3c}} -"#; - -#[cfg(test)] -mod tests { - use super::*; - use dioxus::dioxus_core::{AttributeValue, Mutation}; - use std::{cell::RefCell, collections::HashMap, rc::Rc}; - - type InputFixture = Rc>; - fn text_fixture(data: InputFixture) -> Element { - let (value, generation) = data.borrow().clone(); - rsx! { div { for generation in [generation] { - LocalText { key: "{generation}", value: value.clone(), name: "title", limit: 120, placeholder: "", kind: "text", oninput: |_| {} } - } } } - } - fn controlled_fixture(data: InputFixture) -> Element { - let value = data.borrow().0.clone(); - rsx! { input { value } } - } - #[test] - fn delayed_text_echo_does_not_write_live_value_or_replace_the_input() { - let data = Rc::new(RefCell::new((String::new(), 0))); - let mut dom = VirtualDom::new_with_props(text_fixture, data.clone()); - let initial = dom.rebuild_to_vec(); - assert!(initial.edits.iter().any(|m| matches!( - m, - Mutation::SetAttribute { - name: "initial_value", - .. - } - ))); - let mut text = String::new(); - for character in "Finish the native roadmap review 日本語 🦀".chars() { - text.push(character); - data.borrow_mut().0 = text.clone(); - dom.mark_dirty(ScopeId::APP); - let changes = dom.render_immediate_to_vec(); - assert!(changes.edits.iter().any(|m| matches!(m, Mutation::SetAttribute { name: "initial_value", value: AttributeValue::Text(value), .. } if value == &text))); - assert!(!changes.edits.iter().any(|m| matches!( - m, - Mutation::SetAttribute { name: "value", .. } - | Mutation::Remove { .. } - | Mutation::ReplaceWith { .. } - ))); - } - data.borrow_mut().0 = "Explicitly selected another task".into(); - data.borrow_mut().1 += 1; - dom.mark_dirty(ScopeId::APP); - let replaced = dom.render_immediate_to_vec(); - assert!( - replaced - .edits - .iter() - .any(|m| matches!(m, Mutation::Remove { .. } | Mutation::ReplaceWith { .. })) - ); - - // Negative control: the previous controlled implementation really does - // emit the late live-value write that caused the observed keystroke loss. - let mut controlled = VirtualDom::new_with_props(controlled_fixture, data.clone()); - controlled.rebuild_to_vec(); - data.borrow_mut().0 = "Older delayed event".into(); - controlled.mark_dirty(ScopeId::APP); - assert!( - controlled - .render_immediate_to_vec() - .edits - .iter() - .any(|m| matches!(m, Mutation::SetAttribute { name: "value", .. })) - ); - } - - fn select_fixture() -> Element { - rsx! { div { - LocalSelect { name: "priority", value: "normal", choices: ["high", "normal", "low"].map(|value| (value.into(), value.into())).to_vec(), oninput: |_| {} } - LocalSelect { name: "group", value: "status", choices: ["none", "status", "priority", "category"].map(|value| (value.into(), value.into())).to_vec(), oninput: |_| {} } - } } - } - #[test] - fn first_mount_selects_the_retained_nonfirst_options() { - let mut dom = VirtualDom::new(select_fixture); - let mutations = dom.rebuild_to_vec(); - let mut values = HashMap::new(); - let mut selected = Vec::new(); - for mutation in mutations.edits { - match mutation { - Mutation::SetAttribute { - name: "value", - value: AttributeValue::Text(value), - id, - .. - } => { - values.insert(id, value); - } - Mutation::SetAttribute { - name: "initial_selected", - value: AttributeValue::Bool(true), - id, - .. - } => selected.push(id), - Mutation::SetAttribute { - name: "selected", .. - } => panic!("Volatile selection writes would race native interaction"), - _ => {} - } - } - let mut selected_values = selected - .iter() - .map(|id| { - values - .get(id) - .expect("Selected option has an explicit value") - .as_str() - }) - .collect::>(); - selected_values.sort(); - assert_eq!(selected_values, ["normal", "status"]); - } -} diff --git a/examples/malleable-site/renderers/Cargo.lock b/examples/malleable-site/renderers/Cargo.lock index 25106d85..84bdade5 100644 --- a/examples/malleable-site/renderers/Cargo.lock +++ b/examples/malleable-site/renderers/Cargo.lock @@ -2,6634 +2,845 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - [[package]] name = "algal-surface-renderers" version = "0.0.0" dependencies = [ "crossterm", - "dioxus", "ratatui", "serde", "serde_json", ] [[package]] -name = "aligned" -version = "0.4.3" +name = "allocator-api2" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" -dependencies = [ - "as-slice", -] +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] -name = "aligned-vec" -version = "0.6.4" +name = "approx" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" dependencies = [ - "equator", + "num-traits", ] [[package]] -name = "allocator-api2" -version = "0.2.21" +name = "autocfg" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] -name = "anyhow" -version = "1.0.104" +name = "bitflags" +version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" [[package]] -name = "approx" -version = "0.5.1" +name = "by_address" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" + +[[package]] +name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" dependencies = [ - "num-traits", + "rustversion", ] [[package]] -name = "arbitrary" -version = "1.4.2" +name = "cfg-if" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" [[package]] -name = "arg_enum_proc_macro" -version = "0.3.4" +name = "compact_str" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +checksum = "9dfdd1c2274d9aa354115b09dc9a901d6c5576818cdf70d14cae2bdb47df00ab" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "static_assertions", ] [[package]] -name = "arrayvec" -version = "0.7.8" +name = "convert_case" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +dependencies = [ + "unicode-segmentation", +] [[package]] -name = "as-slice" -version = "0.2.1" +name = "crossterm" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ - "stable_deref_trait", + "bitflags", + "crossterm_winapi", + "derive_more", + "document-features", + "mio", + "parking_lot", + "rustix", + "signal-hook", + "signal-hook-mio", + "winapi", ] [[package]] -name = "async-stream" -version = "0.3.6" +name = "crossterm_winapi" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", + "winapi", ] [[package]] -name = "async-stream-impl" -version = "0.3.6" +name = "darling" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +checksum = "ed17f5901b6630b993ca003def43f2f8ef4014fc13b047b57aad617ff32bc2ec" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", + "darling_core", + "darling_macro", ] [[package]] -name = "async-trait" -version = "0.1.92" +name = "darling_core" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" +checksum = "6837e2cf7485aaae18f86181d2f0e9a7ed297a025e220aeabf63fdebd3a2ddff" dependencies = [ + "ident_case", "proc-macro2", "quote", + "strsim", "syn 3.0.6", ] [[package]] -name = "async-tungstenite" -version = "0.31.0" +name = "darling_macro" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee88b4c88ac8c9ea446ad43498955750a4bbe64c4392f21ccfe5d952865e318f" +checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" dependencies = [ - "atomic-waker", - "futures-core", - "futures-io", - "futures-task", - "futures-util", - "log", - "pin-project-lite", - "tungstenite 0.27.0", + "darling_core", + "quote", + "syn 3.0.6", ] [[package]] -name = "atk" -version = "0.18.2" +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" + +[[package]] +name = "derive_more" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" dependencies = [ - "atk-sys", - "glib", - "libc", + "derive_more-impl", ] [[package]] -name = "atk-sys" -version = "0.18.2" +name = "derive_more-impl" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.119", ] [[package]] -name = "atomic-waker" -version = "1.1.2" +name = "document-features" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] [[package]] -name = "autocfg" -version = "1.5.1" +name = "either" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" [[package]] -name = "av-scenechange" -version = "0.14.1" +name = "equivalent" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" -dependencies = [ - "aligned", - "anyhow", - "arg_enum_proc_macro", - "arrayvec", - "log", - "num-rational", - "num-traits", - "pastey", - "rayon", - "thiserror 2.0.20", - "v_frame", - "y4m", -] +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] -name = "av1-grain" -version = "0.2.5" +name = "errno" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ - "anyhow", - "arrayvec", - "log", - "nom", - "num-rational", - "v_frame", + "libc", + "windows-sys", ] [[package]] -name = "avif-serialize" -version = "0.8.9" +name = "foldhash" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7178fe5f7d460b13895ebb9dcb28a3a6216d2df2574a0806cb51b555d297f38" -dependencies = [ - "arrayvec", -] +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] -name = "axum" -version = "0.8.9" +name = "hashbrown" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ - "axum-core", - "bytes", - "form_urlencoded", - "futures-util", - "http", - "http-body", - "http-body-util", - "itoa", - "matchit", - "memchr", - "mime", - "multer", - "percent-encoding", - "pin-project-lite", - "serde_core", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sync_wrapper", - "tower", - "tower-layer", - "tower-service", + "allocator-api2", + "equivalent", + "foldhash", ] [[package]] -name = "axum-core" -version = "0.5.6" +name = "hashbrown" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "sync_wrapper", - "tower-layer", - "tower-service", + "allocator-api2", + "equivalent", + "foldhash", ] [[package]] -name = "base64" -version = "0.22.1" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "bit_field" -version = "0.10.3" +name = "ident_case" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] -name = "bitflags" -version = "1.3.2" +name = "indoc" +version = "2.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +dependencies = [ + "rustversion", +] [[package]] -name = "bitflags" -version = "2.13.2" +name = "instability" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" +checksum = "4c3b5acc1e2fd9375041a388da33d1eb8aed5f7a8c0dd3543e3ea2805adfbe20" dependencies = [ - "serde_core", + "darling", + "indoc", + "proc-macro2", + "quote", + "syn 3.0.6", ] [[package]] -name = "bitstream-io" -version = "4.10.0" +name = "itertools" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eff00be299a18769011411c9def0d827e8f2d7bf0c3dbf53633147a8867fd1f" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ - "no_std_io2", + "either", ] [[package]] -name = "block" -version = "0.1.6" +name = "itoa" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] -name = "block-buffer" -version = "0.10.4" +name = "kasuari" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +checksum = "bde5057d6143cc94e861d90f591b9303d6716c6b9602309150bd068853c10899" dependencies = [ - "generic-array", + "hashbrown 0.16.1", + "portable-atomic", + "thiserror", ] [[package]] -name = "block2" -version = "0.6.2" +name = "libc" +version = "0.2.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" -dependencies = [ - "objc2", -] +checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" [[package]] -name = "built" -version = "0.8.1" +name = "libm" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c0e531d93d39c34eef561e929e8a7f86d77a5af08aac4f6d6e39976c51858e9" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] -name = "bumpalo" -version = "3.20.3" +name = "line-clipping" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" +checksum = "e752191d037c44ad111a8caa762921926658402f01cc1253f7bef2020ece4f5e" +dependencies = [ + "bitflags", +] [[package]] -name = "by_address" -version = "1.2.1" +name = "linux-raw-sys" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] -name = "bytemuck" -version = "1.25.2" +name = "litrs" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] -name = "byteorder" -version = "1.5.0" +name = "lock_api" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] [[package]] -name = "byteorder-lite" -version = "0.1.0" +name = "log" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] -name = "bytes" -version = "1.12.1" +name = "lru" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" +checksum = "ef9ac18847474e638e3702b76c65d4eb93428471a74778ef0f1be711717f89b5" dependencies = [ - "serde", + "hashbrown 0.17.1", ] [[package]] -name = "cairo-rs" -version = "0.18.5" +name = "memchr" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" -dependencies = [ - "bitflags 2.13.2", - "cairo-sys-rs", - "glib", - "libc", - "once_cell", - "thiserror 1.0.69", -] +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] -name = "cairo-sys-rs" -version = "0.18.2" +name = "mio" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" dependencies = [ - "glib-sys", "libc", - "system-deps", + "log", + "wasi", + "windows-sys", ] [[package]] -name = "castaway" -version = "0.2.4" +name = "num-conv" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ - "rustversion", + "autocfg", ] [[package]] -name = "cc" -version = "1.4.7" +name = "num_threads" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54413ede23c2daf518f35156dfde027feb2374004d63bd497f983c8db9c0e313" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" dependencies = [ - "find-msvc-tools", - "jobserver", "libc", - "shlex", ] [[package]] -name = "cesu8" -version = "1.1.0" +name = "palette" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[package]] -name = "cfb" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" -dependencies = [ - "byteorder", - "fnv", - "uuid", -] - -[[package]] -name = "cfg-expr" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" -dependencies = [ - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cfg-if" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" - -[[package]] -name = "cfg_aliases" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" - -[[package]] -name = "chacha20" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" -dependencies = [ - "cfg-if", - "cpufeatures 0.3.1", - "rand_core 0.10.1", -] - -[[package]] -name = "charset" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f927b07c74ba84c7e5fe4db2baeb3e996ab2688992e39ac68ce3220a677c7e" -dependencies = [ - "base64", - "encoding_rs", -] - -[[package]] -name = "ciborium" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" -dependencies = [ - "ciborium-io", - "ciborium-ll", - "serde", -] - -[[package]] -name = "ciborium-io" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" - -[[package]] -name = "ciborium-ll" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" -dependencies = [ - "ciborium-io", - "half", -] - -[[package]] -name = "cocoa" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad36507aeb7e16159dfe68db81ccc27571c3ccd4b76fb2fb72fc59e7a4b1b64c" -dependencies = [ - "bitflags 2.13.2", - "block", - "cocoa-foundation", - "core-foundation", - "core-graphics 0.24.0", - "foreign-types 0.5.0", - "libc", - "objc", -] - -[[package]] -name = "cocoa-foundation" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81411967c50ee9a1fc11365f8c585f863a22a9697c89239c452292c40ba79b0d" -dependencies = [ - "bitflags 2.13.2", - "block", - "core-foundation", - "core-graphics-types", - "objc", -] - -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - -[[package]] -name = "combine" -version = "4.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfc320937d09e6de266b31b9afb480f197d7a861be86be7cb2ea7e5d1bfffc5e" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "compact_str" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dfdd1c2274d9aa354115b09dc9a901d6c5576818cdf70d14cae2bdb47df00ab" -dependencies = [ - "castaway", - "cfg-if", - "itoa", - "rustversion", - "ryu", - "static_assertions", -] - -[[package]] -name = "const-str" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0664d2867b4a32697dfe655557f5c3b187e9b605b38612a748e5ec99811d160" - -[[package]] -name = "const_format" -version = "0.2.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" -dependencies = [ - "const_format_proc_macros", - "konst", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "content_disposition" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc14a88e1463ddd193906285abe5c360c7e8564e05ccc5d501755f7fbc9ca9c" -dependencies = [ - "charset", -] - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "convert_case" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "convert_case" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "cookie" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a373e3602691c3cdea496d2f0ee5935151e6168fe87739483c463db1b2f2f87" -dependencies = [ - "percent-encoding", - "time", - "version_check", -] - -[[package]] -name = "cookie_store" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b2c103cf610ec6cae3da84a766285b42fd16aad564758459e6ecf128c75206" -dependencies = [ - "cookie", - "document-features", - "idna", - "log", - "publicsuffix", - "serde", - "serde_derive", - "serde_json", - "time", - "url", -] - -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core-graphics" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" -dependencies = [ - "bitflags 2.13.2", - "core-foundation", - "core-graphics-types", - "foreign-types 0.5.0", - "libc", -] - -[[package]] -name = "core-graphics" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" -dependencies = [ - "bitflags 2.13.2", - "core-foundation", - "core-graphics-types", - "foreign-types 0.5.0", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" -dependencies = [ - "bitflags 2.13.2", - "core-foundation", - "libc", -] - -[[package]] -name = "core_detect" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f8f80099a98041a3d1622845c271458a2d73e688351bf3cb999266764b81d48" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "cpufeatures" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01a7799fd6b852db0e61728dde9a204c423b44d689dbd432522543614b490e78" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98b0cc327b5bc766e7fda9c9260cc0fa81b43a8e240440422dff70788e3f9ef1" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" - -[[package]] -name = "crossterm" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" -dependencies = [ - "bitflags 2.13.2", - "crossterm_winapi", - "derive_more 2.1.1", - "document-features", - "mio", - "parking_lot", - "rustix", - "signal-hook", - "signal-hook-mio", - "winapi", -] - -[[package]] -name = "crossterm_winapi" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" -dependencies = [ - "winapi", -] - -[[package]] -name = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - -[[package]] -name = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "cssparser" -version = "0.29.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" -dependencies = [ - "cssparser-macros", - "dtoa-short", - "itoa", - "matches", - "phf 0.10.1", - "proc-macro2", - "quote", - "smallvec", - "syn 1.0.109", -] - -[[package]] -name = "cssparser-macros" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" -dependencies = [ - "quote", - "syn 2.0.119", -] - -[[package]] -name = "darling" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" -dependencies = [ - "darling_core 0.21.3", - "darling_macro 0.21.3", -] - -[[package]] -name = "darling" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed17f5901b6630b993ca003def43f2f8ef4014fc13b047b57aad617ff32bc2ec" -dependencies = [ - "darling_core 0.24.1", - "darling_macro 0.24.1", -] - -[[package]] -name = "darling_core" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "darling_core" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6837e2cf7485aaae18f86181d2f0e9a7ed297a025e220aeabf63fdebd3a2ddff" -dependencies = [ - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 3.0.6", -] - -[[package]] -name = "darling_macro" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" -dependencies = [ - "darling_core 0.21.3", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "darling_macro" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" -dependencies = [ - "darling_core 0.24.1", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "data-encoding" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" - -[[package]] -name = "deranged" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" - -[[package]] -name = "derive_more" -version = "0.99.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" -dependencies = [ - "convert_case 0.4.0", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.119", -] - -[[package]] -name = "derive_more" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" -dependencies = [ - "convert_case 0.10.0", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.119", - "unicode-xid", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "dioxus" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9320593eda4f01858f046698b42441603d2af5fcb62a6c1f9046a0c2eebd6d9b" -dependencies = [ - "dioxus-asset-resolver", - "dioxus-cli-config", - "dioxus-config-macro", - "dioxus-config-macros", - "dioxus-core", - "dioxus-core-macro", - "dioxus-desktop", - "dioxus-fullstack", - "dioxus-hooks", - "dioxus-html", - "dioxus-signals", - "dioxus-stores", - "dioxus-web", - "subsecond", -] - -[[package]] -name = "dioxus-asset-resolver" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84235ff0e272f15d4537603cdd50df6d45d50e51bb96326dbc0bdfd01d825226" -dependencies = [ - "dioxus-cli-config", - "http", - "infer", - "jni 0.21.1", - "js-sys", - "ndk", - "ndk-context", - "ndk-sys", - "percent-encoding", - "thiserror 2.0.20", - "tokio", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "dioxus-cli-config" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322d10f47effebd85ee0662a2cb083ff920d40dd6295a4afd8cfa4f9bc2e05c6" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "dioxus-config-macro" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3a906c8219e94fa48189a793c760a4e3193cbb7791f799e9d37633fe41161d" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "dioxus-config-macros" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20de015bc89c20f4ffc7b4f849943420308365fa66f991250b5c075261990a21" - -[[package]] -name = "dioxus-core" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b232228ada232c0adc151e41ebd9ef70cc04683db097fa0dc6015979fa01722" -dependencies = [ - "anyhow", - "const_format", - "dioxus-core-types", - "futures-channel", - "futures-util", - "generational-box", - "longest-increasing-subsequence", - "rustc-hash 2.1.3", - "rustversion", - "serde", - "slab", - "slotmap", - "subsecond", - "tracing", -] - -[[package]] -name = "dioxus-core-macro" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6256a68462222f0600f5fd7d9542cbd9f299bc19355d900f7827dd3fc9e09fdb" -dependencies = [ - "convert_case 0.8.0", - "dioxus-rsx", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "dioxus-core-types" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96007ed6cbad951dfed82d83c581aabd95bc591f351f5666d454ddbe7845b324" - -[[package]] -name = "dioxus-desktop" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "236deb81f1a04de704fb80cf7838c65607441c76914de2e036709540c540a39d" -dependencies = [ - "anyhow", - "async-trait", - "base64", - "bytes", - "cocoa", - "core-foundation", - "dioxus-asset-resolver", - "dioxus-cli-config", - "dioxus-core", - "dioxus-devtools", - "dioxus-document", - "dioxus-history", - "dioxus-hooks", - "dioxus-html", - "dioxus-interpreter-js", - "dioxus-signals", - "dunce", - "futures-channel", - "futures-util", - "generational-box", - "global-hotkey", - "image", - "infer", - "jni 0.21.1", - "lazy-js-bundle", - "libc", - "muda", - "ndk", - "ndk-context", - "ndk-sys", - "objc", - "objc_id", - "percent-encoding", - "rand 0.9.5", - "rfd", - "rustc-hash 2.1.3", - "serde", - "serde_json", - "signal-hook", - "slab", - "subtle", - "tao", - "thiserror 2.0.20", - "tokio", - "tracing", - "tray-icon", - "tungstenite 0.28.0", - "webbrowser", - "wry", -] - -[[package]] -name = "dioxus-devtools" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434cebb282b3f820a341582ebfd37dab907d5a25c3eeafd87802468afcd2a959" -dependencies = [ - "dioxus-cli-config", - "dioxus-core", - "dioxus-devtools-types", - "dioxus-signals", - "serde", - "serde_json", - "subsecond", - "thiserror 2.0.20", - "tracing", - "tungstenite 0.28.0", -] - -[[package]] -name = "dioxus-devtools-types" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfd6f3475e38c93be245a664a9ce11679a8f2b99832620705cf7837f42aa39ce" -dependencies = [ - "dioxus-core", - "serde", - "subsecond-types", -] - -[[package]] -name = "dioxus-document" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f6fadd5c6d886b48b762820abae1a08142a2159f8a1136c0466b4b4ed9f547e" -dependencies = [ - "dioxus-core", - "dioxus-core-macro", - "dioxus-core-types", - "dioxus-html", - "futures-channel", - "futures-util", - "generational-box", - "lazy-js-bundle", - "serde", - "serde_json", - "tracing", -] - -[[package]] -name = "dioxus-fullstack" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91d5acabd1470145bcf164cab9fd2edcf2e4fba0fa6fb0fd6dca23079fcc169" -dependencies = [ - "anyhow", - "async-stream", - "async-tungstenite", - "axum", - "axum-core", - "base64", - "bytes", - "ciborium", - "const-str", - "const_format", - "content_disposition", - "derive_more 2.1.1", - "dioxus-asset-resolver", - "dioxus-cli-config", - "dioxus-core", - "dioxus-fullstack-core", - "dioxus-fullstack-macro", - "dioxus-hooks", - "dioxus-html", - "dioxus-signals", - "form_urlencoded", - "futures", - "futures-channel", - "futures-util", - "gloo-net", - "headers", - "http", - "http-body", - "http-body-util", - "js-sys", - "mime", - "pin-project", - "reqwest", - "rustversion", - "send_wrapper", - "serde", - "serde_json", - "serde_qs", - "serde_urlencoded", - "thiserror 2.0.20", - "tokio-util", - "tracing", - "tungstenite 0.27.0", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "xxhash-rust", -] - -[[package]] -name = "dioxus-fullstack-core" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0011e9bca8da2ae6bf02ba9ef93ba6c5fa539e402de3aeb316ad86ca77c59079" -dependencies = [ - "anyhow", - "axum-core", - "base64", - "ciborium", - "dioxus-core", - "dioxus-document", - "dioxus-history", - "dioxus-hooks", - "dioxus-signals", - "futures-channel", - "futures-util", - "generational-box", - "http", - "inventory", - "parking_lot", - "serde", - "serde_json", - "thiserror 2.0.20", - "tokio", - "tracing", -] - -[[package]] -name = "dioxus-fullstack-macro" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681f39665de36af7bb724b1cc0ca9c2b7c36a2b93febf1b2911716479eac3db0" -dependencies = [ - "const_format", - "convert_case 0.8.0", - "proc-macro2", - "quote", - "syn 2.0.119", - "xxhash-rust", -] - -[[package]] -name = "dioxus-history" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2404b77d4441e694a5e93afb5c9a729efb26a3f6920f769cfe6cfedf5c7ac210" -dependencies = [ - "dioxus-core", - "tracing", -] - -[[package]] -name = "dioxus-hooks" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d3807a1bc039299cd37ad85f1c56ae7088210e8a38e3e877f01034d68c15fbb" -dependencies = [ - "dioxus-core", - "dioxus-signals", - "futures-channel", - "futures-util", - "generational-box", - "rustversion", - "slab", - "tracing", -] - -[[package]] -name = "dioxus-html" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b9a85679c4dfd8699407a9ad5041a6a4fe6be0ee386353951cd03b57a12030" -dependencies = [ - "async-trait", - "bytes", - "dioxus-core", - "dioxus-core-macro", - "dioxus-core-types", - "dioxus-hooks", - "dioxus-html-internal-macro", - "enumset", - "euclid", - "futures-channel", - "futures-util", - "generational-box", - "keyboard-types", - "lazy-js-bundle", - "rustversion", - "serde", - "serde_json", - "serde_repr", - "tracing", -] - -[[package]] -name = "dioxus-html-internal-macro" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500282dad5b62e91f93e127cbf41c587bf1c457d52514a75f3ff2a55fd0ea9f6" -dependencies = [ - "convert_case 0.8.0", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "dioxus-interpreter-js" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faa22cc3431e7efdbae28069542a1763c977d5edbe4d4fbfb0b7667b9c9966e9" -dependencies = [ - "dioxus-core", - "dioxus-core-types", - "dioxus-html", - "js-sys", - "lazy-js-bundle", - "rustc-hash 2.1.3", - "serde", - "sledgehammer_bindgen", - "sledgehammer_utils", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "dioxus-rsx" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aea662c9e13a91279d8acbc0d02a80430c7081704c20e8c791e4c4a151268596" -dependencies = [ - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "rustversion", - "syn 2.0.119", -] - -[[package]] -name = "dioxus-signals" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95d85e36fcaf7abdc986836801bf248776da7d5961f5fac65fdbf5ed491afb4f" -dependencies = [ - "dioxus-core", - "futures-channel", - "futures-util", - "generational-box", - "parking_lot", - "rustc-hash 2.1.3", - "tracing", - "warnings", -] - -[[package]] -name = "dioxus-stores" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15eaa9f2ccc5ce962d056515e61345c846a54b13a2b880cf7e8ac93faa53a178" -dependencies = [ - "dioxus-core", - "dioxus-signals", - "dioxus-stores-macro", - "generational-box", -] - -[[package]] -name = "dioxus-stores-macro" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13bd8a693d7042544fa3ac79698a08783bbc698d1ed257e88c5d4059e9ac476" -dependencies = [ - "convert_case 0.8.0", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "dioxus-web" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "481093233d789c5ffbdde66e7970e803b01a199a7ab0c0f8ef84c65d30b7384f" -dependencies = [ - "dioxus-cli-config", - "dioxus-core", - "dioxus-core-types", - "dioxus-devtools", - "dioxus-document", - "dioxus-history", - "dioxus-html", - "dioxus-interpreter-js", - "dioxus-signals", - "futures-channel", - "futures-util", - "generational-box", - "js-sys", - "lazy-js-bundle", - "rustc-hash 2.1.3", - "send_wrapper", - "tracing", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", -] - -[[package]] -name = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.61.2", -] - -[[package]] -name = "dispatch2" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" -dependencies = [ - "bitflags 2.13.2", - "block2", - "libc", - "objc2", -] - -[[package]] -name = "displaydoc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "dlopen2" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" -dependencies = [ - "dlopen2_derive", - "libc", - "once_cell", - "winapi", -] - -[[package]] -name = "dlopen2_derive" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "document-features" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" -dependencies = [ - "litrs", -] - -[[package]] -name = "dpi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" - -[[package]] -name = "dtoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" - -[[package]] -name = "dtoa-short" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" -dependencies = [ - "dtoa", -] - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "either" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" - -[[package]] -name = "encoding_rs" -version = "0.8.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5ef0006ac9ab233c38522f5ae99cae3625151de8f706cacee1cba4b8e2832a" -dependencies = [ - "cfg-if", - "core_detect", - "multiversion", - "multiversion_no_op", - "rustversion", - "scopeguard", - "simdutf8", -] - -[[package]] -name = "enumset" -version = "1.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccc5801fd11762e24d1e420d01d2ac518f2a2ca4329d4fbb6639f2412b6204e0" -dependencies = [ - "enumset_derive", -] - -[[package]] -name = "enumset_derive" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd536557b58c682b217b8fb199afdff47cd3eff260623f19e77074eb073d63a" -dependencies = [ - "darling 0.21.3", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "equator" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" -dependencies = [ - "equator-macro", -] - -[[package]] -name = "equator-macro" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "euclid" -version = "0.22.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" -dependencies = [ - "num-traits", - "serde", -] - -[[package]] -name = "exr" -version = "1.74.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711fe42c9964295e01ee3fba3f9fe0e1d24b98886950d68efe81b1c76e21adf3" -dependencies = [ - "bit_field", - "half", - "lebe", - "miniz_oxide 0.8.9", - "num-complex", - "pulp", - "rayon-core", - "smallvec", - "zune-inflate", -] - -[[package]] -name = "fastrand" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" - -[[package]] -name = "fax" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a" - -[[package]] -name = "fdeflate" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "field-offset" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" -dependencies = [ - "memoffset", - "rustc_version", -] - -[[package]] -name = "find-msvc-tools" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25905e51abafe4dcea6c15fec58c57b601cdbd0ee53d22ea1d3016c587d39b" - -[[package]] -name = "flate2" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" -dependencies = [ - "crc32fast", - "miniz_oxide 0.9.1", - "zlib-rs", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared 0.1.1", -] - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared 0.3.1", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" -dependencies = [ - "mac", - "new_debug_unreachable", -] - -[[package]] -name = "futures" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" - -[[package]] -name = "futures-executor" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" - -[[package]] -name = "futures-macro" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "futures-sink" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" - -[[package]] -name = "futures-task" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" - -[[package]] -name = "futures-util" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "gdk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" -dependencies = [ - "cairo-rs", - "gdk-pixbuf", - "gdk-sys", - "gio", - "glib", - "libc", - "pango", -] - -[[package]] -name = "gdk-pixbuf" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" -dependencies = [ - "gdk-pixbuf-sys", - "gio", - "glib", - "libc", - "once_cell", -] - -[[package]] -name = "gdk-pixbuf-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" -dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gdk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" -dependencies = [ - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "pkg-config", - "system-deps", -] - -[[package]] -name = "gdkwayland-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" -dependencies = [ - "gdk-sys", - "glib-sys", - "gobject-sys", - "libc", - "pkg-config", - "system-deps", -] - -[[package]] -name = "gdkx11-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" -dependencies = [ - "gdk-sys", - "glib-sys", - "libc", - "system-deps", - "x11", -] - -[[package]] -name = "generational-box" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8b2dc9b873cd1a8adb80aa5dcef9a8205f781a8a313d5ffb867248cb3bcb764" -dependencies = [ - "parking_lot", - "tracing", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "gethostname" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" -dependencies = [ - "rustix", - "windows-link 0.2.1", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "libc", - "r-efi 5.3.0", - "wasip2", -] - -[[package]] -name = "getrandom" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi 6.0.0", - "rand_core 0.10.1", - "wasm-bindgen", -] - -[[package]] -name = "gif" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" -dependencies = [ - "color_quant", - "weezl", -] - -[[package]] -name = "gio" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "gio-sys", - "glib", - "libc", - "once_cell", - "pin-project-lite", - "smallvec", - "thiserror 1.0.69", -] - -[[package]] -name = "gio-sys" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", - "winapi", -] - -[[package]] -name = "glib" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" -dependencies = [ - "bitflags 2.13.2", - "futures-channel", - "futures-core", - "futures-executor", - "futures-task", - "futures-util", - "gio-sys", - "glib-macros", - "glib-sys", - "gobject-sys", - "libc", - "memchr", - "once_cell", - "smallvec", - "thiserror 1.0.69", -] - -[[package]] -name = "glib-macros" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" -dependencies = [ - "heck 0.4.1", - "proc-macro-crate 2.0.2", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "glib-sys" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" -dependencies = [ - "libc", - "system-deps", -] - -[[package]] -name = "global-hotkey" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9247516746aa8e53411a0db9b62b0e24efbcf6a76e0ba73e5a91b512ddabed7" -dependencies = [ - "crossbeam-channel", - "keyboard-types", - "objc2", - "objc2-app-kit", - "once_cell", - "thiserror 2.0.20", - "windows-sys 0.59.0", - "x11rb", - "xkeysym", -] - -[[package]] -name = "gloo-net" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" -dependencies = [ - "futures-channel", - "futures-core", - "futures-sink", - "gloo-utils", - "http", - "js-sys", - "pin-project", - "serde", - "serde_json", - "thiserror 1.0.69", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "gloo-utils" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" -dependencies = [ - "js-sys", - "serde", - "serde_json", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "gobject-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" -dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gtk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" -dependencies = [ - "atk", - "cairo-rs", - "field-offset", - "futures-channel", - "gdk", - "gdk-pixbuf", - "gio", - "glib", - "gtk-sys", - "gtk3-macros", - "libc", - "pango", - "pkg-config", -] - -[[package]] -name = "gtk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" -dependencies = [ - "atk-sys", - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "system-deps", -] - -[[package]] -name = "gtk3-macros" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "half" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" -dependencies = [ - "cfg-if", - "crunchy", - "zerocopy", -] - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", -] - -[[package]] -name = "hashbrown" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", -] - -[[package]] -name = "headers" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" -dependencies = [ - "base64", - "bytes", - "headers-core", - "http", - "httpdate", - "mime", - "sha1", -] - -[[package]] -name = "headers-core" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" -dependencies = [ - "http", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "html5ever" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" -dependencies = [ - "log", - "mac", - "markup5ever", - "match_token", -] - -[[package]] -name = "http" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" -dependencies = [ - "bytes", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfa8e654703247911e29c23fbeaa261834bd9bb74efba2f9acddc37bfb127f53" -dependencies = [ - "http", - "hyper", - "hyper-util", - "rustls", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots", -] - -[[package]] -name = "hyper-util" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" -dependencies = [ - "base64", - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "icu_collections" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" -dependencies = [ - "displaydoc", - "potential_utf", - "utf8_iter", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" - -[[package]] -name = "icu_properties" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" - -[[package]] -name = "icu_provider" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "image" -version = "0.25.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" -dependencies = [ - "bytemuck", - "byteorder-lite", - "color_quant", - "exr", - "gif", - "image-webp", - "moxcms", - "num-traits", - "png 0.18.1", - "qoi", - "ravif", - "rayon", - "rgb", - "tiff", - "zune-core", - "zune-jpeg", -] - -[[package]] -name = "image-webp" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" -dependencies = [ - "byteorder-lite", - "quick-error", -] - -[[package]] -name = "imgref" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e44b0a4eaa4c82f441d50a963f2d5f05a787240aeee097597033e72accfd22f" - -[[package]] -name = "indexmap" -version = "2.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" -dependencies = [ - "equivalent", - "hashbrown 0.17.1", -] - -[[package]] -name = "indoc" -version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" -dependencies = [ - "rustversion", -] - -[[package]] -name = "infer" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" -dependencies = [ - "cfb", -] - -[[package]] -name = "instability" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c3b5acc1e2fd9375041a388da33d1eb8aed5f7a8c0dd3543e3ea2805adfbe20" -dependencies = [ - "darling 0.24.1", - "indoc", - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "interpolate_name" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "inventory" -version = "0.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" -dependencies = [ - "rustversion", -] - -[[package]] -name = "ipnet" -version = "2.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0" - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" - -[[package]] -name = "javascriptcore-rs" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" -dependencies = [ - "bitflags 1.3.2", - "glib", - "javascriptcore-rs-sys", -] - -[[package]] -name = "javascriptcore-rs-sys" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys 0.3.1", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" -dependencies = [ - "cfg-if", - "combine", - "jni-macros", - "jni-sys 0.4.1", - "log", - "simd_cesu8", - "thiserror 2.0.20", - "walkdir", - "windows-link 0.2.1", -] - -[[package]] -name = "jni-macros" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" -dependencies = [ - "proc-macro2", - "quote", - "rustc_version", - "simd_cesu8", - "syn 2.0.119", -] - -[[package]] -name = "jni-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" -dependencies = [ - "jni-sys 0.4.1", -] - -[[package]] -name = "jni-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" -dependencies = [ - "jni-sys-macros", -] - -[[package]] -name = "jni-sys-macros" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" -dependencies = [ - "quote", - "syn 2.0.119", -] - -[[package]] -name = "jobserver" -version = "0.1.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" -dependencies = [ - "getrandom 0.4.3", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e" -dependencies = [ - "cfg-if", - "futures-util", - "wasm-bindgen", -] - -[[package]] -name = "kasuari" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde5057d6143cc94e861d90f591b9303d6716c6b9602309150bd068853c10899" -dependencies = [ - "hashbrown 0.16.1", - "portable-atomic", - "thiserror 2.0.20", -] - -[[package]] -name = "keyboard-types" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" -dependencies = [ - "bitflags 2.13.2", - "serde", - "unicode-segmentation", -] - -[[package]] -name = "konst" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" -dependencies = [ - "konst_macro_rules", -] - -[[package]] -name = "konst_macro_rules" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" - -[[package]] -name = "kuchikiki" -version = "0.8.8-speedreader" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" -dependencies = [ - "cssparser", - "html5ever", - "indexmap", - "selectors", -] - -[[package]] -name = "lazy-js-bundle" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51cdaa5abc885e2d606e6985281ace220778bde190be20aab1ec2346ed8bd1fa" - -[[package]] -name = "lebe" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" - -[[package]] -name = "libappindicator" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" -dependencies = [ - "glib", - "gtk", - "gtk-sys", - "libappindicator-sys", - "log", -] - -[[package]] -name = "libappindicator-sys" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" -dependencies = [ - "gtk-sys", - "libloading 0.7.4", - "once_cell", -] - -[[package]] -name = "libc" -version = "0.2.189" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" - -[[package]] -name = "libfuzzer-sys" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9fd2f41a1cba099f79a0b6b6c35656cf7c03351a7bae8ff0f28f25270f929d2" -dependencies = [ - "arbitrary", - "cc", -] - -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if", - "winapi", -] - -[[package]] -name = "libloading" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" -dependencies = [ - "cfg-if", - "windows-link 0.2.1", -] - -[[package]] -name = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - -[[package]] -name = "libredox" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d" -dependencies = [ - "libc", -] - -[[package]] -name = "libxdo" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00333b8756a3d28e78def82067a377de7fa61b24909000aeaa2b446a948d14db" -dependencies = [ - "libxdo-sys", -] - -[[package]] -name = "libxdo-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db23b9e7e2b7831bbd8aac0bbeeeb7b68cbebc162b227e7052e8e55829a09212" -dependencies = [ - "libc", - "x11", -] - -[[package]] -name = "line-clipping" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e752191d037c44ad111a8caa762921926658402f01cc1253f7bef2020ece4f5e" -dependencies = [ - "bitflags 2.13.2", -] - -[[package]] -name = "linux-raw-sys" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" - -[[package]] -name = "litemap" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" - -[[package]] -name = "litrs" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" - -[[package]] -name = "longest-increasing-subsequence" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3bd0dd2cd90571056fdb71f6275fada10131182f84899f4b2a916e565d81d86" - -[[package]] -name = "loop9" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" -dependencies = [ - "imgref", -] - -[[package]] -name = "lru" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef9ac18847474e638e3702b76c65d4eb93428471a74778ef0f1be711717f89b5" -dependencies = [ - "hashbrown 0.17.1", -] - -[[package]] -name = "lru-slab" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4050469837a6ff301cd14c1f8f24f88549e6d548f24f64e2148eb0f72cebc51f" - -[[package]] -name = "mac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - -[[package]] -name = "markup5ever" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" -dependencies = [ - "log", - "phf 0.11.3", - "phf_codegen 0.11.3", - "string_cache", - "string_cache_codegen", - "tendril", -] - -[[package]] -name = "match_token" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - -[[package]] -name = "matchit" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" - -[[package]] -name = "maybe-rayon" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" -dependencies = [ - "cfg-if", - "rayon", -] - -[[package]] -name = "memchr" -version = "2.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" - -[[package]] -name = "memfd" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57804b2c9b69967f1536a56f86297e367a33b19e98852ed624b84551cdbc0d90" -dependencies = [ - "rustix", -] - -[[package]] -name = "memmap2" -version = "0.9.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" -dependencies = [ - "libc", -] - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "miniz_oxide" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mio" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" -dependencies = [ - "libc", - "log", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.61.2", -] - -[[package]] -name = "moxcms" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" -dependencies = [ - "num-traits", - "pxfm", -] - -[[package]] -name = "muda" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c9fec5a4e89860383d778d10563a605838f8f0b2f9303868937e5ff32e86177" -dependencies = [ - "crossbeam-channel", - "dpi", - "gtk", - "keyboard-types", - "libxdo", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "once_cell", - "png 0.17.16", - "thiserror 2.0.20", - "windows-sys 0.60.2", -] - -[[package]] -name = "multer" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b" -dependencies = [ - "bytes", - "encoding_rs", - "futures-util", - "http", - "httparse", - "memchr", - "mime", - "spin", - "version_check", -] - -[[package]] -name = "multiversion" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ca4bea16ffc3f443cf7d866912118196bfef4c6a1556ca00f9f9b00bb43f7c" -dependencies = [ - "multiversion-macros", -] - -[[package]] -name = "multiversion-macros" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d416831a7317ef4b08bee00b69cbbb9c8763da7959a7026244d6266869f9c83" -dependencies = [ - "proc-macro2", - "quote", - "rustversion", - "syn 3.0.6", -] - -[[package]] -name = "multiversion_no_op" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743fb55ba31b18fb1ecef6bdc9aa2743314978ac084044301a7eee33fb99a20d" - -[[package]] -name = "native-tls" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "ndk" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" -dependencies = [ - "bitflags 2.13.2", - "jni-sys 0.3.1", - "log", - "ndk-sys", - "num_enum", - "raw-window-handle 0.6.2", - "thiserror 1.0.69", -] - -[[package]] -name = "ndk-context" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" - -[[package]] -name = "ndk-sys" -version = "0.6.0+11769913" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" -dependencies = [ - "jni-sys 0.3.1", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - -[[package]] -name = "no_std_io2" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418abd1b6d34fbf6cae440dc874771b0525a604428704c76e48b29a5e67b8003" -dependencies = [ - "memchr", -] - -[[package]] -name = "nodrop" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" - -[[package]] -name = "nom" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" -dependencies = [ - "memchr", -] - -[[package]] -name = "noop_proc_macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" - -[[package]] -name = "num-bigint" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "bytemuck", - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" - -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "num-integer" -version = "0.1.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_enum" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" -dependencies = [ - "proc-macro-crate 3.5.0", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", -] - -[[package]] -name = "objc2" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" -dependencies = [ - "objc2-encode", - "objc2-exception-helper", -] - -[[package]] -name = "objc2-app-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" -dependencies = [ - "bitflags 2.13.2", - "block2", - "objc2", - "objc2-core-foundation", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" -dependencies = [ - "bitflags 2.13.2", - "dispatch2", - "objc2", -] - -[[package]] -name = "objc2-core-graphics" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" -dependencies = [ - "bitflags 2.13.2", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "objc2-exception-helper" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" -dependencies = [ - "cc", -] - -[[package]] -name = "objc2-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" -dependencies = [ - "bitflags 2.13.2", - "block2", - "objc2", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-ui-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" -dependencies = [ - "bitflags 2.13.2", - "objc2", - "objc2-core-foundation", - "objc2-foundation", -] - -[[package]] -name = "objc2-web-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" -dependencies = [ - "bitflags 2.13.2", - "block2", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", -] - -[[package]] -name = "objc_id" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" -dependencies = [ - "objc", -] - -[[package]] -name = "once_cell" -version = "1.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" - -[[package]] -name = "openssl" -version = "0.10.81" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" -dependencies = [ - "bitflags 2.13.2", - "cfg-if", - "foreign-types 0.3.2", - "libc", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "openssl-probe" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" - -[[package]] -name = "openssl-sys" -version = "0.9.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "palette" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddeed8580d347d2abf3dcf06a5f0b3dc020258338526b277847cd4248a70fc64" -dependencies = [ - "approx", - "libm", - "palette_derive", - "palette_math", -] - -[[package]] -name = "palette_derive" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88537020289b719d81be994ccf1bbf4990f477e2f69ee52fe3e45f43a02e56be" -dependencies = [ - "by_address", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "palette_math" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e6eb142958d64335fb0e345c5b9ead2ecd6fc438c307e9d7d3c4fd428dbaf12" -dependencies = [ - "libm", -] - -[[package]] -name = "pango" -version = "0.18.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" -dependencies = [ - "gio", - "glib", - "libc", - "once_cell", - "pango-sys", -] - -[[package]] -name = "pango-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-link 0.2.1", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pastey" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "phf" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" -dependencies = [ - "phf_shared 0.8.0", -] - -[[package]] -name = "phf" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" -dependencies = [ - "phf_macros", - "phf_shared 0.10.0", - "proc-macro-hack", -] - -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_shared 0.11.3", -] - -[[package]] -name = "phf_codegen" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" -dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", -] - -[[package]] -name = "phf_codegen" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" -dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", -] - -[[package]] -name = "phf_generator" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" -dependencies = [ - "phf_shared 0.8.0", - "rand 0.7.3", -] - -[[package]] -name = "phf_generator" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" -dependencies = [ - "phf_shared 0.10.0", - "rand 0.8.8", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared 0.11.3", - "rand 0.8.8", -] - -[[package]] -name = "phf_macros" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" -dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "phf_shared" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" -dependencies = [ - "siphasher 0.3.11", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher 0.3.11", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher 1.0.3", -] - -[[package]] -name = "pin-project" -version = "1.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" - -[[package]] -name = "pkg-config" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" - -[[package]] -name = "png" -version = "0.17.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide 0.8.9", -] - -[[package]] -name = "png" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" -dependencies = [ - "bitflags 2.13.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide 0.8.9", -] - -[[package]] -name = "pollster" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" - -[[package]] -name = "portable-atomic" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" - -[[package]] -name = "potential_utf" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" -dependencies = [ - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro-crate" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" -dependencies = [ - "toml_datetime 0.6.3", - "toml_edit 0.20.2", -] - -[[package]] -name = "proc-macro-crate" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" -dependencies = [ - "toml_edit 0.25.15+spec-1.1.0", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" - -[[package]] -name = "proc-macro2" -version = "1.0.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proc-macro2-diagnostics" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", - "version_check", -] - -[[package]] -name = "profiling" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" -dependencies = [ - "profiling-procmacros", -] - -[[package]] -name = "profiling-procmacros" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4488a4a36b9a4ba6b9334a32a39971f77c1436ec82c38707bce707699cc3bbcb" -dependencies = [ - "quote", - "syn 2.0.119", -] - -[[package]] -name = "psl-types" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" - -[[package]] -name = "publicsuffix" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42ea446cab60335f76979ec15e12619a2165b5ae2c12166bef27d283a9fadf" -dependencies = [ - "idna", - "psl-types", -] - -[[package]] -name = "pulp" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046aa45b989642ec2e4717c8e72d677b13edd831a4d3b6cf37d9a3e54912496a" -dependencies = [ - "bytemuck", - "cfg-if", - "libm", - "num-complex", - "paste", - "pulp-wasm-simd-flag", - "raw-cpuid", - "reborrow", - "version_check", -] - -[[package]] -name = "pulp-wasm-simd-flag" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d8f70e07b9c3962945a74e59ca1c511bba65b6419468acc217c457d93f3c740" - -[[package]] -name = "pxfm" -version = "0.1.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" - -[[package]] -name = "qoi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "quick-error" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" - -[[package]] -name = "quinn" -version = "0.11.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4051e23e9185c255a7e33ef59cdbca87a22d359052eecd22fc6b901fb37d9d11" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash 2.1.3", - "rustls", - "socket2", - "thiserror 2.0.20", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9746dbde176634f4f2f1faf2404e30a31b2bc1e9cafb5329c95d8177a18c9fc" -dependencies = [ - "bytes", - "getrandom 0.4.3", - "lru-slab", - "rand 0.10.3", - "rand_pcg 0.10.2", - "ring", - "rustc-hash 2.1.3", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.20", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.61.2", -] - -[[package]] -name = "quote" -version = "1.0.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "r-efi" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", - "rand_pcg 0.2.1", -] - -[[package]] -name = "rand" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", -] - -[[package]] -name = "rand" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65c9fb96cbc91e3478eaae79a69fcd3f1ae4ad052e471fe6732fff548984b4af" -dependencies = [ - "chacha20", - "getrandom 0.4.3", - "rand_core 0.10.1", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", -] - -[[package]] -name = "rand_core" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" -dependencies = [ - "getrandom 0.3.4", -] - -[[package]] -name = "rand_core" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_pcg" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_pcg" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" -dependencies = [ - "rand_core 0.10.1", -] - -[[package]] -name = "ratatui" -version = "0.30.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3274ba0a2c5e1bcad2a2005d20f4dc59dad26b2eb0940fb094500dba4099d57d" -dependencies = [ - "instability", - "ratatui-core", - "ratatui-crossterm", - "ratatui-widgets", - "serde", -] - -[[package]] -name = "ratatui-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbb175c433c8e28a809d1f5773a2ae96e68c0ce40db865cbab1020bf33ae479c" -dependencies = [ - "bitflags 2.13.2", - "compact_str", - "hashbrown 0.17.1", - "itertools", - "kasuari", - "lru", - "palette", - "serde", - "strum", - "thiserror 2.0.20", - "unicode-segmentation", - "unicode-truncate", - "unicode-width", -] - -[[package]] -name = "ratatui-crossterm" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567584a3b0e6a8203c23de40b4861497266725eb5363dbfd18a1edd603cca9f0" -dependencies = [ - "cfg-if", - "crossterm", - "instability", - "ratatui-core", -] - -[[package]] -name = "ratatui-widgets" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66e3d19bcc9130ca376277d93b60767ff121ace3be06f5f95f81dd68956407d1" -dependencies = [ - "bitflags 2.13.2", - "hashbrown 0.17.1", - "indoc", - "instability", - "itertools", - "line-clipping", - "ratatui-core", - "serde", - "strum", - "time", - "unicode-segmentation", - "unicode-width", -] - -[[package]] -name = "rav1e" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" -dependencies = [ - "aligned-vec", - "arbitrary", - "arg_enum_proc_macro", - "arrayvec", - "av-scenechange", - "av1-grain", - "bitstream-io", - "built", - "cfg-if", - "interpolate_name", - "itertools", - "libc", - "libfuzzer-sys", - "log", - "maybe-rayon", - "new_debug_unreachable", - "noop_proc_macro", - "num-derive", - "num-traits", - "paste", - "profiling", - "rand 0.9.5", - "rand_chacha 0.9.0", - "simd_helpers", - "thiserror 2.0.20", - "v_frame", - "wasm-bindgen", -] - -[[package]] -name = "ravif" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" -dependencies = [ - "avif-serialize", - "imgref", - "loop9", - "quick-error", - "rav1e", - "rayon", - "rgb", -] - -[[package]] -name = "raw-cpuid" -version = "11.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" -dependencies = [ - "bitflags 2.13.2", -] - -[[package]] -name = "raw-window-handle" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" - -[[package]] -name = "raw-window-handle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" - -[[package]] -name = "rayon" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "reborrow" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags 2.13.2", -] - -[[package]] -name = "redox_users" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60dc65c0ff1a7ae1294b0c67b9f14baf70b644404010370171787bfac1038fc0" -dependencies = [ - "libredox", - "thiserror 2.0.20", -] - -[[package]] -name = "reqwest" -version = "0.12.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" -dependencies = [ - "base64", - "bytes", - "cookie", - "cookie_store", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "js-sys", - "log", - "mime_guess", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tokio-util", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots", -] - -[[package]] -name = "rfd" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20dafead71c16a34e1ff357ddefc8afc11e7d51d6d2b9fbd07eaa48e3e540220" -dependencies = [ - "block2", - "dispatch2", - "js-sys", - "libc", - "log", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "percent-encoding", - "pollster", - "raw-window-handle 0.6.2", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rgb" -version = "0.8.53" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.17", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hash" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" -dependencies = [ - "bitflags 2.13.2", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.23.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634" -dependencies = [ - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pki-types" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" -dependencies = [ - "web-time", - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" - -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "security-framework" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" -dependencies = [ - "bitflags 2.13.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "selectors" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" -dependencies = [ - "bitflags 1.3.2", - "cssparser", - "derive_more 0.99.20", - "fxhash", - "log", - "phf 0.8.0", - "phf_codegen 0.8.0", - "precomputed-hash", - "servo_arc", - "smallvec", -] - -[[package]] -name = "semver" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" - -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" -dependencies = [ - "futures-core", -] - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "serde_json" -version = "1.0.145" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", - "serde_core", -] - -[[package]] -name = "serde_path_to_error" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" -dependencies = [ - "itoa", - "serde", - "serde_core", -] - -[[package]] -name = "serde_qs" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3faaf9e727533a19351a43cc5a8de957372163c7d35cc48c90b75cdda13c352" -dependencies = [ - "percent-encoding", - "serde", - "thiserror 2.0.20", -] - -[[package]] -name = "serde_repr" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "servo_arc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" -dependencies = [ - "nodrop", - "stable_deref_trait", -] - -[[package]] -name = "sha1" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "digest", -] - -[[package]] -name = "shlex" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" - -[[package]] -name = "signal-hook" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-mio" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" -dependencies = [ - "libc", - "mio", - "signal-hook", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - -[[package]] -name = "simd-adler32" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" - -[[package]] -name = "simd_cesu8" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" -dependencies = [ - "rustc_version", - "simdutf8", -] - -[[package]] -name = "simd_helpers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" -dependencies = [ - "quote", -] - -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[package]] -name = "siphasher" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "sledgehammer_bindgen" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49e83e178d176459c92bc129cfd0958afac3ced925471b889b3a75546cfc4133" -dependencies = [ - "sledgehammer_bindgen_macro", - "wasm-bindgen", -] - -[[package]] -name = "sledgehammer_bindgen_macro" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb251b407f50028476a600541542b605bb864d35d9ee1de4f6cab45d88475e6d" -dependencies = [ - "quote", - "syn 2.0.119", -] - -[[package]] -name = "sledgehammer_utils" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "debdd4b83524961983cea3c55383b3910fd2f24fd13a188f5b091d2d504a61ae" -dependencies = [ - "rustc-hash 1.1.0", -] - -[[package]] -name = "slotmap" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" -dependencies = [ - "serde", - "version_check", -] - -[[package]] -name = "smallvec" -version = "1.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba467056f1b547ed52077911161fc86985becbc60e8e1857c8a144dab0def891" - -[[package]] -name = "socket2" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "soup3" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" -dependencies = [ - "futures-channel", - "gio", - "glib", - "libc", - "soup3-sys", -] - -[[package]] -name = "soup3-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" -dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "spin" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "string_cache" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" -dependencies = [ - "new_debug_unreachable", - "parking_lot", - "phf_shared 0.11.3", - "precomputed-hash", - "serde", -] - -[[package]] -name = "string_cache_codegen" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" -dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", - "proc-macro2", - "quote", -] - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "subsecond" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d350d5788fa94d560d92269266a50efc77b036bfca6675e420b64df7b3211f37" -dependencies = [ - "js-sys", - "libc", - "libloading 0.8.9", - "memfd", - "memmap2", - "serde", - "subsecond-types", - "thiserror 2.0.20", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "subsecond-types" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf32d66269b5fbb8558334e8d22b657b2f7af0dd2ef56c231541099a862e464" -dependencies = [ - "serde", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.119" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "system-deps" -version = "6.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" -dependencies = [ - "cfg-expr", - "heck 0.5.0", - "pkg-config", - "toml", - "version-compare", -] - -[[package]] -name = "tao" -version = "0.34.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9103edf55f2da3c82aea4c7fab7c4241032bfeea0e71fa557d98e00e7ce7cc20" -dependencies = [ - "bitflags 2.13.2", - "block2", - "core-foundation", - "core-graphics 0.25.0", - "crossbeam-channel", - "dispatch2", - "dlopen2", - "dpi", - "gdkwayland-sys", - "gdkx11-sys", - "gtk", - "jni 0.21.1", - "libc", - "log", - "ndk", - "ndk-context", - "ndk-sys", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "once_cell", - "parking_lot", - "raw-window-handle 0.5.2", - "raw-window-handle 0.6.2", - "tao-macros", - "unicode-segmentation", - "url", - "windows", - "windows-core", - "windows-version", - "x11-dl", -] - -[[package]] -name = "tao-macros" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7eeb6d99155545da6150a1795945f16ac9c178deb2a5f2e74d776107bd5849" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "target-lexicon" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" - -[[package]] -name = "tempfile" -version = "3.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" -dependencies = [ - "fastrand", - "getrandom 0.4.3", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - -[[package]] -name = "tendril" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" -dependencies = [ - "futf", - "mac", - "utf-8", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" -dependencies = [ - "thiserror-impl 2.0.20", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "tiff" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" -dependencies = [ - "fax", - "flate2", - "half", - "quick-error", - "weezl", - "zune-jpeg", -] - -[[package]] -name = "time" -version = "0.3.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" -dependencies = [ - "deranged", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" - -[[package]] -name = "time-macros" -version = "0.2.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee" - -[[package]] -name = "tokio" -version = "1.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" -dependencies = [ - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2", - "tokio-macros", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-macros" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c85f2c3ef0b1cd58b36682f4b17aaa995f0e5db534d85692b4903abce21f67" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" -dependencies = [ - "bytes", - "futures-core", - "futures-io", - "futures-sink", - "futures-util", - "libc", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime 0.6.3", - "toml_edit 0.20.2", -] - -[[package]] -name = "toml_datetime" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "1.1.1+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap", - "toml_datetime 0.6.3", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime 0.6.3", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.25.15+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1340ea94a5856333492c9064b02c778b191dd2c853778d9609debdcdfea3a614" -dependencies = [ - "indexmap", - "toml_datetime 1.1.1+spec-1.1.0", - "toml_parser", - "winnow 1.0.4", -] - -[[package]] -name = "toml_parser" -version = "1.1.3+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" -dependencies = [ - "winnow 1.0.4", -] - -[[package]] -name = "tower" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-http" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" -dependencies = [ - "bitflags 2.13.2", - "bytes", - "futures-util", - "http", - "http-body", - "pin-project-lite", - "tower", - "tower-layer", - "tower-service", - "url", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "tracing-core" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "tray-icon" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c" -dependencies = [ - "crossbeam-channel", - "dirs", - "libappindicator", - "muda", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-foundation", - "once_cell", - "png 0.17.16", - "thiserror 2.0.20", - "windows-sys 0.60.2", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadc29d668c91fcc564941132e17b28a7ceb2f3ebf0b9dae3e03fd7a6748eb0d" -dependencies = [ - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand 0.9.5", - "sha1", - "thiserror 2.0.20", - "utf-8", -] - -[[package]] -name = "tungstenite" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" -dependencies = [ - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "native-tls", - "rand 0.9.5", - "rustls", - "sha1", - "thiserror 2.0.20", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" - -[[package]] -name = "unicase" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" - -[[package]] -name = "unicode-ident" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" - -[[package]] -name = "unicode-segmentation" -version = "1.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" - -[[package]] -name = "unicode-truncate" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b380a1238663e5f8a691f9039c73e1cdae598a30e9855f541d29b08b53e9a5" -dependencies = [ - "itertools", - "unicode-segmentation", - "unicode-width", -] - -[[package]] -name = "unicode-width" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "uuid" -version = "1.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ef6dac1e96601b4fb3acccccff2139741fcb757cb9a36089bf5be91cfb285ce" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "v_frame" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" -dependencies = [ - "aligned-vec", - "num-traits", - "wasm-bindgen", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version-compare" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "warnings" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f68998838dab65727c9b30465595c6f7c953313559371ca8bf31759b3680ad" -dependencies = [ - "pin-project", - "tracing", - "warnings-macro", -] - -[[package]] -name = "warnings-macro" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59195a1db0e95b920366d949ba5e0d3fc0e70b67c09be15ce5abb790106b0571" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasip2" -version = "1.0.4+wasi-0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.128" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef4c5d3d2cdf5c54f4231181768f5510842e350db025faf1f7163b1030ed928" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.128" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.128" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 3.0.6", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.128" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-streams" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbddc4a036f00ec4f18c83445bd3115cb306a91da554919a099d9222fe4a7f8" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webbrowser" -version = "1.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62c35be770821a214dbc362fc26908c853e776c0004294d0b10b8a6bad582f94" -dependencies = [ - "jni 0.22.4", - "log", - "ndk-context", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "url", - "web-sys", -] - -[[package]] -name = "webkit2gtk" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" -dependencies = [ - "bitflags 1.3.2", - "cairo-rs", - "gdk", - "gdk-sys", - "gio", - "gio-sys", - "glib", - "glib-sys", - "gobject-sys", - "gtk", - "gtk-sys", - "javascriptcore-rs", - "libc", - "once_cell", - "soup3", - "webkit2gtk-sys", -] - -[[package]] -name = "webkit2gtk-sys" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" -dependencies = [ - "bitflags 1.3.2", - "cairo-sys-rs", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "gtk-sys", - "javascriptcore-rs-sys", - "libc", - "pkg-config", - "soup3-sys", - "system-deps", -] - -[[package]] -name = "webpki-roots" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "webview2-com" -version = "0.38.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" -dependencies = [ - "webview2-com-macros", - "webview2-com-sys", - "windows", - "windows-core", - "windows-implement", - "windows-interface", -] - -[[package]] -name = "webview2-com-macros" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "webview2-com-sys" -version = "0.38.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" -dependencies = [ - "thiserror 2.0.20", - "windows", - "windows-core", -] - -[[package]] -name = "weezl" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.61.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" -dependencies = [ - "windows-collections", - "windows-core", - "windows-future", - "windows-link 0.1.3", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" -dependencies = [ - "windows-core", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link 0.1.3", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-future" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" -dependencies = [ - "windows-core", - "windows-link 0.1.3", - "windows-threading", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +checksum = "ddeed8580d347d2abf3dcf06a5f0b3dc020258338526b277847cd4248a70fc64" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", + "approx", + "libm", + "palette_derive", + "palette_math", ] [[package]] -name = "windows-interface" -version = "0.59.3" +name = "palette_derive" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +checksum = "88537020289b719d81be994ccf1bbf4990f477e2f69ee52fe3e45f43a02e56be" dependencies = [ + "by_address", "proc-macro2", "quote", "syn 2.0.119", ] [[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-numerics" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core", - "windows-link 0.1.3", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link 0.2.1", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows-threading" -version = "0.1.0" +name = "palette_math" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +checksum = "6e6eb142958d64335fb0e345c5b9ead2ecd6fc438c307e9d7d3c4fd428dbaf12" dependencies = [ - "windows-link 0.1.3", + "libm", ] [[package]] -name = "windows-version" -version = "0.1.7" +name = "parking_lot" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ - "windows-link 0.2.1", + "lock_api", + "parking_lot_core", ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" +name = "parking_lot_core" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] [[package]] -name = "windows_i686_gnu" -version = "0.53.1" +name = "portable-atomic" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" [[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" +name = "powerfmt" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +checksum = "4a6394b9e965e73d0a289ee54f589087e2c676aedf60885baf52c76b771e4958" [[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" +name = "proc-macro2" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] [[package]] -name = "windows_i686_msvc" -version = "0.42.2" +name = "quote" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] [[package]] -name = "windows_i686_msvc" -version = "0.52.6" +name = "ratatui" +version = "0.30.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +checksum = "3274ba0a2c5e1bcad2a2005d20f4dc59dad26b2eb0940fb094500dba4099d57d" +dependencies = [ + "instability", + "ratatui-core", + "ratatui-crossterm", + "ratatui-widgets", + "serde", +] [[package]] -name = "windows_i686_msvc" -version = "0.53.1" +name = "ratatui-core" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +checksum = "cbb175c433c8e28a809d1f5773a2ae96e68c0ce40db865cbab1020bf33ae479c" +dependencies = [ + "bitflags", + "compact_str", + "hashbrown 0.17.1", + "itertools", + "kasuari", + "lru", + "palette", + "serde", + "strum", + "thiserror", + "unicode-segmentation", + "unicode-truncate", + "unicode-width", +] [[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" +name = "ratatui-crossterm" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "567584a3b0e6a8203c23de40b4861497266725eb5363dbfd18a1edd603cca9f0" +dependencies = [ + "cfg-if", + "crossterm", + "instability", + "ratatui-core", +] [[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" +name = "ratatui-widgets" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +checksum = "66e3d19bcc9130ca376277d93b60767ff121ace3be06f5f95f81dd68956407d1" +dependencies = [ + "bitflags", + "hashbrown 0.17.1", + "indoc", + "instability", + "itertools", + "line-clipping", + "ratatui-core", + "serde", + "strum", + "time", + "unicode-segmentation", + "unicode-width", +] [[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" +name = "redox_syscall" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] [[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" +name = "rustc_version" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] [[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" +name = "rustix" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] [[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" +name = "rustversion" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" +name = "ryu" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" +name = "scopeguard" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" +name = "semver" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] -name = "winnow" -version = "0.5.40" +name = "serde" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ - "memchr", + "serde_core", + "serde_derive", ] [[package]] -name = "winnow" -version = "1.0.4" +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ - "memchr", + "serde_derive", ] [[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" - -[[package]] -name = "writeable" -version = "0.6.4" +name = "serde_derive" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] [[package]] -name = "wry" -version = "0.53.5" +name = "serde_json" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ - "base64", - "block2", - "cookie", - "crossbeam-channel", - "dirs", - "dpi", - "dunce", - "gtk", - "html5ever", - "http", - "javascriptcore-rs", - "jni 0.21.1", - "kuchikiki", - "libc", - "ndk", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "objc2-ui-kit", - "objc2-web-kit", - "once_cell", - "percent-encoding", - "raw-window-handle 0.6.2", - "sha2", - "soup3", - "tao-macros", - "thiserror 2.0.20", - "url", - "webkit2gtk", - "webkit2gtk-sys", - "webview2-com", - "windows", - "windows-core", - "windows-version", + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", ] [[package]] -name = "x11" -version = "2.21.0" +name = "signal-hook" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" dependencies = [ "libc", - "pkg-config", + "signal-hook-registry", ] [[package]] -name = "x11-dl" -version = "2.21.0" +name = "signal-hook-mio" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" dependencies = [ "libc", - "once_cell", - "pkg-config", + "mio", + "signal-hook", ] [[package]] -name = "x11rb" -version = "0.13.2" +name = "signal-hook-registry" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ - "gethostname", - "rustix", - "x11rb-protocol", + "errno", + "libc", ] [[package]] -name = "x11rb-protocol" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" - -[[package]] -name = "xkeysym" -version = "0.2.1" +name = "smallvec" +version = "1.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" [[package]] -name = "xxhash-rust" -version = "0.8.18" +name = "static_assertions" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aee1b19627c7c60102ab80d3a9cbe18de90bfe03bfa6c3715447681f0e8c8af6" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] -name = "y4m" -version = "0.8.0" +name = "strsim" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] -name = "yoke" -version = "0.8.3" +name = "strum" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", + "strum_macros", ] [[package]] -name = "yoke-derive" -version = "0.8.3" +name = "strum_macros" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33811428bee40dbceb6d545e95754741d17a6aef9a4849f0fd62e2ba4f412a78" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" dependencies = [ + "heck", "proc-macro2", "quote", - "syn 3.0.6", - "synstructure", + "syn 2.0.119", ] [[package]] -name = "zerocopy" -version = "0.8.57" +name = "syn" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d35102a9f36d089ccae9e4c6802bc118be4487b80aaffc0ab4e0cf5ce92d2873" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" dependencies = [ - "zerocopy-derive", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] -name = "zerocopy-derive" -version = "0.8.57" +name = "syn" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c01f5ab44258da43cf276c74a2763db2ff3969c9c652c3f2de07041d0b2bc" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "unicode-ident", ] [[package]] -name = "zerofrom" -version = "0.1.8" +name = "thiserror" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ - "zerofrom-derive", + "thiserror-impl", ] [[package]] -name = "zerofrom-derive" -version = "0.1.8" +name = "thiserror-impl" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" dependencies = [ "proc-macro2", "quote", "syn 3.0.6", - "synstructure", ] [[package]] -name = "zeroize" -version = "1.9.0" +name = "time" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +dependencies = [ + "deranged", + "libc", + "num-conv", + "num_threads", + "powerfmt", + "serde_core", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] -name = "zerotrie" -version = "0.2.5" +name = "unicode-ident" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" [[package]] -name = "zerovec" -version = "0.11.8" +name = "unicode-segmentation" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] -name = "zerovec-derive" -version = "0.11.6" +name = "unicode-truncate" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" +checksum = "16b380a1238663e5f8a691f9039c73e1cdae598a30e9855f541d29b08b53e9a5" dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.6", + "itertools", + "unicode-segmentation", + "unicode-width", ] [[package]] -name = "zlib-rs" -version = "0.6.8" +name = "unicode-width" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] -name = "zune-core" -version = "0.5.3" +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56377fd46368984a170bc5aac5567e52ca5da874caa60bea39fcbca78fb658b" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "zune-inflate" -version = "0.2.54" +name = "winapi" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ - "simd-adler32", + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", ] [[package]] -name = "zune-jpeg" -version = "0.5.15" +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "zune-core", + "windows-link", ] diff --git a/examples/malleable-site/renderers/Cargo.toml b/examples/malleable-site/renderers/Cargo.toml index a0ebb81b..a9d88522 100644 --- a/examples/malleable-site/renderers/Cargo.toml +++ b/examples/malleable-site/renderers/Cargo.toml @@ -10,14 +10,10 @@ publish = false [features] default = ["tui"] tui = ["dep:ratatui", "dep:crossterm"] -dioxus-ui = ["dep:dioxus"] -web = ["dioxus-ui", "dioxus/web"] -desktop = ["dioxus-ui", "dioxus/desktop"] [dependencies] serde = { version = "=1.0.228", features = ["derive"] } serde_json = "=1.0.145" -dioxus = { version = "=0.7.10", optional = true, default-features = false, features = ["macro", "html", "signals", "hooks", "launch"] } ratatui = { version = "=0.30.2", optional = true, default-features = false, features = ["crossterm", "crossterm_0_29", "unstable-rendered-line-info"] } crossterm = { version = "=0.29.0", optional = true } @@ -26,11 +22,6 @@ name = "surface-tui" path = "src/bin/tui.rs" required-features = ["tui"] -[[bin]] -name = "surface-dioxus" -path = "src/bin/dioxus.rs" -required-features = ["dioxus-ui"] - [profile.release] opt-level = "s" lto = true diff --git a/examples/malleable-site/renderers/README.md b/examples/malleable-site/renderers/README.md index 3ce2060b..156d7ac5 100644 --- a/examples/malleable-site/renderers/README.md +++ b/examples/malleable-site/renderers/README.md @@ -1,17 +1,22 @@ # Renderer feasibility -This isolated Rust workspace tests the **same admitted marketing view tree** in -Dioxus web, Dioxus desktop, and Ratatui. It does not add dependencies to the ALGAL +This isolated Rust workspace tests the **same admitted marketing view tree** in a +Ratatui terminal adapter. It does not add dependencies to the ALGAL kernel workspace. `fixtures/view.json` is generated by the actual Rust-backed ALGAL expression in `../surface.ts`, with the default configuration and signals. -The renderers consume that result; they do not implement another view evaluator. +The renderer consumes that result; it does not implement another view evaluator. The bounded input supports only `stack`, `text`, and a link whose destination is -the host-fixed `/docs/`. Stable node IDs become Dioxus keys and scoped data -attributes. Text is inserted as text rather than HTML. A split layout places body +the host-fixed `/docs/`. Text is inserted as text rather than HTML. A split layout places body and CTA beside one another when space permits; the terminal has its own wrapping and color treatment. Ratatui displays the link's destination without opening it. +The earlier Dioxus web and desktop adapters were removed: their dependency +trees (WebView, GTK, servo HTML parsing) dominated this workspace's lockfile +while carrying advisories the experiment could not reach a fix for. The +[recorded measurements](measurement.json) remain as the dated evidence for +those removed adapters. + From this directory: ```sh @@ -27,35 +32,13 @@ loads another bounded tree and produces a plain text TestBackend rendering. Interactive rendering uses the embedded fixture. No editor, proposal generation, activation, or network request occurs in the TUI. -The web build requires a Rust toolchain with the `wasm32-unknown-unknown` target, -Trunk 0.21.14, and wasm-bindgen 0.2.128. With the locally qualified toolchain: - -```sh -NO_COLOR=true RUSTC="$(rustup which --toolchain 1.98.1 rustc)" \ - rustup run 1.98.1 trunk build --release --locked --skip-version-check -``` - -The explicit compiler avoids Homebrew's `cargo` selecting a different compiler -without the WASM target. Trunk 0.21.14 expects `NO_COLOR` to be a boolean, not `1`. -The pinned wasm-opt 123 runs with explicit bulk-memory support matching this -Rust compiler's emitted instructions. -Serve the generated `dist/` using any static server. The native Dioxus desktop -build on macOS is: - -```sh -cargo build --locked --no-default-features --features desktop --bin surface-dioxus -./target/debug/surface-dioxus -``` - Use the repository's host scheduler for heavyweight builds and browser/native -launches, as directed by `AGENTS.md`. Do not run both Dioxus `web` and `desktop` -features in the same binary. Exact dependency resolution is retained in the +launches, as directed by `AGENTS.md`. Exact dependency resolution is retained in the workspace's own lockfile. Ratatui is pinned because its paragraph line-count API currently requires the `unstable-rendered-line-info` feature. -These are renderer feasibility adapters, not packaged applications. The desktop -adapter uses the platform WebView; it is not a proof of platform-native widgets. -The desktop preview has no docs route handler. Browser-hosted `/docs/` resolution +These are renderer feasibility adapters, not packaged applications. +Browser-hosted `/docs/` resolution belongs to the embedding site. The tree has no input widgets, so this experiment does **not** qualify IME, draft/focus preservation across updates, assistive technology behavior, or general form editing. Mobile, Windows, Linux desktop, @@ -63,21 +46,18 @@ offline model inference, app signing, and distribution remain unqualified. The browser workbench and durable host lifecycle are implemented in the parent example, not in these adapters. This experiment informs the later renderer choice; -it does not couple ALGAL semantics to Dioxus or Ratatui. +it does not couple ALGAL semantics to Ratatui. -The [recorded measurements](measurement.json) qualify five passing Rust tests, -strict Clippy, fixture freshness, the web release build, the macOS desktop build, -and the actual [terminal snapshot](tui-snapshot.txt), with unused trailing empty rows omitted. The web distribution is +The [recorded measurements](measurement.json) date from when the workspace also +carried Dioxus web and desktop adapters; they qualify the then-present web +release build, the macOS desktop build, five passing Rust tests, +strict Clippy, fixture freshness, +and the actual [terminal snapshot](tui-snapshot.txt), with unused trailing empty rows omitted. The web distribution was 362,713 bytes before compression, including a 311,048-byte WASM module. Browser and native window interaction evidence belongs to the integration owner's -separate visual checks; compilation alone is not runtime qualification. The -native build also reports an upstream future-incompatibility warning in -`block 0.1.6`; distribution would need a fresh toolchain/dependency qualification. +separate visual checks; compilation alone is not runtime qualification. -The result supports keeping the semantic tree independent of a renderer. It -does not establish that Dioxus should replace the lighter existing marketing-site -renderer or that a terminal should reproduce browser pixels. +The result supports keeping the semantic tree independent of a renderer. +It does not establish that a terminal should reproduce browser pixels. -References: [Dioxus 0.7.10 API](https://docs.rs/dioxus/0.7.10/dioxus/), -[Dioxus platform structure](https://dioxuslabs.com/learn/0.7/beyond/project_structure/), -[Ratatui source](https://github.com/ratatui/ratatui). +References: [Ratatui source](https://github.com/ratatui/ratatui). diff --git a/examples/malleable-site/renderers/Trunk.toml b/examples/malleable-site/renderers/Trunk.toml deleted file mode 100644 index ca1dd12e..00000000 --- a/examples/malleable-site/renderers/Trunk.toml +++ /dev/null @@ -1,8 +0,0 @@ -[build] -target = "index.html" -dist = "dist" -public_url = "./" - -[tools] -wasm_bindgen = "0.2.128" -wasm_opt = "version_123" diff --git a/examples/malleable-site/renderers/index.html b/examples/malleable-site/renderers/index.html deleted file mode 100644 index 44aba33c..00000000 --- a/examples/malleable-site/renderers/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - ALGAL · Dioxus surface feasibility - - -
- diff --git a/examples/malleable-site/renderers/src/bin/dioxus.rs b/examples/malleable-site/renderers/src/bin/dioxus.rs deleted file mode 100644 index 469b8164..00000000 --- a/examples/malleable-site/renderers/src/bin/dioxus.rs +++ /dev/null @@ -1,21 +0,0 @@ -use algal_surface_renderers::{ - FIXTURE, - dioxus_adapter::{STYLE, Surface}, - parse_view, -}; -use dioxus::prelude::*; - -fn main() { - dioxus::launch(app); -} - -fn app() -> Element { - let node = parse_view(FIXTURE).expect("checked embedded surface"); - rsx! { - style { "{STYLE}" } - main { - p { class: "meta", "ALGAL / Dioxus renderer feasibility · shared surface tree" } - Surface { node } - } - } -} diff --git a/examples/malleable-site/renderers/src/dioxus_adapter.rs b/examples/malleable-site/renderers/src/dioxus_adapter.rs deleted file mode 100644 index 5733da3a..00000000 --- a/examples/malleable-site/renderers/src/dioxus_adapter.rs +++ /dev/null @@ -1,53 +0,0 @@ -use crate::{Layout, Role, SurfaceNode}; -use dioxus::prelude::*; - -/// Keys preserve stable component identities across admitted tree replacements. -#[component] -pub fn Surface(node: SurfaceNode) -> Element { - match node { - SurfaceNode::Stack { - id, - layout, - children, - } => { - let class = if layout == Layout::Split { - "surface-stack surface-split" - } else { - "surface-stack" - }; - rsx! { section { "data-surface-id": id, class, - for child in children { Surface { key: "{child.id()}", node: child } } - } } - } - SurfaceNode::Text { id, role, text } => match role { - Role::Heading => rsx! { h1 { "data-surface-id": id, "{text}" } }, - Role::Eyebrow => rsx! { p { "data-surface-id": id, class: "eyebrow", "{text}" } }, - Role::Body => rsx! { p { "data-surface-id": id, class: "body", "{text}" } }, - Role::Status => { - rsx! { p { "data-surface-id": id, class: "status", role: "status", "{text}" } } - } - }, - SurfaceNode::Link { id, label, href } => { - rsx! { a { "data-surface-id": id, class: "cta", href, "{label}" } } - } - } -} - -pub const STYLE: &str = r#" -:root { color-scheme: dark; font-family: ui-sans-serif, system-ui, sans-serif; background: #101210; color: #eef0e6; } -body { margin: 0; padding: clamp(1.25rem, 6vw, 5rem); } -main { max-width: 64rem; margin: auto; } -.meta { color: #aeb7a8; font: .75rem ui-monospace, monospace; margin: 0 0 3rem; } -.surface-stack { display: flex; flex-direction: column; gap: 1.25rem; } -.surface-split { display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr); gap: 2rem; } -.surface-split > h1, .surface-split > .eyebrow, .surface-split > .status { grid-column: 1 / -1; } -.surface-split > .cta { align-self: end; } -h1 { font-size: clamp(2.4rem, 6vw, 4.5rem); line-height: 1.02; font-weight: 500; letter-spacing: -.055em; margin: 0; overflow-wrap: anywhere; } -p { margin: 0; } -.eyebrow { color: #c6f08b; font-size: .75rem; text-transform: uppercase; letter-spacing: .14em; } -.body { color: #c7cec1; max-width: 40rem; font-size: 1.1rem; line-height: 1.6; } -.status { color: #aeb7a8; font: .8rem ui-monospace, monospace; border-top: 1px solid #333a30; padding-top: 1rem; } -.cta { align-self: flex-start; justify-self: start; color: #17220e; background: #c6f08b; border-radius: .3rem; padding: .85rem 1rem; font-size: .9rem; text-decoration: none; } -a:focus-visible { outline: 3px solid white; outline-offset: 5px; } -@media(max-width: 40rem) { .surface-split { display: flex; flex-direction: column; } } -"#; diff --git a/examples/malleable-site/renderers/src/lib.rs b/examples/malleable-site/renderers/src/lib.rs index 02881c0d..aefde549 100644 --- a/examples/malleable-site/renderers/src/lib.rs +++ b/examples/malleable-site/renderers/src/lib.rs @@ -115,8 +115,6 @@ fn validate(node: &SurfaceNode, depth: usize, ids: &mut BTreeSet) -> Res Ok(()) } -#[cfg(feature = "dioxus-ui")] -pub mod dioxus_adapter; #[cfg(feature = "tui")] pub mod tui_adapter; From 0ce2f6d8fc23fc69817d21620a4fffd3e26170b7 Mon Sep 17 00:00:00 2001 From: 0thernet Date: Mon, 5 Oct 2026 15:10:20 -0400 Subject: [PATCH 2/2] Remove the terminal renderer adapters The renderer spike concluded: the examples keep their Bun host CLI and served browser presentation, so the Ratatui crates, their fixtures, measurement suite and the CI job that gated them are removed. The packaged triage artifact now ships bin/triage-host only, with the manifest renderer field updated accordingly. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 34 - docs/browser-tasks.md | 4 +- docs/local-triage.md | 24 +- docs/malleable-roadmap-progress.md | 5 +- docs/malleable-site.md | 2 +- examples/local-triage/package-smoke.ts | 6 +- examples/local-triage/package.ts | 16 +- examples/local-triage/renderers/Cargo.lock | 846 ----------------- examples/local-triage/renderers/Cargo.toml | 28 - examples/local-triage/renderers/README.md | 93 -- examples/local-triage/renderers/fixture.json | 327 ------- .../renderers/performance/README.md | 75 -- .../renderers/performance/browser.ts | 78 -- .../renderers/performance/budgets.json | 37 - .../renderers/performance/host-actions.ts | 47 - .../renderers/performance/measurement.json | 371 -------- .../renderers/performance/native.ts | 56 -- .../local-triage/renderers/src/bin/tui.rs | 431 --------- examples/local-triage/renderers/src/lib.rs | 894 ------------------ examples/malleable-site/README.md | 5 +- examples/malleable-site/renderers/.gitignore | 2 - examples/malleable-site/renderers/Cargo.lock | 846 ----------------- examples/malleable-site/renderers/Cargo.toml | 29 - examples/malleable-site/renderers/README.md | 63 -- .../renderers/fixtures/generate.ts | 13 - .../renderers/fixtures/view.json | 37 - .../malleable-site/renderers/measurement.json | 129 --- .../malleable-site/renderers/src/bin/tui.rs | 52 - examples/malleable-site/renderers/src/lib.rs | 183 ---- .../renderers/src/tui_adapter.rs | 136 --- .../malleable-site/renderers/tui-snapshot.txt | 10 - tsconfig.json | 3 - 32 files changed, 28 insertions(+), 4854 deletions(-) delete mode 100644 examples/local-triage/renderers/Cargo.lock delete mode 100644 examples/local-triage/renderers/Cargo.toml delete mode 100644 examples/local-triage/renderers/README.md delete mode 100644 examples/local-triage/renderers/fixture.json delete mode 100644 examples/local-triage/renderers/performance/README.md delete mode 100644 examples/local-triage/renderers/performance/browser.ts delete mode 100644 examples/local-triage/renderers/performance/budgets.json delete mode 100644 examples/local-triage/renderers/performance/host-actions.ts delete mode 100644 examples/local-triage/renderers/performance/measurement.json delete mode 100644 examples/local-triage/renderers/performance/native.ts delete mode 100644 examples/local-triage/renderers/src/bin/tui.rs delete mode 100644 examples/local-triage/renderers/src/lib.rs delete mode 100644 examples/malleable-site/renderers/.gitignore delete mode 100644 examples/malleable-site/renderers/Cargo.lock delete mode 100644 examples/malleable-site/renderers/Cargo.toml delete mode 100644 examples/malleable-site/renderers/README.md delete mode 100644 examples/malleable-site/renderers/fixtures/generate.ts delete mode 100644 examples/malleable-site/renderers/fixtures/view.json delete mode 100644 examples/malleable-site/renderers/measurement.json delete mode 100644 examples/malleable-site/renderers/src/bin/tui.rs delete mode 100644 examples/malleable-site/renderers/src/lib.rs delete mode 100644 examples/malleable-site/renderers/src/tui_adapter.rs delete mode 100644 examples/malleable-site/renderers/tui-snapshot.txt diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7b4c8340..1656b26e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -217,37 +217,6 @@ jobs: ${{ runner.temp }}/algal-idb-evidence/*.json if-no-files-found: ignore - surface-renderers: - name: Surface renderer contract (ubuntu-24.04) - needs: changes - if: needs.changes.outputs.code == 'true' - runs-on: ubuntu-24.04 - timeout-minutes: 20 - steps: - - uses: actions/checkout@v7 - - uses: oven-sh/setup-bun@v2 - with: - bun-version: ${{ env.BUN_VERSION }} - - uses: dtolnay/rust-toolchain@master - with: - toolchain: ${{ env.RUST_TOOLCHAIN }} - components: clippy, rustfmt - - uses: Swatinem/rust-cache@v2 - with: - shared-key: surface-renderers - save-if: ${{ github.ref == 'refs/heads/main' }} - workspaces: | - examples/malleable-site/renderers -> target - examples/local-triage/renderers -> target - - run: bun examples/malleable-site/renderers/fixtures/generate.ts --check - - run: cargo fmt --manifest-path examples/malleable-site/renderers/Cargo.toml -- --check - - run: cargo test --manifest-path examples/malleable-site/renderers/Cargo.toml --locked - - run: cargo clippy --manifest-path examples/malleable-site/renderers/Cargo.toml --locked --all-targets -- -D warnings - - - run: cargo fmt --manifest-path examples/local-triage/renderers/Cargo.toml -- --check - - run: cargo test --manifest-path examples/local-triage/renderers/Cargo.toml --locked - - run: cargo clippy --manifest-path examples/local-triage/renderers/Cargo.toml --locked --all-targets -- -D warnings - # One Linux build of the kernel: fmt, clippy, the test suite (which builds # the debug binary) and the debug binary as an artifact that the parity, # application-parity and demo jobs download instead of compiling again. @@ -490,7 +459,6 @@ jobs: - test - coding-harness - browser-grow - - surface-renderers - native - native-parity-build - native-macos @@ -510,7 +478,6 @@ jobs: TEST: ${{ needs.test.result }} CODING_HARNESS: ${{ needs.coding-harness.result }} BROWSER_GROW: ${{ needs.browser-grow.result }} - SURFACE_RENDERERS: ${{ needs.surface-renderers.result }} NATIVE: ${{ needs.native.result }} NATIVE_PARITY_BUILD: ${{ needs.native-parity-build.result }} NATIVE_MACOS: ${{ needs.native-macos.result }} @@ -536,7 +503,6 @@ jobs: require test "$TEST" false require coding-harness "$CODING_HARNESS" "$code_skip" require browser-grow "$BROWSER_GROW" "$browser_skip" - require surface-renderers "$SURFACE_RENDERERS" "$code_skip" require native "$NATIVE" "$code_skip" require native-parity-build "$NATIVE_PARITY_BUILD" "$code_skip" require native-macos "$NATIVE_MACOS" "$code_skip" diff --git a/docs/browser-tasks.md b/docs/browser-tasks.md index ef3fbe99..e625b883 100644 --- a/docs/browser-tasks.md +++ b/docs/browser-tasks.md @@ -96,5 +96,5 @@ Rust expression evaluator runs as WebAssembly. A secure browser context and those storage APIs are required. The browser renderer and application checks remain trusted software; the editable workflow cannot replace them. -See [local triage](local-triage.md) for the same task model in a local Bun host, -Dioxus desktop interface, and Ratatui terminal interface. +See [local triage](local-triage.md) for the same task model in a local Bun host +and its served browser workspace. diff --git a/docs/local-triage.md b/docs/local-triage.md index 8b57eebe..61e8355d 100644 --- a/docs/local-triage.md +++ b/docs/local-triage.md @@ -2,8 +2,8 @@ Local triage is a second ALGAL application with persistent tasks, typed forms, filtering, grouping, ordering and an editable reopening policy. The same captured -state and typed commands drive its browser, Dioxus desktop and Ratatui terminal -presentations. Schema v2 adds task categories through a replayable memory migration. +state and typed commands drive its served browser presentation and the standalone +host CLI. Schema v2 adds task categories through a replayable memory migration. The [browser task workspace](browser-tasks.md) runs this task model with IndexedDB storage and an offline page. The commands below use the filesystem @@ -23,17 +23,15 @@ commands for that serving process. The browser removes the token from the addres bar; the server checks the exact host and origin. Task state is stored in the selected local directory. Stop the server to revoke access. -The macOS arm64 package contains `ALGAL Triage.app`, `bin/triage-tui` and a -standalone `bin/triage-host`. The host embeds Bun and the exact ALGAL expression -WASM, so running an extracted package needs neither a checkout nor an installed -Bun. Build it with `bun examples/local-triage/package.ts`; the repository's -host scheduling rules apply to native builds. Packaging refuses to overwrite -an existing artifact directory. The package manifest records byte hashes. - -The desktop adapter uses the system WebView. The local artifact is ad-hoc signed, -not notarized; other desktop operating systems and mobile distribution are not -qualified by this package. See the [renderer guide](../examples/local-triage/renderers/README.md) -for keyboard controls, build commands and the exact supported profiles. +The macOS arm64 package contains the standalone `bin/triage-host` CLI. The host +embeds Bun and the exact ALGAL expression WASM, so running an extracted package +needs neither a checkout nor an installed Bun. Build it with +`bun examples/local-triage/package.ts`; the repository's host scheduling rules +apply to native builds. Packaging refuses to overwrite an existing artifact +directory. The package manifest records byte hashes. + +The local artifact is unsigned; other desktop operating systems and mobile +distribution are not qualified by this package. ## Tasks, drafts and revisions diff --git a/docs/malleable-roadmap-progress.md b/docs/malleable-roadmap-progress.md index 7cd82639..141ab1aa 100644 --- a/docs/malleable-roadmap-progress.md +++ b/docs/malleable-roadmap-progress.md @@ -176,8 +176,9 @@ and session drafts remain separate, with explicit stale-head rebase and conflict The profile is bounded to 32 tasks and 128 states; forks copy no mutable custody, dispatch ledger or external authority. The package is ad-hoc signed, not notarized. -[Renderer measurements](../examples/local-triage/renderers/performance/README.md) -use budgets declared before execution. The embed passed nine checks: 95,438 gzip +The 2026-09-23 renderer measurements (removed with the renderer experiments; +the git history retains `examples/local-triage/renderers/performance/`) +used budgets declared before execution. The embed passed nine checks: 95,438 gzip bytes, 40.8 ms local cold readiness p95, 0.2 ms synchronous update p95, 772,676 bytes retained JS growth after 1,000 revision swaps and 100 mount cycles, zero DOM growth and no measured host interference. Packaged host capture and TUI snapshot diff --git a/docs/malleable-site.md b/docs/malleable-site.md index 31ae4f94..45992d49 100644 --- a/docs/malleable-site.md +++ b/docs/malleable-site.md @@ -129,7 +129,7 @@ or navigation contract. The site build emits the starting [revision](/living/initial.json), [signals](/living/signals.json), [semantic view](/living/view.json), [manifest](/living/manifest.json), [portable bundle](/living/bundle.json) and [replay-verified receipt](/living/receipt.json). These files describe the starting example, not later unexported browser edits. -The renderer spike under `examples/malleable-site/renderers/` consumes the same semantic tree. Its results distinguish a web renderer, a desktop WebView and a terminal presentation. Renderer compatibility does not imply identical pixels, full native widgets or general interactive application portability. +Earlier renderer spikes under `examples/malleable-site/renderers/` (web, desktop WebView and terminal) were removed after the feasibility measurements concluded; the git history retains them. Renderer compatibility does not imply identical pixels, full native widgets or general interactive application portability. ## Scope diff --git a/examples/local-triage/package-smoke.ts b/examples/local-triage/package-smoke.ts index eb613807..3212f741 100644 --- a/examples/local-triage/package-smoke.ts +++ b/examples/local-triage/package-smoke.ts @@ -35,9 +35,9 @@ try { const types = await command(["/usr/bin/tar", "-tvzf", resolve(archive)]); assert(types.trim().split("\n").every(line => line.startsWith("-") || line.startsWith("d")), "Archive contains only regular files/directories"); await command(["/usr/bin/tar", "-xzf", resolve(archive), "-C", temporary]); - const manifest = JSON.parse(await readFile(join(root, "manifest.json"), "utf8")) as { contract: string; files: { path: string; bytes: number; sha256: string }[]; provenance: { gitHead: string; gitWorktreeDirty: boolean; bunVersion: string; rustcVersion: string; source: { sha256: string; files: unknown[] } } }; + const manifest = JSON.parse(await readFile(join(root, "manifest.json"), "utf8")) as { contract: string; files: { path: string; bytes: number; sha256: string }[]; provenance: { gitHead: string; gitWorktreeDirty: boolean; bunVersion: string; source: { sha256: string; files: unknown[] } } }; assert(manifest.contract === "algal.triage-package.v1", "Package manifest contract matches"); - assert(/^[a-f0-9]{40,64}$/.test(manifest.provenance.gitHead) && typeof manifest.provenance.gitWorktreeDirty === "boolean" && !!manifest.provenance.bunVersion && !!manifest.provenance.rustcVersion && manifest.provenance.source.files.length > 0 && createHash("sha256").update(JSON.stringify(manifest.provenance.source.files)).digest("hex") === manifest.provenance.source.sha256, "Retained source identity and toolchain provenance match manifest"); + assert(/^[a-f0-9]{40,64}$/.test(manifest.provenance.gitHead) && typeof manifest.provenance.gitWorktreeDirty === "boolean" && !!manifest.provenance.bunVersion && manifest.provenance.source.files.length > 0 && createHash("sha256").update(JSON.stringify(manifest.provenance.source.files)).digest("hex") === manifest.provenance.source.sha256, "Retained source identity and toolchain provenance match manifest"); for (const file of manifest.files) { const bytes = await readFile(join(root, file.path)); assert(bytes.length === file.bytes && createHash("sha256").update(bytes).digest("hex") === file.sha256, `Exact packaged bytes: ${file.path}`); } for (const file of manifest.files.filter(item => item.path.startsWith("bin/") || item.path.includes("/Resources/bin/") || item.path.includes("/MacOS/"))) { const dependencies = (await command(["/usr/bin/otool", "-L", join(root, file.path)])).trim().split("\n").slice(1).map(line => line.trim().split(" (", 1)[0]!); @@ -66,8 +66,6 @@ try { assert((await host<{ ok: boolean }>("verify", transfer)).ok, "Extracted package replays exported migration evidence"); const forked = await host("fork", undefined, [file, "forked"]); assert(forked.application === "forked" && forked.tasks.length === 1, "Extracted package forks into new authority-free identity"); - const tui = await command([join(root, "bin/triage-tui"), "--dir", state, "--application", "smoke", "--snapshot"]); - assert(tui.includes("Extracted app task") && tui.includes("Keep this draft"), "Extracted TUI renders actual retained tasks and stale draft"); const server = Bun.spawn([join(root, "bin/triage-host"), state, "smoke", "serve"], { cwd: empty, env: { PATH: "/usr/bin:/bin", LANG: "en_US.UTF-8" }, stdin: "ignore", stdout: "pipe", stderr: "ignore" }); const serverTimer = setTimeout(() => server.kill("SIGKILL"), 30000); const reader = server.stdout.getReader(); diff --git a/examples/local-triage/package.ts b/examples/local-triage/package.ts index 2dbfbb35..be5ba39f 100644 --- a/examples/local-triage/package.ts +++ b/examples/local-triage/package.ts @@ -6,14 +6,12 @@ import { fileURLToPath } from "node:url"; import { release } from "node:os"; const root = resolve(dirname(fileURLToPath(import.meta.url)), "../.."), args = process.argv.slice(2); -let output = join(root, "examples/local-triage/dist"), target = join(root, "examples/malleable-site/renderers/target"), native: string | null = null, bridge: string | null = null, skipRust = false; +let output = join(root, "examples/local-triage/dist"), native: string | null = null, bridge: string | null = null; for (let i = 0; i < args.length; i++) { const value = args[i]; if (value === "--output") output = resolve(args[++i] ?? ""); - else if (value === "--target-dir") target = resolve(args[++i] ?? ""); else if (value === "--native") native = resolve(args[++i] ?? ""); else if (value === "--bridge") bridge = resolve(args[++i] ?? ""); - else if (value === "--skip-rust") skipRust = true; else throw new Error(`Unknown package argument ${value}`); } if (process.platform !== "darwin" || process.arch !== "arm64") throw new Error("This package target requires macOS arm64"); @@ -33,32 +31,30 @@ async function commandText(argv: string[]): Promise { return stdout.trim(); } async function sourceSnapshot() { - const patterns = ["package.json", "bun.lock", "tsconfig.json", "src/**/*.ts", "src/algal_expr.wasm", "examples/local-triage/*.ts", "examples/local-triage/session-compatibility-fixtures.json", "examples/local-triage/renderers/src/**/*.rs", "examples/local-triage/renderers/Cargo.toml", "examples/local-triage/renderers/Cargo.lock", "examples/local-triage/renderers/fixture.json", "examples/local-triage-web/*.ts", "examples/local-triage-inference/*.ts"]; + const patterns = ["package.json", "bun.lock", "tsconfig.json", "src/**/*.ts", "src/algal_expr.wasm", "examples/local-triage/*.ts", "examples/local-triage/session-compatibility-fixtures.json", "examples/local-triage-web/*.ts", "examples/local-triage-inference/*.ts"]; const paths = new Set(); for (const pattern of patterns) for await (const path of new Bun.Glob(pattern).scan({ cwd: root, onlyFiles: true })) paths.add(path); const files = await Promise.all([...paths].sort().map(async path => { const bytes = await readFile(join(root, path)); return { path, bytes: bytes.length, sha256: createHash("sha256").update(bytes).digest("hex") }; })); return { scope: "declared-source-superset-including-tests", patterns, sha256: createHash("sha256").update(JSON.stringify(files)).digest("hex"), files }; } const source = await sourceSnapshot(); -const provenance = { gitHead: await commandText(["/usr/bin/git", "rev-parse", "HEAD"]), gitWorktreeDirty: (await commandText(["/usr/bin/git", "status", "--porcelain"])).length > 0, bunVersion: Bun.version, rustcVersion: await commandText([join(process.env.HOME ?? "", ".cargo/bin/rustc"), "--version"]), cargoVersion: await commandText([join(process.env.HOME ?? "", ".cargo/bin/cargo"), "--version"]), darwinRelease: release(), rendererBuild: skipRust ? "reuse-existing-explicitly-requested" : "cargo build --locked --offline (debug)", hostBuild: "bun build --compile --target=bun-darwin-arm64", bundledInferenceSourceRebuilt: false, source }; -if (!skipRust) await command([join(process.env.HOME ?? "", ".cargo/bin/cargo"), "build", "--manifest-path", join(root, "examples/local-triage/renderers/Cargo.toml"), "--locked", "--offline", "--target-dir", target]); +const provenance = { gitHead: await commandText(["/usr/bin/git", "rev-parse", "HEAD"]), gitWorktreeDirty: (await commandText(["/usr/bin/git", "status", "--porcelain"])).length > 0, bunVersion: Bun.version, darwinRelease: release(), hostBuild: "bun build --compile --target=bun-darwin-arm64", bundledInferenceSourceRebuilt: false, source }; await command([process.execPath, "build", join(root, "examples/local-triage/packaged-entry.ts"), "--compile", "--target=bun-darwin-arm64", "--outfile", join(bin, "triage-host")]); -await copyFile(join(target, "debug/triage-tui"), join(bin, "triage-tui")); if (native && bridge) { for (const [source, name] of [[native, "algal-native"], [bridge, "algal-apple"]] as const) { const info = await stat(source); if (!info.isFile() || info.size > 268_435_456 || !(info.mode & 0o111)) throw new Error("Bundled inference path is not a bounded executable"); await copyFile(source, join(bin, name)); } } -const executablePaths = ["bin/triage-host", "bin/triage-tui", ...(native ? ["bin/algal-native", "bin/algal-apple"] : [])]; +const executablePaths = ["bin/triage-host", ...(native ? ["bin/algal-native", "bin/algal-apple"] : [])]; for (const path of executablePaths) await chmod(join(directory, path), 0o755); -const readme = `# ALGAL Triage — macOS arm64\n\nRun bin/triage-tui in a terminal, or bin/triage-host for the standalone CLI.\nNeither needs a source checkout or Bun installation.\nFor the same application in a browser, run bin/triage-host DIRECTORY APPLICATION serve and open its local owner URL. Initialize a new identity with init first. Keep the owner URL private.\n\nDefault state: ~/Library/Application Support/ALGAL Triage\nOptional args: --dir DIRECTORY --application ID --host EXECUTABLE\nUse a separate directory for experiments. Existing state is preserved on errors.\n\n32 tasks / 128 lifecycle states per identity. Save drafts before closing.\nExact-head commands, retained receipts, explicit migration and authority-free forks.\nThis local artifact is unsigned.\n${native ? "Apple native runtime and bridge are bundled in bin/. Apple Intelligence requires a supported Apple Silicon Mac, macOS 26+, enabled Apple Intelligence and downloaded model assets. No cloud fallback.\n" : "This build does not bundle an inference provider. Explicit proposal import remains available.\n"}\nCLI: bin/triage-host DIRECTORY APPLICATION init|capture|command|propose-evaluate|adopt|export|verify|import|fork|review-merge|adopt-merge|load-session|save-session|propose-apple|serve ...\n\nIn the TUI: n add, e edit, p priority, c category, space complete/reopen, f filter, / query, Ctrl-S save draft, Ctrl-R refresh, r rebase, v preview, a adopt, S/G/V/R adjust policy, d transfer path, x export, o import, b fork, i proposal import, q save and quit.\n\nAll required byte hashes, source inventory, build provenance and platform requirements are in manifest.json. Content hashes identify the exact artifact; they do not establish publisher authentication.\n`; +const readme = `# ALGAL Triage — macOS arm64\n\nRun bin/triage-host in a terminal; it needs no source checkout or Bun installation.\nFor the same application in a browser, run bin/triage-host DIRECTORY APPLICATION serve and open its local owner URL. Initialize a new identity with init first. Keep the owner URL private.\n\nDefault state: ~/Library/Application Support/ALGAL Triage\nOptional args: --dir DIRECTORY --application ID --host EXECUTABLE\nUse a separate directory for experiments. Existing state is preserved on errors.\n\n32 tasks / 128 lifecycle states per identity. Save drafts before closing.\nExact-head commands, retained receipts, explicit migration and authority-free forks.\nThis local artifact is unsigned.\n${native ? "Apple native runtime and bridge are bundled in bin/. Apple Intelligence requires a supported Apple Silicon Mac, macOS 26+, enabled Apple Intelligence and downloaded model assets. No cloud fallback.\n" : "This build does not bundle an inference provider. Explicit proposal import remains available.\n"}\nCLI: bin/triage-host DIRECTORY APPLICATION init|capture|command|propose-evaluate|adopt|export|verify|import|fork|review-merge|adopt-merge|load-session|save-session|propose-apple|serve ...\n\nAll required byte hashes, source inventory, build provenance and platform requirements are in manifest.json. Content hashes identify the exact artifact; they do not establish publisher authentication.\n`; await writeFile(join(directory, "README.md"), readme); const files = [...executablePaths, "README.md"]; const rows = await Promise.all(files.sort().map(async path => { const bytes = await readFile(join(directory, path)); return { path, bytes: bytes.length, sha256: createHash("sha256").update(bytes).digest("hex") }; })); const evaluator = await readFile(join(root, "src/algal_expr.wasm")); if ((await sourceSnapshot()).sha256 !== source.sha256) throw new Error("Package sources changed during assembly; keep this partial artifact and rebuild into a fresh output directory"); -const manifest = { contract: "algal.triage-package.v1", platform: "macos-arm64", hostRuntime: "embedded-bun", renderer: "ratatui-tui", minimumMacOS: "14.0", appleInferenceBundled: native !== null, inferenceMinimumMacOS: native ? "26.0" : null, networkFallback: false, signing: "unsigned", evaluatorSha256: createHash("sha256").update(evaluator).digest("hex"), provenance, files: rows }; +const manifest = { contract: "algal.triage-package.v1", platform: "macos-arm64", hostRuntime: "embedded-bun", renderer: "cli-and-served-web", minimumMacOS: "14.0", appleInferenceBundled: native !== null, inferenceMinimumMacOS: native ? "26.0" : null, networkFallback: false, signing: "unsigned", evaluatorSha256: createHash("sha256").update(evaluator).digest("hex"), provenance, files: rows }; await writeFile(join(directory, "manifest.json"), JSON.stringify(manifest, null, 2) + "\n"); await command(["/usr/bin/tar", "-czf", join(output, `${label}.tar.gz`), "-C", output, label]); console.log(JSON.stringify({ directory, archive: join(output, `${label}.tar.gz`), sourceSha256: source.sha256, manifest: join(directory, "manifest.json"), archiveBytes: (await stat(join(output, `${label}.tar.gz`))).size })); diff --git a/examples/local-triage/renderers/Cargo.lock b/examples/local-triage/renderers/Cargo.lock deleted file mode 100644 index 81469e9c..00000000 --- a/examples/local-triage/renderers/Cargo.lock +++ /dev/null @@ -1,846 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "algal-triage-renderers" -version = "0.0.0" -dependencies = [ - "crossterm", - "ratatui", - "serde", - "serde_json", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "approx" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" -dependencies = [ - "num-traits", -] - -[[package]] -name = "autocfg" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" - -[[package]] -name = "bitflags" -version = "2.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" - -[[package]] -name = "by_address" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" - -[[package]] -name = "castaway" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" -dependencies = [ - "rustversion", -] - -[[package]] -name = "cfg-if" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" - -[[package]] -name = "compact_str" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dfdd1c2274d9aa354115b09dc9a901d6c5576818cdf70d14cae2bdb47df00ab" -dependencies = [ - "castaway", - "cfg-if", - "itoa", - "rustversion", - "ryu", - "static_assertions", -] - -[[package]] -name = "convert_case" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "crossterm" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" -dependencies = [ - "bitflags", - "crossterm_winapi", - "derive_more", - "document-features", - "mio", - "parking_lot", - "rustix", - "signal-hook", - "signal-hook-mio", - "winapi", -] - -[[package]] -name = "crossterm_winapi" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" -dependencies = [ - "winapi", -] - -[[package]] -name = "darling" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed17f5901b6630b993ca003def43f2f8ef4014fc13b047b57aad617ff32bc2ec" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6837e2cf7485aaae18f86181d2f0e9a7ed297a025e220aeabf63fdebd3a2ddff" -dependencies = [ - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 3.0.6", -] - -[[package]] -name = "darling_macro" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" -dependencies = [ - "darling_core", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "deranged" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" - -[[package]] -name = "derive_more" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.119", -] - -[[package]] -name = "document-features" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" -dependencies = [ - "litrs", -] - -[[package]] -name = "either" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", -] - -[[package]] -name = "hashbrown" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "indoc" -version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" -dependencies = [ - "rustversion", -] - -[[package]] -name = "instability" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c3b5acc1e2fd9375041a388da33d1eb8aed5f7a8c0dd3543e3ea2805adfbe20" -dependencies = [ - "darling", - "indoc", - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" - -[[package]] -name = "kasuari" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde5057d6143cc94e861d90f591b9303d6716c6b9602309150bd068853c10899" -dependencies = [ - "hashbrown 0.16.1", - "portable-atomic", - "thiserror", -] - -[[package]] -name = "libc" -version = "0.2.190" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" - -[[package]] -name = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - -[[package]] -name = "line-clipping" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e752191d037c44ad111a8caa762921926658402f01cc1253f7bef2020ece4f5e" -dependencies = [ - "bitflags", -] - -[[package]] -name = "linux-raw-sys" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" - -[[package]] -name = "litrs" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" - -[[package]] -name = "lru" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef9ac18847474e638e3702b76c65d4eb93428471a74778ef0f1be711717f89b5" -dependencies = [ - "hashbrown 0.17.1", -] - -[[package]] -name = "memchr" -version = "2.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" - -[[package]] -name = "mio" -version = "1.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" -dependencies = [ - "libc", - "log", - "wasi", - "windows-sys", -] - -[[package]] -name = "num-conv" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - -[[package]] -name = "palette" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddeed8580d347d2abf3dcf06a5f0b3dc020258338526b277847cd4248a70fc64" -dependencies = [ - "approx", - "libm", - "palette_derive", - "palette_math", -] - -[[package]] -name = "palette_derive" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88537020289b719d81be994ccf1bbf4990f477e2f69ee52fe3e45f43a02e56be" -dependencies = [ - "by_address", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "palette_math" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e6eb142958d64335fb0e345c5b9ead2ecd6fc438c307e9d7d3c4fd428dbaf12" -dependencies = [ - "libm", -] - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-link", -] - -[[package]] -name = "portable-atomic" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" - -[[package]] -name = "powerfmt" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a6394b9e965e73d0a289ee54f589087e2c676aedf60885baf52c76b771e4958" - -[[package]] -name = "proc-macro2" -version = "1.0.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "ratatui" -version = "0.30.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3274ba0a2c5e1bcad2a2005d20f4dc59dad26b2eb0940fb094500dba4099d57d" -dependencies = [ - "instability", - "ratatui-core", - "ratatui-crossterm", - "ratatui-widgets", - "serde", -] - -[[package]] -name = "ratatui-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbb175c433c8e28a809d1f5773a2ae96e68c0ce40db865cbab1020bf33ae479c" -dependencies = [ - "bitflags", - "compact_str", - "hashbrown 0.17.1", - "itertools", - "kasuari", - "lru", - "palette", - "serde", - "strum", - "thiserror", - "unicode-segmentation", - "unicode-truncate", - "unicode-width", -] - -[[package]] -name = "ratatui-crossterm" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567584a3b0e6a8203c23de40b4861497266725eb5363dbfd18a1edd603cca9f0" -dependencies = [ - "cfg-if", - "crossterm", - "instability", - "ratatui-core", -] - -[[package]] -name = "ratatui-widgets" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66e3d19bcc9130ca376277d93b60767ff121ace3be06f5f95f81dd68956407d1" -dependencies = [ - "bitflags", - "hashbrown 0.17.1", - "indoc", - "instability", - "itertools", - "line-clipping", - "ratatui-core", - "serde", - "strum", - "time", - "unicode-segmentation", - "unicode-width", -] - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - -[[package]] -name = "rustversion" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" - -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "semver" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "serde_json" -version = "1.0.145" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", - "serde_core", -] - -[[package]] -name = "signal-hook" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-mio" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" -dependencies = [ - "libc", - "mio", - "signal-hook", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - -[[package]] -name = "smallvec" -version = "1.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "syn" -version = "2.0.119" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "thiserror" -version = "2.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "time" -version = "0.3.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" -dependencies = [ - "deranged", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde_core", - "time-core", -] - -[[package]] -name = "time-core" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" - -[[package]] -name = "unicode-ident" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" - -[[package]] -name = "unicode-segmentation" -version = "1.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" - -[[package]] -name = "unicode-truncate" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b380a1238663e5f8a691f9039c73e1cdae598a30e9855f541d29b08b53e9a5" -dependencies = [ - "itertools", - "unicode-segmentation", - "unicode-width", -] - -[[package]] -name = "unicode-width" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] diff --git a/examples/local-triage/renderers/Cargo.toml b/examples/local-triage/renderers/Cargo.toml deleted file mode 100644 index 15bd4a53..00000000 --- a/examples/local-triage/renderers/Cargo.toml +++ /dev/null @@ -1,28 +0,0 @@ -[package] -name = "algal-triage-renderers" -version = "0.0.0" -edition = "2024" -publish = false - -[workspace] - -[features] -default = ["tui"] -tui = ["dep:ratatui", "dep:crossterm"] - -[dependencies] -serde = { version = "=1.0.228", features = ["derive"] } -serde_json = "=1.0.145" -ratatui = { version = "=0.30.2", optional = true, default-features = false, features = ["crossterm", "crossterm_0_29", "unstable-rendered-line-info"] } -crossterm = { version = "=0.29.0", optional = true } - -[[bin]] -name = "triage-tui" -path = "src/bin/tui.rs" -required-features = ["tui"] - -[profile.release] -opt-level = "s" -lto = true -codegen-units = 1 -strip = true diff --git a/examples/local-triage/renderers/README.md b/examples/local-triage/renderers/README.md deleted file mode 100644 index 1248d8d2..00000000 --- a/examples/local-triage/renderers/README.md +++ /dev/null @@ -1,93 +0,0 @@ -# Local triage renderers and package - -This isolated Rust workspace renders the local-triage captured DTO in a -Ratatui terminal application. The renderer invokes a -bounded local `triage-host` executable with argv and JSON files. It does not -invoke a shell, execute model text, make network requests, or substitute a -cloud provider. Policy, update and migration semantics stay in ALGAL. - -```sh -cargo build --manifest-path examples/local-triage/renderers/Cargo.toml --locked --offline -cargo test --manifest-path examples/local-triage/renderers/Cargo.toml --locked -cargo clippy --manifest-path examples/local-triage/renderers/Cargo.toml --locked --all-targets -- -D warnings -cargo fmt --manifest-path examples/local-triage/renderers/Cargo.toml --all -- --check -``` - -On a Hraness machine, run build/native/packaging work through the installed -`host-run`, using the `mac-native` lane for packaging. -`--target-dir examples/malleable-site/renderers/target` reuses the existing -isolated renderer cache without adding dependencies to the root Rust workspace. - -The earlier Dioxus desktop renderer was removed: its WebView, GTK and servo -dependency tree dominated this workspace's lockfile while carrying advisories -the example could not reach a fix for. The packaged artifact is now the -terminal application plus the standalone host. - -## Terminal - -Run `triage-tui [--host PATH] [--dir DIRECTORY] [--application ID]`. `--snapshot` -prints the actual captured task/draft view without opening an interactive -terminal. - -| Key | Action | -| --- | --- | -| arrows / `j`, `k` | select task | -| `n`, `e`, `t` | new task / edit selected / edit draft title | -| `p`, `c` | cycle draft priority / edit category | -| space | captured complete/reopen action | -| `f`, `/` | cycle filter / edit title query | -| Enter in title/category | submit task draft | -| Escape | return to navigation | -| Ctrl-S | save draft separately | -| Ctrl-R, `r` | refresh / explicitly rebase draft | -| `L` | discard unsaved edits and load retained draft | -| `w` | explain selected task position | -| `S`, `G`, `V`, `R` | cycle sort/group/schema/reopening policy | -| `v`, `a` | evaluate/preview / explicitly adopt | -| `d`, `B` | edit transfer/proposal path / fork identity | -| `x`, `o`, `b`, `i` | export / verify-import / fork / import model proposal | -| `q`, Ctrl-Q | save-and-quit / quit keeping only the saved draft | - -The TUI imports model proposals produced by the bundled host CLI. It uses the -authoritative captured semantic tree, command admission and bounded state. - -## Standalone macOS arm64 artifact - -```sh -bun examples/local-triage/package.ts --output /path/to/fresh-artifact-directory \ - --native /path/to/algal --bridge /path/to/algal-apple -bun examples/local-triage/package-smoke.ts \ - /path/to/fresh-artifact-directory/algal-triage-macos-arm64.tar.gz \ - /path/to/package-smoke-evidence.json -``` - -The optional inference binaries must be supplied as an explicit pair. Omitting -them produces a manual/proposal-import package. `--target-dir` selects the Rust -build directory; `--skip-rust` reuses already checked binaries. Package output -must be fresh; the script never overwrites an existing artifact directory. - -The archive contains: - -- `bin/triage-tui` and `bin/triage-host`: independently runnable terminal/CLI. -- Optional `algal-native` / `algal-apple` siblings. -- `manifest.json`: exact executable/file sizes and SHA-256 hashes, evaluator - hash, platform, signing and inference requirements. It also records the - Git HEAD and dirty status at assembly, Bun/Rust versions, build flags and a - hashed source inventory. Assembly rejects changes to that inventory during - the build. Bundled inference executables are identified by their exact bytes; - this script does not claim to rebuild their source. - -The compiled host embeds Bun and the committed expression WASM. Fresh-extraction -smoke runs the host with no project/tool directories on PATH, initializes and -reopens facts, retries commands, saves/restores drafts, migrates schema, -replays exports, forks, renders the TUI, serves the same captured application -through its authenticated loopback web host, verifies hashes, and checks that -executables link only macOS system libraries. It does not qualify network denial; -that requires the separate native acceptance run. - -The package is unsigned. The TUI targets macOS arm64 in this artifact. -On-device Apple inference additionally requires macOS -26+, compatible Apple Silicon, enabled Apple Intelligence and downloaded model -assets. The shipped source is cross-platform for the TUI, but this packaging -script qualifies only the explicit macOS artifact. There is no mobile signing, -browser-local kernel, cloud synchronization or unbounded history claim here. diff --git a/examples/local-triage/renderers/fixture.json b/examples/local-triage/renderers/fixture.json deleted file mode 100644 index 29c4268a..00000000 --- a/examples/local-triage/renderers/fixture.json +++ /dev/null @@ -1,327 +0,0 @@ -{ - "contract": "algal.triage-capture.v1", - "application": "renderer-fixture", - "head": "sha256:cf15305a75ef5cad28e63765b682f06d3e13d135aad5fbaf83d2345baa7b5e34", - "revision": "sha256:ed0d42f0ab406f310ec7d12cb80c965b559dd362b9202e1376ecf25cc4796049", - "memory": "sha256:1abd777e7b687dd8de0235e72fb1f7a0f56374a1a5dfdfc27755e3a9c4d290f2", - "sequence": 0, - "definition": { - "contract": "algal.triage-revision.v1", - "schemaVersion": 2, - "config": { - "sort": "priority", - "group": "status", - "allowReopen": true - }, - "program": { - "tasks": [ - "map", - [ - "sort", - [ - "map", - [ - "get", - "tasks" - ], - "task", - [ - "list", - [ - "if", - [ - "eq", - [ - "get", - "task", - "priority" - ], - "high" - ], - 0, - [ - "if", - [ - "eq", - [ - "get", - "task", - "priority" - ], - "normal" - ], - 1, - 2 - ] - ], - [ - "get", - "task", - "id" - ], - [ - "get", - "task" - ] - ] - ] - ], - "ranked", - [ - "get", - "ranked", - 2 - ] - ], - "group": "status", - "allowReopen": true, - "ordering": "Ordered by priority; grouped by status. Equal keys use stable task ID order.", - "groups": [ - "unique", - [ - "map", - [ - "map", - [ - "sort", - [ - "map", - [ - "get", - "tasks" - ], - "task", - [ - "list", - [ - "if", - [ - "eq", - [ - "get", - "task", - "priority" - ], - "high" - ], - 0, - [ - "if", - [ - "eq", - [ - "get", - "task", - "priority" - ], - "normal" - ], - 1, - 2 - ] - ], - [ - "get", - "task", - "id" - ], - [ - "get", - "task" - ] - ] - ] - ], - "ranked", - [ - "get", - "ranked", - 2 - ] - ], - "task", - [ - "get", - "task", - "status" - ] - ] - ] - } - }, - "tasks": [ - { - "id": "review", - "title": "Review recorded proposal", - "priority": "high", - "status": "open", - "category": "work" - }, - { - "id": "retain", - "title": "Keep the original evidence", - "priority": "normal", - "status": "done", - "category": "inbox" - } - ], - "session": { - "contract": "algal.triage-session.v1", - "filter": "all", - "query": "", - "draft": { - "taskId": null, - "title": "", - "priority": "normal", - "category": "inbox" - }, - "focusedField": null - }, - "view": { - "filters": [ - { - "label": "All tasks", - "selected": true, - "value": "all" - }, - { - "label": "Open", - "selected": false, - "value": "open" - }, - { - "label": "Done", - "selected": false, - "value": "done" - } - ], - "form": { - "fields": [ - { - "label": "Task", - "maxLength": 120, - "name": "title", - "options": [], - "value": "" - }, - { - "label": "Priority", - "maxLength": 6, - "name": "priority", - "options": [ - "high", - "normal", - "low" - ], - "value": "normal" - }, - { - "label": "Category", - "maxLength": 24, - "name": "category", - "options": [], - "value": "inbox" - } - ], - "id": "task-editor", - "kind": "form", - "submit": { - "enabled": false, - "label": "Add task", - "reason": null - } - }, - "groups": [ - { - "id": "open", - "label": "open", - "tasks": [ - { - "actions": [ - { - "enabled": true, - "kind": "edit", - "label": "Edit", - "reason": null - }, - { - "enabled": true, - "kind": "complete", - "label": "Complete", - "reason": null - }, - { - "enabled": false, - "kind": "reopen", - "label": "Reopen", - "reason": "Already open" - } - ], - "task": { - "category": "work", - "id": "review", - "priority": "high", - "status": "open", - "title": "Review recorded proposal" - } - } - ] - }, - { - "id": "done", - "label": "done", - "tasks": [ - { - "actions": [ - { - "enabled": true, - "kind": "edit", - "label": "Edit", - "reason": null - }, - { - "enabled": false, - "kind": "complete", - "label": "Complete", - "reason": "Already complete" - }, - { - "enabled": true, - "kind": "reopen", - "label": "Reopen", - "reason": null - } - ], - "task": { - "category": "inbox", - "id": "retain", - "priority": "normal", - "status": "done", - "title": "Keep the original evidence" - } - } - ] - } - ], - "kind": "triage", - "ordering": "Ordered by priority; grouped by status. Equal keys use stable task ID order.", - "title": "Local triage" - }, - "capacity": { - "tasks": 30, - "states": 127 - }, - "evidence": [ - "sha256:c4c446bd7b386903ddc299d069fa4223381651d243313b6840dc33a179e25652" - ], - "why": [ - { - "taskId": "review", - "reason": "Ordered by priority; grouped by status. Equal keys use stable task ID order. Group open, position 1; facts from sha256:1abd777e7b687dd8de0235e72fb1f7a0f56374a1a5dfdfc27755e3a9c4d290f2." - }, - { - "taskId": "retain", - "reason": "Ordered by priority; grouped by status. Equal keys use stable task ID order. Group done, position 1; facts from sha256:1abd777e7b687dd8de0235e72fb1f7a0f56374a1a5dfdfc27755e3a9c4d290f2." - } - ] -} diff --git a/examples/local-triage/renderers/performance/README.md b/examples/local-triage/renderers/performance/README.md deleted file mode 100644 index 02c574b9..00000000 --- a/examples/local-triage/renderers/performance/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# Bounded renderer measurements - -The 2026-09-23 qualification measures the existing marketing embed and the exact -macOS arm64 package from commit `39607174063030eb4793ab65601a41d7d7c918d4`. -[measurement.json](measurement.json) retains the results, artifact identities, -environment, evidence hashes and limitations. [budgets.json](budgets.json) was -written before measurement; these are provisional local budgets, not production -SLOs. No model call was made. - -| Measurement | Observed | Declared ceiling | Result | -| --- | ---: | ---: | --- | -| Embed assets, raw / gzip | 288,821 / 95,438 bytes | 1 MiB / 256 KiB | Pass | -| Embed cold readiness, 5 contexts, p95 | 40.8 ms | 2,000 ms | Pass | -| Synchronous evaluation and DOM update, 1,000 swaps, p95 | 0.2 ms | 16.7 ms | Pass | -| Retained JS heap after swaps and 100 mount cycles | +772,676 bytes | +8 MiB | Pass | -| Retained DOM nodes / outside mutations | 0 / 0 | 0 / 0 | Pass | -| Packaged host cold capture, 5 processes, p95 | 83.0 ms | 2,000 ms | Pass | -| Packaged TUI complete snapshot, 5 processes, p95 | 241.7 ms | 2,500 ms | Pass | -| CLI/TUI peak RSS | 87,425,024 bytes | 256 MiB | Pass | -| Desktop accessibility-visible readiness, observed upper bound | 4,976 ms | 5,000 ms | Pass, one upper bound | -| Desktop complete/reopen including CUA, 20 actions, p95 | 2,751 ms | 2,000 ms | **Fail** | -| Desktop main-process RSS growth after 20 actions | +1,622,016 bytes | +32 MiB | Pass | -| Separate packaged host action path, 20 actions, p95 | 916.5 ms | 2,000 ms | Pass, separate diagnostic | - -The desktop result includes CUA clicking, automatic scrolling and accessibility -observation. The service-only diagnostic includes the operation-digest process, -command file staging, command process, durable publication and returned capture -parsing used by the native model. It excludes UI dispatch and painting. It does -not replace the failed desktop result or establish click-to-paint latency. -Desktop performance therefore remains experimental within this bounded profile. -All 20 observed native transitions completed correctly, followed by normal quit. - -The embed's nine checks also retained keyboard focus, the second mount, host -styles, the host draft and the host route. Startup starts before module import -and ends at the first animation frame after both mounts; static fallback already -exists. Tests use fresh Chromium contexts and loopback transport. Synchronous -update time excludes later paint. Heap measurements follow explicit GC and do -not establish total native/WASM memory behavior. Desktop RSS excludes separately -managed WebKit processes. The TUI number measures its complete terminal snapshot, -not a terminal emulator's presentation latency. - -The earlier [Dioxus Web spike](../../../malleable-site/renderers/measurement.json) -weighed 362,713 raw / 148,449 gzip bytes. It is a passive captured-tree renderer, -so this is not an equivalent interactive workload comparison. - -The Dioxus desktop renderer and its WebView/GTK/servo dependency tree were -subsequently removed: the example could not reach fixes for advisories the tree -carried. The desktop rows and the CUA/native observer scripts that produced them -are retained here only as this dated record; the package is now the terminal -application plus the standalone host. - -## Reproduce - -Use an existing site build and extracted package, installed Bun, and explicitly -supplied installed Playwright/Chromium. Each output directory must be fresh; -declarations and results use exclusive writes. The scripts retain generated -32-task qualification state and do not access personal application state. -Run through the installed host scheduler with the full child arguments: - -```sh -host-run --mode=shared --lane=browser-auth --label=algal-renderer-performance-browser -- \ - bun examples/local-triage/renderers/performance/browser.ts \ - SITE_DIST FRESH_BROWSER_OUTPUT PLAYWRIGHT_MODULE CHROMIUM_EXECUTABLE -host-run --mode=shared --lane=mac-native --label=algal-renderer-performance-native -- \ - bun examples/local-triage/renderers/performance/native.ts \ - PACKAGE_ROOT FRESH_NATIVE_OUTPUT -host-run --mode=shared --lane=mac-native --label=algal-renderer-performance-host-actions -- \ - bun examples/local-triage/renderers/performance/host-actions.ts \ - PACKAGE_ROOT FRESH_ACTION_OUTPUT -``` - -Resolve these tools to installed absolute paths for reviewed host access. -Preserve failed/unavailable reports alongside successful -diagnostics. Raw local receipts are identified by name and SHA-256 in the summary; -they remain outside the repository with the package qualification evidence. diff --git a/examples/local-triage/renderers/performance/browser.ts b/examples/local-triage/renderers/performance/browser.ts deleted file mode 100644 index 40ca5c6f..00000000 --- a/examples/local-triage/renderers/performance/browser.ts +++ /dev/null @@ -1,78 +0,0 @@ -/** Bounded actual-browser qualification of the existing embeddable adapter. - * Supply installed Playwright/Chromium explicitly; this script downloads none. */ -import { readFile, mkdir, writeFile } from "node:fs/promises"; -import { resolve, join } from "node:path"; -import { createHash } from "node:crypto"; -import { DEFAULT_CONFIG, DEFAULT_SIGNALS, makeRevision } from "../../../malleable-site/surface"; -import budgets from "./budgets.json"; - -const [assetsArg, outputArg, playwrightArg, chromiumArg] = process.argv.slice(2); -if (!assetsArg || !outputArg || !playwrightArg || !chromiumArg) throw new Error("Usage: bun browser.ts SITE_DIST FRESH_OUTPUT PLAYWRIGHT_MODULE CHROMIUM_EXECUTABLE"); -const assets = resolve(assetsArg), output = resolve(outputArg), hash = (bytes: Uint8Array | string) => createHash("sha256").update(bytes).digest("hex"); -await mkdir(output, { recursive: true }); -const paths = ["living.js", "living.css", "living/algal_expr.wasm", "living/initial.json"]; -const files = await Promise.all(paths.map(async path => { const bytes = await readFile(join(assets, path)); return { path, bytes: bytes.length, gzipBytes: Bun.gzipSync(bytes).length, sha256: hash(bytes) }; })); -const declaration = { contract: "algal.renderer-performance-declaration.v1", declaredAt: new Date().toISOString(), budgets, budgetsSha256: hash(await readFile(new URL("./budgets.json", import.meta.url))), scriptSha256: hash(await readFile(import.meta.path)), files }; -await writeFile(join(output, "declaration.json"), JSON.stringify(declaration, null, 2) + "\n", { flag: "wx" }); -const revisions = [makeRevision(DEFAULT_CONFIG), makeRevision({ ...DEFAULT_CONFIG, headline: "A component with another retained revision.", layout: "stack" })]; -const html = `ALGAL renderer qualification - -

Static fallback remains useful

Read documentation
-

Independent static fallback

-`; -const server = Bun.serve({ hostname: "127.0.0.1", port: 0, fetch(request) { const path = new URL(request.url).pathname; if (path === "/") return new Response(html, { headers: { "content-type": "text/html; charset=utf-8", "cache-control": "no-store" } }); if (paths.some(item => `/${item}` === path)) return new Response(Bun.file(join(assets, path.slice(1))), { headers: { "cache-control": "no-store" } }); return new Response("Not found", { status: 404 }); } }); -const origin = `http://127.0.0.1:${server.port}`; -const { chromium } = await import(resolve(playwrightArg)); -const browser = await chromium.launch({ headless: true, executablePath: resolve(chromiumArg), args: ["--disable-background-networking"] }); -const samples: number[] = [], pageErrors: string[] = []; -const quantiles = (values: number[]) => ({ count: values.length, min: Math.min(...values), median: [...values].sort((a, b) => a - b)[Math.floor(values.length / 2)]!, p95: [...values].sort((a, b) => a - b)[Math.ceil(values.length * 0.95) - 1]!, max: Math.max(...values) }); -const checks: { name: string; passed: boolean; observed: unknown; maximum?: number }[] = []; -const check = (name: string, passed: boolean, observed: unknown, maximum?: number) => checks.push({ name, passed, observed, ...(maximum === undefined ? {} : { maximum }) }); -let memory: unknown, update: unknown; -try { - for (let sample = 0; sample < budgets.browser.coldSamples; sample++) { - const context = await browser.newContext({ viewport: { width: 1280, height: 900 } }), page = await context.newPage(); - page.on("pageerror", (error: Error) => pageErrors.push(error.message)); - await page.goto(origin); await page.waitForFunction("!!globalThis.qual", undefined, { timeout: 12000 }); - samples.push(await page.evaluate("globalThis.qual.readyMs") as number); - if (sample === budgets.browser.coldSamples - 1) { - const cdp = await context.newCDPSession(page); - await page.evaluate(`globalThis.qual.run(${budgets.browser.warmupSwaps})`); - await cdp.send("HeapProfiler.collectGarbage"); - const before = await cdp.send("Runtime.getHeapUsage") as { usedSize: number; backingStorageSize?: number }, beforeState = await page.evaluate("globalThis.qual.state()") as { nodes: number }; - await page.locator("#host-route").click(); - const changed = await page.evaluate(`globalThis.qual.run(${budgets.browser.revisionSwaps})`) as { samples: number[]; focusKept: boolean; secondUnchanged: boolean }; - await page.evaluate(`globalThis.qual.cycles(${budgets.browser.mountCycles})`); - await cdp.send("HeapProfiler.collectGarbage"); - const after = await cdp.send("Runtime.getHeapUsage") as { usedSize: number; backingStorageSize?: number }, afterState = await page.evaluate("globalThis.qual.state()") as { nodes: number; outsideUnchanged: boolean; styleUnchanged: boolean; outsideMutations: number; route: string; hostDraft: string; secondUnchanged: boolean }; - memory = { before, after, jsHeapGrowthBytes: after.usedSize - before.usedSize, domNodeGrowth: afterState.nodes - beforeState.nodes, scope: "Chromium post-GC JavaScript heap and DOM nodes; backing storage reported separately; not whole-browser RSS" }; - update = quantiles(changed.samples); - check("Synchronous revision update p95", quantiles(changed.samples).p95 <= budgets.browser.updateP95MsMax, update, budgets.browser.updateP95MsMax); - check("Retained JS heap after 1000 swaps and 100 mount cycles", after.usedSize - before.usedSize <= budgets.browser.retainedJsHeapGrowthBytesMax, memory, budgets.browser.retainedJsHeapGrowthBytesMax); - check("Retained DOM nodes after mount cycles", afterState.nodes - beforeState.nodes <= budgets.browser.retainedDomNodeGrowthMax, afterState.nodes - beforeState.nodes, budgets.browser.retainedDomNodeGrowthMax); - check("Independent mounts and focused semantic link survive revisions", changed.focusKept && changed.secondUnchanged && afterState.secondUnchanged, changed); - check("Host style/router/draft remain unchanged", afterState.outsideUnchanged && afterState.styleUnchanged && afterState.outsideMutations === 0 && afterState.route === "#host-route-kept" && afterState.hostDraft === "Host draft stays intact", afterState, budgets.browser.hostInterferenceCountMax); - await page.screenshot({ path: join(output, "embed.png") }); - } - await context.close(); - } - const startup = quantiles(samples), rawBytes = files.reduce((total, file) => total + file.bytes, 0), gzipBytes = files.reduce((total, file) => total + file.gzipBytes, 0); - check("Cold interactive readiness p95", startup.p95 <= budgets.browser.interactiveReadyP95MsMax, startup, budgets.browser.interactiveReadyP95MsMax); - check("Additional raw embed assets", rawBytes <= budgets.browser.additionalRawBytesMax, rawBytes, budgets.browser.additionalRawBytesMax); - check("Additional gzip embed assets", gzipBytes <= budgets.browser.additionalGzipBytesMax, gzipBytes, budgets.browser.additionalGzipBytesMax); - check("No browser runtime errors", pageErrors.length === 0, pageErrors); - const spike = JSON.parse(await readFile(new URL("../../../malleable-site/renderers/measurement.json", import.meta.url), "utf8")) as { artifacts: { webReleaseTotalBytes: number; webRelease: { gzipBytes: number }[] } }; - const report = { contract: "algal.renderer-browser-performance.v1", ok: checks.every(item => item.passed), declaration, browser: await browser.version(), startup, update, memory, checks, dioxusWeb: { rawBytes: spike.artifacts.webReleaseTotalBytes, gzipBytes: spike.artifacts.webRelease.reduce((n, file) => n + file.gzipBytes, 0), decision: "Keep the qualified lightweight embed. The Dioxus renderers were removed over their WebView/GTK/servo dependency advisories. The recorded Dioxus Web spike is passive, so its payload is not an interactive apples-to-apples comparison." }, limitations: ["Local cold browser contexts and uncompressed loopback transport; no WAN or device-fleet claim", "Startup starts before module import and ends at the first animation frame after both mounts; static fallback precedes import", "Update timings cover synchronous VM evaluation and DOM patching, not complete paint latency", "Heap qualification is post-GC JavaScript retention; it is not a proof of total native/WASM memory behavior", "Measured host interference covers the sentinel, outside draft, route and independent mount in the declared harness"] }; - await writeFile(join(output, "result.json"), JSON.stringify(report, null, 2) + "\n", { flag: "wx" }); - console.log(JSON.stringify({ ok: report.ok, report: join(output, "result.json"), checks: checks.map(({ name, passed, maximum }) => ({ name, passed, maximum })), startup, update, memory, rawBytes, gzipBytes })); - if (!report.ok) process.exitCode = 1; -} finally { await browser.close(); server.stop(true); } diff --git a/examples/local-triage/renderers/performance/budgets.json b/examples/local-triage/renderers/performance/budgets.json deleted file mode 100644 index 9c747342..00000000 --- a/examples/local-triage/renderers/performance/budgets.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "contract": "algal.renderer-performance-budgets.v1", - "status": "provisional-local-qualification-not-a-production-SLO", - "declaredBeforeMeasurement": true, - "scope": "Existing marketing embed on this development Mac; exact macOS arm64 local-triage package. No inference during interaction.", - "rationale": { - "embedUpdate": "Keep synchronous render work within one 60 Hz frame for the bounded six-node component.", - "embedStartup": "Usable static fallback is immediate; interactive readiness has a two-second local cold-load ceiling.", - "memory": "Bound retained growth after repeated revisions rather than treating temporary allocations as a leak.", - "localHost": "File-backed exact-head commands are explicit actions; a two-second ceiling keeps them separate from local keystrokes.", - "native": "Observe actual accessibility-visible readiness and completed task updates, including measurement overhead. Main-process RSS excludes separately managed WebKit processes." - }, - "browser": { - "coldSamples": 5, - "warmupSwaps": 50, - "revisionSwaps": 1000, - "mountCycles": 100, - "additionalRawBytesMax": 1048576, - "additionalGzipBytesMax": 262144, - "interactiveReadyP95MsMax": 2000, - "updateP95MsMax": 16.7, - "retainedJsHeapGrowthBytesMax": 8388608, - "retainedDomNodeGrowthMax": 0, - "hostInterferenceCountMax": 0 - }, - "local": { - "samples": 5, - "tasks": 32, - "hostCaptureP95MsMax": 2000, - "terminalStartupP95MsMax": 2500, - "processPeakRssBytesMax": 268435456, - "desktopReadyMsMax": 5000, - "desktopActions": 20, - "desktopActionP95MsMax": 2000, - "desktopMainRssGrowthBytesMax": 33554432 - } -} diff --git a/examples/local-triage/renderers/performance/host-actions.ts b/examples/local-triage/renderers/performance/host-actions.ts deleted file mode 100644 index c1fd5871..00000000 --- a/examples/local-triage/renderers/performance/host-actions.ts +++ /dev/null @@ -1,47 +0,0 @@ -/** Separate host service work from CUA scrolling/observation. No UI or inference. */ -import { createHash } from "node:crypto"; -import { mkdir, readFile, writeFile } from "node:fs/promises"; -import { join, resolve } from "node:path"; -import type { Capture } from "../../contract"; - -const [packageArg, outputArg] = process.argv.slice(2); -if (!packageArg || !outputArg || process.platform !== "darwin") throw new Error("Usage on macOS: bun host-actions.ts PACKAGE_ROOT FRESH_OUTPUT"); -const pkg = resolve(packageArg), output = resolve(outputArg), state = join(output, "state"), executable = join(pkg, "bin/triage-host"); -await mkdir(output, { recursive: true }); -const hash = (bytes: Uint8Array) => createHash("sha256").update(bytes).digest("hex"); -const manifest = JSON.parse(await readFile(join(pkg, "manifest.json"), "utf8")) as { provenance: { gitHead: string; source: { sha256: string } }; files: { path: string; sha256: string }[] }; -const identity = hash(await readFile(executable)); -if (!manifest.files.some(file => file.path === "bin/triage-host" && file.sha256 === identity)) throw new Error("Package identity mismatch"); -// A fresh, separately declared diagnostic. This does not replace the failed -// original 2 s desktop budget or establish click-to-paint latency. -const declaration = { contract: "algal.renderer-host-action-budget.v1", declaredAt: new Date().toISOString(), samples: 20, tasks: 32, actionP95MsMax: 2000, rationale: "Same explicit-action service ceiling as the original local host budget, measured before new work; includes operation digest process, JSON staging, command process, durable publication and capture parsing. Excludes UI dispatch, scrolling and paint.", scriptSha256: hash(await readFile(import.meta.path)), packageCommit: manifest.provenance.gitHead, packageSource: manifest.provenance.source.sha256, hostSha256: identity }; -await writeFile(join(output, "declaration.json"), JSON.stringify(declaration, null, 2) + "\n", { flag: "wx" }); -async function call(args: string[]) { - const started = performance.now(), child = Bun.spawn([executable, state, "performance", ...args], { stdin: "ignore", stdout: "pipe", stderr: "pipe" }); - const deadline = setTimeout(() => child.kill("SIGKILL"), 30000); - try { - const [stdout, stderr, code] = await Promise.all([new Response(child.stdout).text(), new Response(child.stderr).text(), child.exited]); - if (stdout.length > 524288 || stderr.length > 16384 || code !== 0) throw new Error(`Bounded host operation failed: ${stderr.slice(0, 2048)}`); - return { value: JSON.parse(stdout) as unknown, ms: performance.now() - started }; - } finally { clearTimeout(deadline); if (child.exitCode === null) child.kill("SIGKILL"); await child.exited; } -} -const seedPath = join(output, "seed.json"); -await writeFile(seedPath, JSON.stringify({ schemaVersion: 2, config: { sort: "priority", group: "status", allowReopen: true }, tasks: Array.from({ length: declaration.tasks }, (_, i) => ({ id: `task-${i}`, title: `Performance task ${String(i).padStart(2, "0")}`, priority: "normal", status: "open", category: "inbox" })) }), { flag: "wx" }); -let capture = (await call(["init", seedPath])).value as Capture; -const samples: { ms: number; operationMs: number; commandMs: number; sequence: number }[] = []; -for (let i = 0; i < declaration.samples; i++) { - const started = performance.now(), operation = await call(["operation", `performance-${i}`]); - const action = { kind: i % 2 === 0 ? "complete" : "reopen", taskId: "task-0" }; - const path = join(output, `command-${i}.json`); - await writeFile(path, JSON.stringify({ contract: "algal.triage-command.v1", expectedHead: capture.head, operation: operation.value, action }), { flag: "wx" }); - const result = await call(["command", path]); - capture = result.value as Capture; - if (capture.sequence !== i + 1 || capture.tasks.length !== declaration.tasks || capture.tasks.find(task => task.id === "task-0")?.status !== (i % 2 === 0 ? "done" : "open")) throw new Error("Host did not capture the expected exact-head transition"); - samples.push({ ms: performance.now() - started, operationMs: operation.ms, commandMs: result.ms, sequence: capture.sequence }); -} -const values = samples.map(sample => sample.ms).sort((a, b) => a - b); -const p95Ms = values[Math.ceil(values.length * 0.95) - 1]!; -const result = { contract: "algal.renderer-host-action-performance.v1", ok: p95Ms <= declaration.actionP95MsMax, declaration, samples, p95Ms, maxMs: values.at(-1)!, finalHead: capture.head, finalSequence: capture.sequence, scope: "Packaged host service path used by Model.action, without desktop UI or accessibility observation. Does not replace the CUA result and does not isolate paint latency." }; -await writeFile(join(output, "result.json"), JSON.stringify(result, null, 2) + "\n", { flag: "wx" }); -console.log(JSON.stringify({ ok: result.ok, p95Ms, maxMs: result.maxMs, samples: samples.length, report: join(output, "result.json") })); -if (!result.ok) process.exitCode = 1; diff --git a/examples/local-triage/renderers/performance/measurement.json b/examples/local-triage/renderers/performance/measurement.json deleted file mode 100644 index 5d2edc90..00000000 --- a/examples/local-triage/renderers/performance/measurement.json +++ /dev/null @@ -1,371 +0,0 @@ -{ - "contract": "algal.renderer-performance-summary.v1", - "measuredDate": "2026-09-23", - "status": "bounded-costs-and-limitations-measured", - "allBudgetsPassed": false, - "environment": { - "platform": "darwin", - "arch": "arm64", - "darwinRelease": "25.5.0", - "cpu": "Apple M4 Max", - "cores": 16, - "memoryBytes": 137438953472, - "bun": "1.3.14", - "browser": "151.0.7922.34" - }, - "package": { - "gitHead": "39607174063030eb4793ab65601a41d7d7c918d4", - "sourceSha256": "847d467faea41b756893e0620f2dcc6f1541469b7ae372bf0f6da8fcefc8dbb0", - "hostSha256": "4eda351d102ebf006fe1968af76ebe641c3ad5046cbe19effcb52d361a0ed544", - "desktopSha256": "34153623560a6018a868c6410c22998b8744cbc03e800dc7d8ffd07399a14064" - }, - "budgetsSha256": "6b765f6cf51e9b8f83d79c9769a56d70d38f260758949c785c88514f5a38c966", - "browser": { - "checksPassed": 9, - "checksTotal": 9, - "assets": [ - { - "path": "living.js", - "bytes": 20973, - "gzipBytes": 7375, - "sha256": "5b7dc2cd671440502d429f68a92bd4609fb52dc5ae4fab9c3a2d30730dc38fa5" - }, - { - "path": "living.css", - "bytes": 13107, - "gzipBytes": 2971, - "sha256": "80bcfb0ec06b07ccc8dccf2317ac8fd860382d0dcbc3b3b1550feeb34f91f0ec" - }, - { - "path": "living/algal_expr.wasm", - "bytes": 253073, - "gzipBytes": 84602, - "sha256": "a55aaf318395b41be9be2f0d2c1bfa2ad1471ebe957a8c776b9799b6072b6b79" - }, - { - "path": "living/initial.json", - "bytes": 1668, - "gzipBytes": 490, - "sha256": "ad1bb60c62a3088bee1ff67685ed9bcd3b047e3db45095435b00358d19e23f01" - } - ], - "rawBytes": 288821, - "gzipBytes": 95438, - "startup": { - "count": 5, - "min": 18.59999990463257, - "median": 24, - "p95": 40.799999952316284, - "max": 40.799999952316284 - }, - "update": { - "count": 1000, - "min": 0, - "median": 0.10000002384185791, - "p95": 0.19999992847442627, - "max": 2 - }, - "memory": { - "before": { - "usedSize": 1359660, - "totalSize": 2162688, - "embedderHeapUsedSize": 557488, - "backingStorageSize": 29214 - }, - "after": { - "usedSize": 2132336, - "totalSize": 3014656, - "embedderHeapUsedSize": 429552, - "backingStorageSize": 29518 - }, - "jsHeapGrowthBytes": 772676, - "domNodeGrowth": 0, - "scope": "Chromium post-GC JavaScript heap and DOM nodes; backing storage reported separately; not whole-browser RSS" - }, - "revisionSwaps": 1000, - "mountCycles": 100, - "outsideMutations": 0, - "independentMountAndFocusPreserved": true, - "dioxusWeb": { - "rawBytes": 362713, - "gzipBytes": 148449, - "decision": "Keep the qualified lightweight embed and Dioxus desktop. The Dioxus Web spike is passive, so its payload is not an interactive apples-to-apples comparison." - } - }, - "local": { - "tasks": 32, - "capture": { - "count": 5, - "min": 80.63225, - "median": 81.18583400000006, - "p95": 83.048, - "max": 83.048 - }, - "terminalSnapshot": { - "count": 5, - "min": 218.04829199999995, - "median": 218.56183299999998, - "p95": 241.71254199999998, - "max": 241.71254199999998 - }, - "cliTuiPeakRssBytes": 87425024, - "desktop": { - "service": "authorized cua_repl", - "tasks": 32, - "startedEpochMs": 1790201120953, - "observerStartedEpochMs": 1790201125734, - "visibleEpochMs": 1790201125929, - "readinessUpperBoundMs": 4976, - "actionStartedEpochMs": 1790201169044, - "actionsFinishedEpochMs": 1790201210121, - "actionsMs": [ - 1629, - 1260, - 1604, - 1670, - 1746, - 1833, - 1733, - 2031, - 1674, - 1679, - 1665, - 2119, - 2082, - 2487, - 1863, - 2751, - 2601, - 3500, - 2600, - 2548 - ], - "actionP95Ms": 2751, - "actionMaxMs": 3500, - "verifiedTransitions": 20, - "finalSequence": 20, - "rssBefore": { - "epochMs": 1790201168553, - "rssBytes": 116539392 - }, - "rssAfter": { - "epochMs": 1790201210145, - "rssBytes": 118161408 - }, - "rssGrowthBytes": 1622016, - "mainProcessPeakRssBytes": 118194176, - "normalQuit": true - }, - "desktopChecks": [ - { - "name": "Accessibility-visible startup upper bound", - "passed": true, - "observedMs": 4976, - "maximumMs": 5000 - }, - { - "name": "CUA complete/reopen inclusive latency p95", - "passed": false, - "observedMs": 2751, - "maximumMs": 2000 - }, - { - "name": "Main-process retained RSS growth after 20 actions", - "passed": true, - "observedBytes": 1622016, - "maximumBytes": 33554432 - }, - { - "name": "20 captured state changes and normal quit", - "passed": true, - "observed": { - "transitions": 20, - "exitCode": 0 - } - } - ], - "hostAction": { - "samples": [ - { - "ms": 435.7132920000001, - "operationMs": 33.722916, - "commandMs": 401.590375, - "sequence": 1 - }, - { - "ms": 468.57245799999987, - "operationMs": 43.155167000000006, - "commandMs": 425.0336249999999, - "sequence": 2 - }, - { - "ms": 469.048667, - "operationMs": 31.305040999999846, - "commandMs": 437.4227920000001, - "sequence": 3 - }, - { - "ms": 520.9453330000001, - "operationMs": 37.035709, - "commandMs": 483.62750000000005, - "sequence": 4 - }, - { - "ms": 597.087708, - "operationMs": 36.83454099999972, - "commandMs": 559.9528750000004, - "sequence": 5 - }, - { - "ms": 645.0162919999998, - "operationMs": 34.868625000000065, - "commandMs": 609.8147079999999, - "sequence": 6 - }, - { - "ms": 655.1237080000001, - "operationMs": 36.59904099999994, - "commandMs": 618.2482500000001, - "sequence": 7 - }, - { - "ms": 656.1105000000007, - "operationMs": 30.92895800000042, - "commandMs": 624.8788329999998, - "sequence": 8 - }, - { - "ms": 657.1677919999993, - "operationMs": 31.27312499999971, - "commandMs": 625.6676660000003, - "sequence": 9 - }, - { - "ms": 652.1427079999994, - "operationMs": 31.93029200000001, - "commandMs": 619.8609999999999, - "sequence": 10 - }, - { - "ms": 687.917625, - "operationMs": 28.077375000000757, - "commandMs": 659.5795419999995, - "sequence": 11 - }, - { - "ms": 707.895458, - "operationMs": 34.85662499999944, - "commandMs": 672.7232090000007, - "sequence": 12 - }, - { - "ms": 701.2625829999997, - "operationMs": 25.573709000000235, - "commandMs": 675.4587090000005, - "sequence": 13 - }, - { - "ms": 686.2515000000003, - "operationMs": 25.04216600000018, - "commandMs": 661.0099160000009, - "sequence": 14 - }, - { - "ms": 730.596042000001, - "operationMs": 25.77050000000054, - "commandMs": 704.5992500000011, - "sequence": 15 - }, - { - "ms": 753.148541999999, - "operationMs": 25.33616599999914, - "commandMs": 727.578125, - "sequence": 16 - }, - { - "ms": 783.680624999999, - "operationMs": 25.200041000000056, - "commandMs": 758.2314999999999, - "sequence": 17 - }, - { - "ms": 812.7048749999994, - "operationMs": 25.352708999998868, - "commandMs": 787.1378750000003, - "sequence": 18 - }, - { - "ms": 916.4944999999989, - "operationMs": 25.84654099999898, - "commandMs": 890.3714999999993, - "sequence": 19 - }, - { - "ms": 1381.758084000001, - "operationMs": 31.32233399999859, - "commandMs": 1350.1482919999999, - "sequence": 20 - } - ], - "p95Ms": 916.4944999999989, - "maxMs": 1381.758084000001, - "budgetMs": 2000, - "passed": true, - "scope": "Packaged host service path used by Model.action, without desktop UI or accessibility observation. Does not replace the CUA result and does not isolate paint latency." - }, - "unavailableInitialObserver": { - "available": false, - "ok": false, - "reason": "Inherited accessibility permission unavailable; no permission prompt was requested" - } - }, - "evidence": [ - { - "artifact": "renderer-performance-browser-1/declaration.json", - "sha256": "8ff444ea6ae181dd38426f4dc408c34467d8260914a760c8c49bf2cadc13c23a" - }, - { - "artifact": "renderer-performance-browser-1/result.json", - "sha256": "fcfd49d6e37724eba38750618fb8342fd3ce21d8dd1f646dac79b976368dd1f5" - }, - { - "artifact": "renderer-performance-native-1/declaration.json", - "sha256": "0a37fed18566bd898856bdc550632cd0b190205e156f12db1a00f5db1df84251" - }, - { - "artifact": "renderer-performance-native-1/result.json", - "sha256": "151cf928193324ab1a22931f9f62fd413d8f80d54f013b8df3edb7f8d327a778" - }, - { - "artifact": "renderer-performance-cua-1/declaration.json", - "sha256": "a5efbb5ba86ba3a6c7f3d2f18c4321b5fc747f66bc7607914d43da804962269a" - }, - { - "artifact": "renderer-performance-cua-1/result.json", - "sha256": "2910fe199d7007967f678244efe71b127e99d44b4a0a8c1007cb9624c2a26990" - }, - { - "artifact": "renderer-performance-host-actions-1/declaration.json", - "sha256": "074533379d6539fc1189b15c80e5ca826b4462b685b12f191f275da0dcb75d06" - }, - { - "artifact": "renderer-performance-host-actions-1/result.json", - "sha256": "c3264d3ed41a9422df810a8439f9c660bd3009736d41169d12bbfaf09108d285" - } - ], - "limitations": [ - "Local cold browser contexts and uncompressed loopback transport; no WAN or device-fleet claim", - "Startup starts before module import and ends at the first animation frame after both mounts; static fallback precedes import", - "Update timings cover synchronous VM evaluation and DOM patching, not complete paint latency", - "Heap qualification is post-GC JavaScript retention; it is not a proof of total native/WASM memory behavior", - "Measured host interference covers the sentinel, outside draft, route and independent mount in the declared harness", - "One startup observation is an upper bound including observer tool dispatch; it does not isolate first paint.", - "Action duration includes CUA click, automatic scrolling and accessibility-tree observation; the declared inclusive action budget failed.", - "Main process RSS excludes separately managed WebKit processes.", - "No inference or provider operation occurred.", - "The direct AX helper was unavailable; its original failure result remains retained separately.", - "One development Mac, bounded 32-task/128-state application, five cold CLI/TUI samples; not a production SLO or fleet benchmark.", - "The separate host action probe passed its fresh declaration but cannot clear the original failed CUA-inclusive desktop budget. Desktop performance remains experimental.", - "No model calls, external effects or inference provider operations were performed by these measurements." - ] -} diff --git a/examples/local-triage/renderers/performance/native.ts b/examples/local-triage/renderers/performance/native.ts deleted file mode 100644 index b26ecf8e..00000000 --- a/examples/local-triage/renderers/performance/native.ts +++ /dev/null @@ -1,56 +0,0 @@ -/** Exact packaged CLI/TUI qualification. Run through mac-native custody. */ -import { mkdir, readFile, writeFile } from "node:fs/promises"; -import { join, resolve } from "node:path"; -import { createHash } from "node:crypto"; -import budgets from "./budgets.json"; - -const packageRoot = process.argv[2], output = process.argv[3]; -if (!packageRoot || !output || process.platform !== "darwin") throw new Error("Usage on macOS: bun native.ts PACKAGE_ROOT FRESH_OUTPUT"); -const directory = resolve(output), pkg = resolve(packageRoot), state = join(directory, "state"); -await mkdir(directory, { recursive: true }); -const hash = (bytes: Uint8Array | string) => createHash("sha256").update(bytes).digest("hex"); -const manifest = JSON.parse(await readFile(join(pkg, "manifest.json"), "utf8")) as { provenance: { gitHead: string; source: { sha256: string } }; files: { path: string; sha256: string }[] }; -const declared = { contract: "algal.renderer-performance-declaration.v1", declaredAt: new Date().toISOString(), budgets, budgetsSha256: hash(await readFile(new URL("./budgets.json", import.meta.url))), scriptSha256: hash(await readFile(import.meta.path)), packageSource: manifest.provenance.source.sha256, gitHead: manifest.provenance.gitHead }; -await writeFile(join(directory, "declaration.json"), JSON.stringify(declared, null, 2) + "\n", { flag: "wx" }); -const checks: { name: string; passed: boolean; observed: unknown; maximum?: number }[] = []; -const check = (name: string, passed: boolean, observed: unknown, maximum?: number) => checks.push({ name, passed, observed, ...(maximum === undefined ? {} : { maximum }) }); -const quantiles = (values: number[]) => ({ count: values.length, min: Math.min(...values), median: [...values].sort((a, b) => a - b)[Math.floor(values.length / 2)]!, p95: [...values].sort((a, b) => a - b)[Math.ceil(values.length * 0.95) - 1]!, max: Math.max(...values) }); -async function command(args: string[], deadlineMs = 30000) { - const started = performance.now(), child = Bun.spawn(args, { cwd: directory, stdin: "ignore", stdout: "pipe", stderr: "pipe" }); - const deadline = setTimeout(() => child.kill("SIGKILL"), deadlineMs); - try { - const [stdout, stderr, status] = await Promise.all([new Response(child.stdout).text(), new Response(child.stderr).text(), child.exited]); - if (stdout.length > 524288 || stderr.length > 16384) throw new Error("Qualification output exceeded its bound"); - return { stdout, stderr, status, ms: performance.now() - started }; - } finally { clearTimeout(deadline); if (child.exitCode === null) child.kill("SIGKILL"); await child.exited; } -} -for (const path of ["bin/triage-host", "bin/triage-tui"]) { - const expected = manifest.files.find(file => file.path === path); - if (!expected || hash(await readFile(join(pkg, path))) !== expected.sha256) throw new Error("Package identity mismatch"); -} -const seed = { schemaVersion: 2, config: { sort: "priority", group: "status", allowReopen: true }, tasks: Array.from({ length: budgets.local.tasks }, (_, i) => ({ id: `task-${i}`, title: `Performance task ${String(i).padStart(2, "0")}`, priority: "normal", status: "open", category: "inbox" })) }; -const seedPath = join(directory, "seed.json"); await writeFile(seedPath, JSON.stringify(seed)); -const init = await command([join(pkg, "bin/triage-host"), state, "performance", "init", seedPath]); -if (init.status !== 0) throw new Error(init.stderr); -const hostSamples: number[] = [], terminalSamples: number[] = [], peakRss: number[] = []; -for (const [samples, args] of [ - [hostSamples, [join(pkg, "bin/triage-host"), state, "performance", "capture"]], - [terminalSamples, [join(pkg, "bin/triage-tui"), "--dir", state, "--application", "performance", "--snapshot"]], -] as const) { - for (let i = 0; i < budgets.local.samples; i++) { - const result = await command(["/usr/bin/time", "-l", ...args]); - if (result.status !== 0) throw new Error(result.stderr); - samples.push(result.ms); - const rss = /([0-9]+)\s+maximum resident set size/.exec(result.stderr); - if (!rss) throw new Error("Darwin time did not return peak resident memory"); - peakRss.push(Number(rss[1])); - } -} -const host = quantiles(hostSamples), terminal = quantiles(terminalSamples); -check("Packaged host cold process capture p95", host.p95 <= budgets.local.hostCaptureP95MsMax, host, budgets.local.hostCaptureP95MsMax); -check("Packaged TUI process-to-complete-snapshot p95", terminal.p95 <= budgets.local.terminalStartupP95MsMax, terminal, budgets.local.terminalStartupP95MsMax); -check("CLI/TUI Darwin peak resident bytes", Math.max(...peakRss) <= budgets.local.processPeakRssBytesMax, peakRss, budgets.local.processPeakRssBytesMax); -const report = { contract: "algal.renderer-native-performance.v1", ok: checks.every(item => item.passed), declaration: declared, platform: { platform: process.platform, arch: process.arch }, initMs: init.ms, host, terminal, checks, limitations: ["Local development Mac and bounded 32-task profile only; not a production SLO or cross-platform benchmark", "CLI/TUI memory is Darwin time maximum resident size", "No model call, provider network operation or generated revision occurred in this measurement"] }; -await writeFile(join(directory, "result.json"), JSON.stringify(report, null, 2) + "\n", { flag: "wx" }); -console.log(JSON.stringify({ ok: report.ok, report: join(directory, "result.json"), checks })); -if (!report.ok) process.exitCode = 1; diff --git a/examples/local-triage/renderers/src/bin/tui.rs b/examples/local-triage/renderers/src/bin/tui.rs deleted file mode 100644 index 711d0b10..00000000 --- a/examples/local-triage/renderers/src/bin/tui.rs +++ /dev/null @@ -1,431 +0,0 @@ -use algal_triage_renderers::{Model, Options, Result}; -use crossterm::event::{self, Event, KeyCode, KeyEventKind, KeyModifiers}; -use ratatui::{ - Terminal, - backend::TestBackend, - layout::{Constraint, Layout}, - style::{Color, Modifier, Style}, - text::{Line, Span}, - widgets::{Block, Borders, Paragraph, Wrap}, -}; -use serde_json::json; - -#[derive(Clone, Copy, PartialEq)] -enum Mode { - Navigate, - Title, - Category, - Query, - Path, - Fork, -} -fn text_field(model: &mut Model, mode: Mode) -> Option<(&mut String, usize)> { - match mode { - Mode::Title => Some((&mut model.session.draft.title, 120)), - Mode::Category => Some((&mut model.session.draft.category, 24)), - Mode::Query => Some((&mut model.session.query, 120)), - Mode::Path => Some((&mut model.path, 1024)), - Mode::Fork => Some((&mut model.fork_name, 48)), - _ => None, - } -} -fn attempt(model: &mut Model, action: impl FnOnce(&mut Model) -> Result<()>) { - if let Err(e) = action(model) { - model.message = e; - } -} -fn render(frame: &mut ratatui::Frame, model: &Model, selected: usize, mode: Mode) { - let outer = Layout::vertical([ - Constraint::Length(4), - Constraint::Min(12), - Constraint::Length(4), - Constraint::Length(6), - ]) - .split(frame.area()); - frame.render_widget( - Paragraph::new(vec![ - Line::from(Span::styled( - "ALGAL / LOCAL TRIAGE", - Style::default() - .fg(Color::LightGreen) - .add_modifier(Modifier::BOLD), - )), - Line::from(format!( - "{} · schema v{} · {} task slots / {} changes remaining", - model.capture.application, - model.capture.definition.schema_version, - model.capture.capacity.tasks, - model.capture.capacity.states - )), - Line::from(format!( - "Filter: {} | Search: {} | {}", - model.session.filter, model.session.query, model.capture.view.ordering - )), - ]), - outer[0], - ); - let columns = Layout::horizontal([Constraint::Percentage(60), Constraint::Percentage(40)]) - .split(outer[1]); - let rows = model.rows(); - let visible_rows = columns[0].height.saturating_sub(2) as usize; - let start = selected.saturating_sub(visible_rows.saturating_sub(1)); - let mut lines = Vec::new(); - for (index, row) in rows.iter().enumerate().skip(start).take(visible_rows) { - let line = format!( - "{} {} {:6} {}", - if index == selected { "›" } else { " " }, - if row.task.status == "done" { - "[x]" - } else { - "[ ]" - }, - row.task.priority, - row.task.title - ); - lines.push(Line::styled( - line, - if index == selected { - Style::default() - .fg(Color::LightGreen) - .add_modifier(Modifier::BOLD) - } else { - Style::default() - }, - )); - } - if lines.is_empty() { - lines.push(Line::from("No matching tasks. Press n to add one.")); - } - frame.render_widget( - Paragraph::new(lines).block( - Block::default() - .borders(Borders::ALL) - .title(" Tasks · ↑/↓ select · space complete/reopen "), - ), - columns[0], - ); - let d = &model.session.draft; - let marker = |target| if mode == target { "› " } else { " " }; - let editor = vec![ - Line::from(if d.task_id.is_some() { - "Editing a retained task" - } else { - "New session draft" - }), - Line::from(""), - Line::from(format!("{}Title: {}", marker(Mode::Title), d.title)), - Line::from(format!(" Priority: {} [p]", d.priority)), - Line::from(format!( - "{}Category: {} [c]", - marker(Mode::Category), - d.category - )), - Line::from(""), - Line::from(if model.stale { - "STALE · refresh, inspect, then r to rebase" - } else if model.dirty { - "Unsaved · Ctrl-S saves the draft" - } else { - "Saved local draft" - }), - Line::from("Enter submits while editing title/category"), - Line::from(""), - Line::from(format!( - "Policy: {} / {}", - model.policy.sort, model.policy.group - )), - Line::from(format!( - "Schema: v{} | reopen: {}", - model.schema_version, model.policy.allow_reopen - )), - Line::from("S sort · G group · V schema · R reopen"), - Line::from("v evaluate preview · a adopt"), - Line::from( - model - .preview - .as_ref() - .map(|p| { - format!( - "Candidate: {}", - if p.evaluation.accepted { - "accepted; explicit adoption required" - } else { - "rejected" - } - ) - }) - .unwrap_or_default(), - ), - ]; - frame.render_widget( - Paragraph::new(editor).wrap(Wrap { trim: false }).block( - Block::default() - .borders(Borders::ALL) - .title(" Draft & workflow "), - ), - columns[1], - ); - frame.render_widget( - Paragraph::new(vec![ - Line::from(format!( - "{}JSON path: {} [d]", - marker(Mode::Path), - model.path - )), - Line::from(format!( - "{}Fork identity: {} [B]", - marker(Mode::Fork), - model.fork_name - )), - Line::from("x export · o verify/import · b fork · i import/evaluate model proposal"), - ]) - .block(Block::default().borders(Borders::TOP)), - outer[2], - ); - frame.render_widget( - Paragraph::new(vec![ - Line::styled( - &model.message, - Style::default().fg(if model.stale { - Color::Yellow - } else { - Color::Gray - }), - ), - Line::from(""), - Line::from( - "n new · e edit · t title · p priority · c category · f filter · / search · w why", - ), - Line::from( - "Ctrl-S save draft · Ctrl-R refresh · r rebase · L discard unsaved/load saved", - ), - Line::from("Esc navigation · q save and quit · Ctrl-Q quit preserving saved draft"), - ]) - .wrap(Wrap { trim: false }), - outer[3], - ); -} -fn cycle(value: &mut String, choices: &[&str]) { - let index = choices.iter().position(|v| *v == value).unwrap_or(0); - *value = choices[(index + 1) % choices.len()].into(); -} -fn main() -> std::result::Result<(), Box> { - let options = Options::parse()?; - let snapshot = options.snapshot; - let mut model = Model::open(options)?; - if snapshot { - let mut terminal = Terminal::new(TestBackend::new(110, 34))?; - terminal.draw(|f| render(f, &model, 0, Mode::Navigate))?; - for y in 0..34 { - let row: String = (0..110) - .map(|x| terminal.backend().buffer()[(x, y)].symbol()) - .collect(); - println!("{}", row.trim_end()); - } - return Ok(()); - } - let mut terminal = ratatui::init(); - let mut selected = 0; - let mut mode = Mode::Navigate; - let result = (|| -> std::result::Result<(), Box> { - loop { - selected = selected.min(model.rows().len().saturating_sub(1)); - terminal.draw(|f| render(f, &model, selected, mode))?; - if let Event::Key(key) = event::read()? { - if key.kind != KeyEventKind::Press { - continue; - } - if key.modifiers.contains(KeyModifiers::CONTROL) { - match key.code { - KeyCode::Char('q') => break, - KeyCode::Char('s') => attempt(&mut model, |m| m.save(false)), - KeyCode::Char('r') => attempt(&mut model, Model::refresh), - _ => {} - } - continue; - } - if key.code == KeyCode::Esc { - mode = Mode::Navigate; - continue; - } - if mode != Mode::Navigate { - if key.code == KeyCode::Enter { - match mode { - Mode::Query => attempt(&mut model, Model::refresh), - Mode::Title | Mode::Category => attempt(&mut model, Model::submit), - _ => {} - } - mode = Mode::Navigate; - continue; - } - if let Some((field, max)) = text_field(&mut model, mode) { - match key.code { - KeyCode::Char(c) - if field.encode_utf16().count() + c.len_utf16() <= max - && !c.is_control() => - { - field.push(c); - model.dirty = true; - } - KeyCode::Backspace => { - field.pop(); - model.dirty = true; - } - _ => {} - } - } - continue; - } - match key.code { - KeyCode::Char('q') => match model.save(false) { - Ok(()) => break, - Err(e) => model.message = e, - }, - KeyCode::Down | KeyCode::Char('j') => { - selected = (selected + 1).min(model.rows().len().saturating_sub(1)) - } - KeyCode::Up | KeyCode::Char('k') => selected = selected.saturating_sub(1), - KeyCode::Char('n') => { - model.new_draft(); - mode = Mode::Title; - } - KeyCode::Char('t') => mode = Mode::Title, - KeyCode::Char('e') => { - if let Some(row) = model.rows().get(selected) { - model.edit(&row.task); - mode = Mode::Title; - } - } - KeyCode::Char('p') => { - cycle( - &mut model.session.draft.priority, - &["high", "normal", "low"], - ); - model.dirty = true; - } - KeyCode::Char('c') => { - if model.capture.definition.schema_version == 2 { - mode = Mode::Category; - } else { - model.message = - "Preview and adopt schema v2 to edit categories.".into(); - } - } - KeyCode::Char('/') => mode = Mode::Query, - KeyCode::Char('d') => mode = Mode::Path, - KeyCode::Char('B') => mode = Mode::Fork, - KeyCode::Char('f') => { - let mut filter = model.session.filter.clone(); - cycle(&mut filter, &["all", "open", "done"]); - attempt(&mut model, |m| m.filter(&filter)); - } - KeyCode::Char(' ') => { - if let Some(row) = model.rows().get(selected) { - let action = if row.task.status == "open" { - "complete" - } else { - "reopen" - }; - if row.actions.iter().any(|a| a.kind == action && a.enabled) { - let id = row.task.id.clone(); - attempt(&mut model, |m| { - m.action(json!({"kind":action,"taskId":id}))?; - m.refresh() - }); - } else { - model.message = "Action disabled by captured workflow.".into(); - } - } - } - KeyCode::Char('w') => { - if let Some(row) = model.rows().get(selected) { - model.message = model - .capture - .why - .iter() - .find(|w| w.task_id == row.task.id) - .map(|w| w.reason.clone()) - .unwrap_or_else(|| model.capture.view.ordering.clone()); - } - } - KeyCode::Char('r') => attempt(&mut model, |m| m.save(true)), - KeyCode::Char('L') => attempt(&mut model, Model::reload_draft), - KeyCode::Char('S') => { - cycle(&mut model.policy.sort, &["priority", "title", "created"]) - } - KeyCode::Char('G') => cycle( - &mut model.policy.group, - &["none", "status", "priority", "category"], - ), - KeyCode::Char('V') => { - model.schema_version = if model.schema_version == 1 { 2 } else { 1 } - } - KeyCode::Char('R') => model.policy.allow_reopen = !model.policy.allow_reopen, - KeyCode::Char('v') => attempt(&mut model, Model::evaluate), - KeyCode::Char('a') => attempt(&mut model, Model::adopt), - KeyCode::Char('x') => attempt(&mut model, Model::export), - KeyCode::Char('o') => attempt(&mut model, Model::import), - KeyCode::Char('b') => attempt(&mut model, Model::fork), - KeyCode::Char('i') => attempt(&mut model, Model::import_proposal), - _ => {} - } - } - } - Ok(()) - })(); - ratatui::restore(); - result -} - -#[cfg(test)] -mod tests { - use super::*; - #[test] - fn terminal_uses_captured_projection_and_retains_stale_draft() { - let mut capture = algal_triage_renderers::parse_capture( - algal_triage_renderers::bounded_json(include_bytes!("../../fixture.json")).unwrap(), - ) - .unwrap(); - // The host may retain completed facts while filtering their presentation. - capture.view.groups.retain(|group| group.id == "open"); - let mut session = capture.session.clone(); - session.filter = "open".into(); - session.draft.title = "Unsubmitted draft".into(); - let model = Model { - options: Options { - host: "unused-host".into(), - directory: "unused-state".into(), - application: capture.application.clone(), - snapshot: true, - }, - policy: capture.definition.config.clone(), - schema_version: capture.definition.schema_version, - capture, - session, - session_ref: None, - stale: true, - dirty: true, - message: "Inspect changes before rebasing".into(), - preview: None, - path: String::new(), - fork_name: "experiment".into(), - }; - let mut terminal = Terminal::new(TestBackend::new(110, 34)).unwrap(); - terminal - .draw(|frame| render(frame, &model, 0, Mode::Title)) - .unwrap(); - let rendered = (0..34) - .map(|y| { - (0..110) - .map(|x| terminal.backend().buffer()[(x, y)].symbol()) - .collect::() - }) - .collect::>() - .join("\n"); - assert!(rendered.contains("Review recorded proposal")); - assert!(!rendered.contains("Keep the original evidence")); - assert!(rendered.contains("Unsubmitted draft")); - assert!(rendered.contains("STALE")); - assert!(rendered.contains("30 task slots")); - } -} diff --git a/examples/local-triage/renderers/src/lib.rs b/examples/local-triage/renderers/src/lib.rs deleted file mode 100644 index 25db0baa..00000000 --- a/examples/local-triage/renderers/src/lib.rs +++ /dev/null @@ -1,894 +0,0 @@ -use serde::{Deserialize, Serialize}; -use serde_json::{Value, json}; -use std::{ - fs, - io::Read, - path::PathBuf, - process::{Command, Stdio}, - sync::atomic::{AtomicU64, Ordering}, - thread, - time::{Duration, Instant, SystemTime, UNIX_EPOCH}, -}; - -pub type Result = std::result::Result; -pub const MAX_BYTES: usize = 262_144; -static SERIAL: AtomicU64 = AtomicU64::new(0); -fn nonce() -> String { - format!( - "{:x}-{:x}-{:x}", - SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap_or_default() - .as_nanos(), - std::process::id(), - SERIAL.fetch_add(1, Ordering::Relaxed) - ) -} -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -#[serde(deny_unknown_fields, rename_all = "camelCase")] -pub struct Task { - pub id: String, - pub title: String, - pub priority: String, - pub status: String, - pub category: String, -} -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -#[serde(deny_unknown_fields, rename_all = "camelCase")] -pub struct Config { - pub sort: String, - pub group: String, - pub allow_reopen: bool, -} -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -#[serde(deny_unknown_fields, rename_all = "camelCase")] -pub struct Definition { - pub contract: String, - pub schema_version: u8, - pub config: Config, - pub program: Value, -} -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -#[serde(deny_unknown_fields, rename_all = "camelCase")] -pub struct Draft { - pub task_id: Option, - pub title: String, - pub priority: String, - pub category: String, -} -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -#[serde(deny_unknown_fields, rename_all = "camelCase")] -pub struct Session { - pub contract: String, - pub filter: String, - pub query: String, - pub draft: Draft, - pub focused_field: Option, -} -impl Default for Session { - fn default() -> Self { - Self { - contract: "algal.triage-session.v1".into(), - filter: "all".into(), - query: String::new(), - draft: Draft { - task_id: None, - title: String::new(), - priority: "normal".into(), - category: "inbox".into(), - }, - focused_field: None, - } - } -} -#[derive(Clone, Debug, PartialEq, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct Action { - pub kind: String, - pub label: String, - pub enabled: bool, - pub reason: Option, -} -#[derive(Clone, Debug, PartialEq, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct Row { - pub task: Task, - pub actions: Vec, -} -#[derive(Clone, Debug, PartialEq, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct Group { - pub id: String, - pub label: String, - pub tasks: Vec, -} -#[derive(Clone, Debug, PartialEq, Deserialize)] -#[serde(deny_unknown_fields, rename_all = "camelCase")] -pub struct Field { - pub name: String, - pub label: String, - pub value: String, - pub max_length: usize, - pub options: Vec, -} -#[derive(Clone, Debug, PartialEq, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct Submit { - pub label: String, - pub enabled: bool, - pub reason: Option, -} -#[derive(Clone, Debug, PartialEq, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct Form { - pub kind: String, - pub id: String, - pub fields: Vec, - pub submit: Submit, -} -#[derive(Clone, Debug, PartialEq, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct Filter { - pub value: String, - pub label: String, - pub selected: bool, -} -#[derive(Clone, Debug, PartialEq, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct View { - pub kind: String, - pub title: String, - pub ordering: String, - pub groups: Vec, - pub form: Form, - pub filters: Vec, -} -#[derive(Clone, Debug, PartialEq, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct Capacity { - pub tasks: usize, - pub states: usize, -} -#[derive(Clone, Debug, PartialEq, Deserialize)] -#[serde(deny_unknown_fields, rename_all = "camelCase")] -pub struct Why { - pub task_id: String, - pub reason: String, -} -#[derive(Clone, Debug, PartialEq, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct Capture { - pub contract: String, - pub application: String, - pub head: String, - pub revision: String, - pub memory: String, - pub sequence: usize, - pub definition: Definition, - pub tasks: Vec, - pub session: Session, - pub view: View, - pub capacity: Capacity, - pub evidence: Vec, - pub why: Vec, -} -#[derive(Clone, Debug, Deserialize)] -#[serde(deny_unknown_fields, rename_all = "camelCase")] -pub struct SessionRecord { - pub contract: String, - pub application: String, - pub captured_head: String, - pub captured_revision: String, - pub schema_version: u8, - pub session: Session, -} -#[derive(Clone, Debug, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct SessionLoad { - pub record: Option, - pub reference: Option, - pub status: String, - pub reason: Option, -} -#[derive(Clone, Debug, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct Check { - pub name: String, - pub passed: bool, -} -#[derive(Clone, Debug, Deserialize)] -#[serde(deny_unknown_fields, rename_all = "camelCase")] -pub struct Evaluation { - pub contract: String, - pub expected_head: String, - pub proposal: String, - pub candidate_revision: String, - pub accepted: bool, - pub checks: Vec, - pub receipts: Vec, -} -#[derive(Clone, Debug, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct Preview { - pub definition: Definition, - pub view: View, - pub why: Vec, -} -#[derive(Clone, Debug, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct Evaluated { - pub reference: String, - pub evaluation: Evaluation, - pub capture: Capture, - pub preview: Preview, -} -#[derive(Clone, Debug, PartialEq, Deserialize)] -#[serde(deny_unknown_fields)] -pub struct ControlIdentity { - pub id: String, - pub kind: String, - pub parent: String, -} -#[derive(Clone, Debug, PartialEq, Deserialize)] -#[serde(deny_unknown_fields, rename_all = "camelCase")] -pub struct SessionCompatibility { - pub retain_draft: bool, - pub requires_rebase: bool, - pub preserve_focus: bool, -} -pub fn session_compatibility( - before: &[ControlIdentity], - after: &[ControlIdentity], - focused: Option<&str>, - head_changed: bool, -) -> SessionCompatibility { - let preserve_focus = focused.is_none_or(|id| { - before - .iter() - .find(|c| c.id == id) - .is_some_and(|old| after.iter().any(|new| new == old)) - }); - SessionCompatibility { - retain_draft: true, - requires_rebase: head_changed || !preserve_focus, - preserve_focus, - } -} -fn controls(view: &View) -> Vec { - view.form - .fields - .iter() - .map(|field| ControlIdentity { - id: field.name.clone(), - kind: if field.options.is_empty() { - "text" - } else { - "select" - } - .into(), - parent: view.form.id.clone(), - }) - .collect() -} - -pub fn identifier(s: &str) -> bool { - s.len() <= 48 - && s.as_bytes().first().is_some_and(u8::is_ascii_lowercase) - && s.bytes() - .all(|c| c.is_ascii_lowercase() || c.is_ascii_digit() || c == b'-') -} -fn digest(s: &str) -> bool { - s.len() == 71 - && s.starts_with("sha256:") - && s[7..] - .bytes() - .all(|c| c.is_ascii_digit() || (b'a'..=b'f').contains(&c)) -} -fn text(s: &str, max: usize) -> bool { - s.encode_utf16().count() <= max && !s.chars().any(char::is_control) -} -fn valid_session(s: &Session) -> bool { - s.contract == "algal.triage-session.v1" - && ["all", "open", "done"].contains(&s.filter.as_str()) - && text(&s.query, 120) - && text(&s.draft.title, 120) - && text(&s.draft.category, 24) - && ["high", "normal", "low"].contains(&s.draft.priority.as_str()) - && s.draft.task_id.as_deref().is_none_or(identifier) - && s.focused_field - .as_deref() - .is_none_or(|f| ["title", "priority", "category", "query"].contains(&f)) -} -pub fn bounded_json(bytes: &[u8]) -> Result { - if bytes.len() > MAX_BYTES { - return Err("Host response exceeds byte bound".into()); - } - let value: Value = serde_json::from_slice(bytes).map_err(|e| e.to_string())?; - fn visit(v: &Value, depth: usize, n: &mut usize) -> Result<()> { - *n += 1; - if depth > 32 || *n > 32_768 { - return Err("Host response structure bound".into()); - } - match v { - Value::Array(xs) => { - if xs.len() > 1024 { - return Err("Array bound".into()); - } - for x in xs { - visit(x, depth + 1, n)?; - } - } - Value::Object(xs) => { - if xs.len() > 256 { - return Err("Object bound".into()); - } - for x in xs.values() { - visit(x, depth + 1, n)?; - } - } - Value::String(s) if s.len() > 65_536 => return Err("String bound".into()), - _ => {} - } - Ok(()) - } - visit(&value, 0, &mut 0)?; - Ok(value) -} -pub fn parse_capture(value: Value) -> Result { - let c: Capture = serde_json::from_value(value).map_err(|e| e.to_string())?; - if c.contract != "algal.triage-capture.v1" - || !identifier(&c.application) - || ![&c.head, &c.revision, &c.memory].iter().all(|r| digest(r)) - || c.tasks.len() > 32 - || c.sequence > 127 - || c.capacity.tasks != 32 - c.tasks.len() - || c.capacity.states != 127 - c.sequence - || ![1, 2].contains(&c.definition.schema_version) - || c.view.kind != "triage" - || c.view.groups.len() > 32 - || c.view.form.fields.len() > 3 - || c.view.filters.len() > 3 - || c.definition.contract != "algal.triage-revision.v1" - || !["priority", "title", "created"].contains(&c.definition.config.sort.as_str()) - || !["none", "status", "priority", "category"].contains(&c.definition.config.group.as_str()) - || !valid_session(&c.session) - || c.view.form.kind != "form" - || c.view.form.id != "task-editor" - || c.view.form.fields.iter().any(|f| { - !["title", "priority", "category"].contains(&f.name.as_str()) - || f.max_length > 120 - || f.options.len() > 3 - || !text(&f.value, 120) - }) - || c.view - .filters - .iter() - .any(|f| !["all", "open", "done"].contains(&f.value.as_str())) - || c.evidence.len() > 16 - || c.evidence.iter().any(|r| !digest(r)) - || c.why.len() > 32 - { - return Err("Invalid bounded capture".into()); - } - let mut ids = std::collections::BTreeSet::new(); - for t in &c.tasks { - if !identifier(&t.id) - || !ids.insert(&t.id) - || !text(&t.title, 120) - || t.title.trim().is_empty() - || !text(&t.category, 24) - || !["high", "normal", "low"].contains(&t.priority.as_str()) - || !["open", "done"].contains(&t.status.as_str()) - { - return Err("Invalid task".into()); - } - } - let mut shown = std::collections::BTreeSet::new(); - for g in &c.view.groups { - for r in &g.tasks { - if !c.tasks.contains(&r.task) - || !shown.insert(&r.task.id) - || r.actions.len() > 3 - || r.actions - .iter() - .any(|a| !["edit", "complete", "reopen"].contains(&a.kind.as_str())) - { - return Err("Presentation differs from captured task facts".into()); - } - } - } - Ok(c) -} - -#[derive(Clone, Debug)] -pub struct Options { - pub host: PathBuf, - pub directory: PathBuf, - pub application: String, - pub snapshot: bool, -} -impl Options { - pub fn apple_available(&self) -> bool { - self.host.parent().is_some_and(|parent| { - parent.join("algal-native").is_file() && parent.join("algal-apple").is_file() - }) - } - pub fn apple_options(&self, instruction: &str) -> Result { - if !self.apple_available() { - return Err( - "This package has no bundled Apple runtime; import an explicit proposal instead" - .into(), - ); - } - if instruction.trim().is_empty() - || instruction.encode_utf16().count() > 512 - || instruction.chars().any(char::is_control) - { - return Err("Describe a workflow change in 1–512 characters".into()); - } - let parent = self.host.parent().ok_or("Missing host parent")?; - Ok( - json!({ "native":parent.join("algal-native"), "bridge":parent.join("algal-apple"), "attemptDirectory":self.directory.join("inference-attempts").join(nonce()), "instruction":instruction }), - ) - } - pub fn parse() -> Result { - let exe = std::env::current_exe().map_err(|e| e.to_string())?; - let parent = exe.parent().ok_or("Missing executable parent")?; - let host = if parent.file_name().is_some_and(|n| n == "MacOS") { - parent.join("../Resources/bin/triage-host") - } else { - parent.join("triage-host") - }; - let default_directory = std::env::var_os("HOME") - .map(|home| PathBuf::from(home).join("Library/Application Support/ALGAL Triage")) - .unwrap_or_default(); - let mut result = Self { - host, - directory: default_directory, - application: "local-triage".into(), - snapshot: false, - }; - let mut args = std::env::args().skip(1); - while let Some(arg) = args.next() { - match arg.as_str() { - "--host" => result.host = args.next().ok_or("--host requires a path")?.into(), - "--dir" => result.directory = args.next().ok_or("--dir requires a path")?.into(), - "--application" => { - result.application = args.next().ok_or("--application requires ID")? - } - "--snapshot" => result.snapshot = true, - _ => return Err(format!("Unknown argument {arg}")), - } - } - if result.directory.as_os_str().is_empty() { - return Err("Pass --dir when HOME is unavailable".into()); - } - if !identifier(&result.application) { - return Err("Invalid application identity".into()); - } - result.host = fs::canonicalize(&result.host) - .map_err(|e| format!("Host executable unavailable: {e}"))?; - if !fs::metadata(&result.host) - .map_err(|e| e.to_string())? - .is_file() - { - return Err("Host path is not a file".into()); - } - Ok(result) - } - pub fn call(&self, args: &[&str], input: Option<&Value>) -> Result { - let request = if let Some(value) = input { - let dir = std::env::temp_dir().join(format!("algal-triage-ui-{}", nonce())); - fs::create_dir(&dir).map_err(|e| e.to_string())?; - #[cfg(unix)] - { - use std::os::unix::fs::PermissionsExt; - fs::set_permissions(&dir, fs::Permissions::from_mode(0o700)) - .map_err(|e| e.to_string())?; - } - let file = dir.join("request.json"); - let bytes = serde_json::to_vec(value).map_err(|e| e.to_string())?; - if bytes.len() > MAX_BYTES { - return Err("Request bound exceeded".into()); - } - fs::write(&file, bytes).map_err(|e| e.to_string())?; - Some((dir, file)) - } else { - None - }; - let result = (|| { - let mut command = Command::new(&self.host); - command.arg(&self.directory).arg(&self.application); - for arg in args { - if *arg == "@json" { - command.arg(&request.as_ref().ok_or("JSON placeholder without input")?.1); - } else { - command.arg(arg); - } - } - let mut child = command - .stdin(Stdio::null()) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .spawn() - .map_err(|e| e.to_string())?; - let stdout = child.stdout.take().ok_or("Missing host stdout")?; - let stderr = child.stderr.take().ok_or("Missing host stderr")?; - let out = thread::spawn(move || { - let mut bytes = Vec::new(); - stdout - .take((MAX_BYTES + 1) as u64) - .read_to_end(&mut bytes) - .map(|_| bytes) - }); - let err = thread::spawn(move || { - let mut bytes = Vec::new(); - stderr.take(16_385).read_to_end(&mut bytes).map(|_| bytes) - }); - let deadline = Instant::now() - + Duration::from_secs(if args.first() == Some(&"propose-apple") { - 120 - } else { - 45 - }); - let status = loop { - if let Some(status) = child.try_wait().map_err(|e| e.to_string())? { - break status; - } - if Instant::now() > deadline { - let _ = child.kill(); - let _ = child.wait(); - let _ = out.join(); - let _ = err.join(); - return Err("Host timed out. Refresh and reconcile retained state before another mutation.".into()); - } - thread::sleep(Duration::from_millis(10)); - }; - let bytes = out - .join() - .map_err(|_| "Host stdout thread failed")? - .map_err(|e| e.to_string())?; - let errors = err - .join() - .map_err(|_| "Host stderr thread failed")? - .map_err(|e| e.to_string())?; - if !status.success() { - return Err(String::from_utf8_lossy(&errors) - .chars() - .take(1024) - .collect()); - } - bounded_json(&bytes) - })(); - if let Some((directory, _)) = request { - let _ = fs::remove_dir_all(directory); - } - result - } -} - -#[derive(Clone, Debug)] -pub struct Model { - pub options: Options, - pub capture: Capture, - pub session: Session, - pub session_ref: Option, - pub stale: bool, - pub dirty: bool, - pub message: String, - pub preview: Option, - pub policy: Config, - pub schema_version: u8, - pub path: String, - pub fork_name: String, -} -impl Model { - pub fn open(options: Options) -> Result { - // An absent app is initialized explicitly; an unreadable/corrupt existing - // application is never replaced by this path. - let initial = match options.call(&["capture"], None) { - Ok(value) => value, - Err(e) if e.contains("Initialize this local triage application first") => { - options.call(&["init"], None)? - } - Err(e) => return Err(e), - }; - let capture = parse_capture(initial)?; - let loaded: SessionLoad = - serde_json::from_value(options.call(&["load-session", "native"], None)?) - .map_err(|e| e.to_string())?; - let session = loaded - .record - .as_ref() - .map(|r| r.session.clone()) - .unwrap_or_default(); - let stale = loaded.status == "stale" - || loaded - .record - .as_ref() - .is_some_and(|r| r.captured_head != capture.head); - let capture = parse_capture(options.call(&["capture", "@json"], Some(&json!(session)))?)?; - Ok(Self { - policy: capture.definition.config.clone(), - schema_version: capture.definition.schema_version, - options, - capture, - session, - session_ref: loaded.reference, - stale, - dirty: false, - message: loaded - .reason - .unwrap_or_else(|| "Local facts, local drafts. No network required.".into()), - preview: None, - path: String::new(), - fork_name: "experiment".into(), - }) - } - pub fn perform(&mut self, result: Result<()>) { - if let Err(error) = result { - self.message = error; - } - } - pub fn refresh(&mut self) -> Result<()> { - let c = parse_capture( - self.options - .call(&["capture", "@json"], Some(&json!(self.session)))?, - )?; - let compatibility = session_compatibility( - &controls(&self.capture.view), - &controls(&c.view), - self.session - .focused_field - .as_deref() - .filter(|f| *f != "query"), - c.head != self.capture.head, - ); - self.stale |= compatibility.requires_rebase; - if !compatibility.preserve_focus { - self.session.focused_field = None; - } - self.capture = c; - self.message = if self.stale { - "State changed. Your draft is retained; explicitly rebase before submitting." - } else { - "Refreshed the same captured state." - } - .into(); - Ok(()) - } - pub fn save(&mut self, rebase: bool) -> Result<()> { - if self.stale && !rebase { - return Err("Draft is stale. Refresh, inspect changes, then Rebase draft.".into()); - } - let loaded: SessionLoad = serde_json::from_value(self.options.call(&["save-session", "native", "@json"], Some(&json!({ "expectedSession": self.session_ref, "capturedHead": self.capture.head, "session": self.session })))?).map_err(|e| e.to_string())?; - self.session_ref = loaded.reference; - self.stale = loaded.status != "current"; - self.dirty = false; - self.message = "Draft saved separately from task facts.".into(); - Ok(()) - } - pub fn reload_draft(&mut self) -> Result<()> { - let loaded: SessionLoad = - serde_json::from_value(self.options.call(&["load-session", "native"], None)?) - .map_err(|e| e.to_string())?; - if let Some(record) = loaded.record { - self.session = record.session; - self.stale = record.captured_head != self.capture.head; - } - self.session_ref = loaded.reference; - self.dirty = false; - self.refresh()?; - self.message = "Loaded the retained draft after explicit discard of unsaved edits.".into(); - Ok(()) - } - pub fn edit(&mut self, task: &Task) { - self.session.draft = Draft { - task_id: Some(task.id.clone()), - title: task.title.clone(), - priority: task.priority.clone(), - category: task.category.clone(), - }; - self.dirty = true; - self.message = "Editing a session draft. Submit to change task facts.".into(); - } - pub fn new_draft(&mut self) { - self.session.draft = Session::default().draft; - self.dirty = true; - } - fn operation(&self, label: &str) -> Result { - self.options - .call(&["operation", &format!("{label}-{}", nonce())], None)? - .as_str() - .map(str::to_owned) - .ok_or("Host did not return an operation digest".into()) - } - pub fn action(&mut self, action: Value) -> Result<()> { - if self.stale { - return Err("Refresh and explicitly rebase the stale draft first".into()); - } - let operation = self.operation("command")?; - let next = self.options.call(&["command", "@json"], Some(&json!({ "contract":"algal.triage-command.v1", "expectedHead":self.capture.head, "operation":operation, "action":action }))); - match next { - Ok(value) => { - self.capture = parse_capture(value)?; - self.preview = None; - self.message = "Task facts committed with a replayable receipt.".into(); - Ok(()) - } - Err(e) => { - self.stale = true; - Err(e) - } - } - } - pub fn submit(&mut self) -> Result<()> { - let draft = &self.session.draft; - let action = if let Some(task_id) = &draft.task_id { - json!({ "kind":"edit", "taskId":task_id, "title":draft.title, "priority":draft.priority, "category":draft.category }) - } else { - json!({ "kind":"add", "task":{ "id":format!("task-{}", nonce()), "title":draft.title, "priority":draft.priority, "category":draft.category, "status":"open" } }) - }; - self.action(action)?; - self.new_draft(); - self.save(false)?; - self.refresh() - } - pub fn filter(&mut self, filter: &str) -> Result<()> { - self.session.filter = filter.into(); - self.dirty = true; - self.refresh() - } - pub fn evaluate(&mut self) -> Result<()> { - if self.stale { - return Err("Rebase before proposing a revision".into()); - } - let proposal = json!({ "contract":"algal.triage-proposal.v1", "expectedHead":self.capture.head, "config":self.policy, "schemaVersion":self.schema_version, "source":"owner", "rationale":"Owner requested this local task workflow." }); - let result: Evaluated = serde_json::from_value( - self.options - .call(&["propose-evaluate", "@json"], Some(&proposal))?, - ) - .map_err(|e| e.to_string())?; - self.message = "Preview only: current facts and policy are unchanged.".into(); - self.preview = Some(result); - Ok(()) - } - pub fn import_proposal(&mut self) -> Result<()> { - let result: Evaluated = - serde_json::from_value(self.options.call(&["propose-evaluate", &self.path], None)?) - .map_err(|e| e.to_string())?; - self.preview = Some(result); - self.message = "Imported proposal evaluated; inspect checks before adoption.".into(); - Ok(()) - } - pub fn adopt(&mut self) -> Result<()> { - let preview = self.preview.as_ref().ok_or("Preview a policy first")?; - if !preview.evaluation.accepted || self.stale { - return Err("Rejected or stale policy cannot be adopted".into()); - } - let reference = preview.reference.clone(); - let operation = self.operation("adopt")?; - self.capture = parse_capture( - self.options - .call(&["adopt", &reference, &operation], None)?, - )?; - self.policy = self.capture.definition.config.clone(); - self.schema_version = self.capture.definition.schema_version; - self.preview = None; - self.stale = true; - self.message = - "Revision adopted; task facts retained. Rebase your retained draft explicitly.".into(); - Ok(()) - } - pub fn export(&mut self) -> Result<()> { - self.options.call(&["export", &self.path], None)?; - self.message = - "Portable pure evidence exported; no drafts or mutable custody copied.".into(); - Ok(()) - } - pub fn import(&mut self) -> Result<()> { - let response = self.options.call(&["import", &self.path], None)?; - self.message = format!( - "Imported without adoption: {}", - response["reference"].as_str().unwrap_or("unknown") - ); - Ok(()) - } - pub fn fork(&mut self) -> Result<()> { - if !identifier(&self.fork_name) { - return Err("Choose a lowercase fork identity".into()); - } - self.options - .call(&["fork", &self.path, &self.fork_name], None)?; - self.message = format!( - "Created independent app {}. Open with --application {}.", - self.fork_name, self.fork_name - ); - Ok(()) - } - pub fn rows(&self) -> Vec { - self.capture - .view - .groups - .iter() - .flat_map(|g| g.tasks.iter().cloned()) - .collect() - } -} - -#[cfg(test)] -mod tests { - use super::*; - #[test] - fn identifiers_and_foreign_json_are_bounded() { - assert!(identifier("task-123")); - assert!(!identifier("../state")); - assert!(!identifier(&"a".repeat(49))); - assert!(bounded_json(&vec![b' '; MAX_BYTES + 1]).is_err()); - assert!(serde_json::from_value::(json!({"taskId":null,"title":"x","priority":"normal","category":"inbox","authority":true})).is_err()); - } - #[test] - fn drafts_are_independent_typed_data() { - let mut s = Session::default(); - s.draft.title = "Unsubmitted".into(); - let bytes = serde_json::to_vec(&s).unwrap(); - let restored: Session = serde_json::from_value(bounded_json(&bytes).unwrap()).unwrap(); - assert_eq!(s, restored); - assert!(!String::from_utf8(bytes).unwrap().contains("expectedHead")); - } - #[test] - fn digest_and_text_bounds_match_contract_shape() { - assert!(digest(&format!("sha256:{}", "a".repeat(64)))); - assert!(!digest("sha256:short")); - assert!(text("🌱", 2)); - assert!(!text("🌱", 1)); - assert!(!text("bad\nline", 120)); - } - #[test] - fn real_capture_is_renderable_and_foreign_or_incoherent_data_is_rejected() { - let value = bounded_json(include_bytes!("../fixture.json")).unwrap(); - let capture = parse_capture(value.clone()).unwrap(); - assert_eq!(capture.tasks.len(), 2); - assert_eq!(capture.view.groups[0].tasks[0].task.id, "review"); - let mut extra = value.clone(); - extra["authority"] = json!(true); - assert!(parse_capture(extra).is_err()); - let mut dishonest = value.clone(); - dishonest["view"]["groups"][0]["tasks"][0]["task"]["title"] = - json!("Unbacked displayed content"); - assert!(parse_capture(dishonest).is_err()); - let mut overflow = value; - overflow["capacity"]["tasks"] = json!(33); - assert!(parse_capture(overflow).is_err()); - } - #[test] - fn shared_session_identity_fixtures_preserve_draft_and_require_explicit_rebase() { - #[derive(Deserialize)] - #[serde(deny_unknown_fields, rename_all = "camelCase")] - struct Case { - name: String, - before: Vec, - after: Vec, - focused_field: Option, - head_changed: bool, - expected: SessionCompatibility, - } - let fixtures: Vec = - serde_json::from_str(include_str!("../../session-compatibility-fixtures.json")) - .unwrap(); - assert_eq!(fixtures.len(), 5); - for case in fixtures { - assert_eq!( - session_compatibility( - &case.before, - &case.after, - case.focused_field.as_deref(), - case.head_changed - ), - case.expected, - "{}", - case.name - ); - } - } -} diff --git a/examples/malleable-site/README.md b/examples/malleable-site/README.md index 82e55bce..446f79bc 100644 --- a/examples/malleable-site/README.md +++ b/examples/malleable-site/README.md @@ -6,5 +6,6 @@ model proposals, browser embedding and evidence boundaries. Run root to begin. The live browser demonstration is at [algal.computer/living](https://algal.computer/living/). -The [renderer experiment](renderers/README.md) consumes the exact same semantic -view in Dioxus web/desktop and Ratatui. It remains an isolated feasibility spike. +An earlier renderer experiment consumed the exact same semantic view in Dioxus +web/desktop and Ratatui. The spike concluded and the adapters were removed; the +git history retains the record. diff --git a/examples/malleable-site/renderers/.gitignore b/examples/malleable-site/renderers/.gitignore deleted file mode 100644 index a742227c..00000000 --- a/examples/malleable-site/renderers/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/target/ -/dist/ diff --git a/examples/malleable-site/renderers/Cargo.lock b/examples/malleable-site/renderers/Cargo.lock deleted file mode 100644 index 84bdade5..00000000 --- a/examples/malleable-site/renderers/Cargo.lock +++ /dev/null @@ -1,846 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "algal-surface-renderers" -version = "0.0.0" -dependencies = [ - "crossterm", - "ratatui", - "serde", - "serde_json", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "approx" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" -dependencies = [ - "num-traits", -] - -[[package]] -name = "autocfg" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" - -[[package]] -name = "bitflags" -version = "2.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" - -[[package]] -name = "by_address" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" - -[[package]] -name = "castaway" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" -dependencies = [ - "rustversion", -] - -[[package]] -name = "cfg-if" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" - -[[package]] -name = "compact_str" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dfdd1c2274d9aa354115b09dc9a901d6c5576818cdf70d14cae2bdb47df00ab" -dependencies = [ - "castaway", - "cfg-if", - "itoa", - "rustversion", - "ryu", - "static_assertions", -] - -[[package]] -name = "convert_case" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "crossterm" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" -dependencies = [ - "bitflags", - "crossterm_winapi", - "derive_more", - "document-features", - "mio", - "parking_lot", - "rustix", - "signal-hook", - "signal-hook-mio", - "winapi", -] - -[[package]] -name = "crossterm_winapi" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" -dependencies = [ - "winapi", -] - -[[package]] -name = "darling" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed17f5901b6630b993ca003def43f2f8ef4014fc13b047b57aad617ff32bc2ec" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6837e2cf7485aaae18f86181d2f0e9a7ed297a025e220aeabf63fdebd3a2ddff" -dependencies = [ - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 3.0.6", -] - -[[package]] -name = "darling_macro" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" -dependencies = [ - "darling_core", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "deranged" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" - -[[package]] -name = "derive_more" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.119", -] - -[[package]] -name = "document-features" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" -dependencies = [ - "litrs", -] - -[[package]] -name = "either" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", -] - -[[package]] -name = "hashbrown" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "indoc" -version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" -dependencies = [ - "rustversion", -] - -[[package]] -name = "instability" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c3b5acc1e2fd9375041a388da33d1eb8aed5f7a8c0dd3543e3ea2805adfbe20" -dependencies = [ - "darling", - "indoc", - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" - -[[package]] -name = "kasuari" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde5057d6143cc94e861d90f591b9303d6716c6b9602309150bd068853c10899" -dependencies = [ - "hashbrown 0.16.1", - "portable-atomic", - "thiserror", -] - -[[package]] -name = "libc" -version = "0.2.190" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" - -[[package]] -name = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - -[[package]] -name = "line-clipping" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e752191d037c44ad111a8caa762921926658402f01cc1253f7bef2020ece4f5e" -dependencies = [ - "bitflags", -] - -[[package]] -name = "linux-raw-sys" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" - -[[package]] -name = "litrs" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" - -[[package]] -name = "lru" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef9ac18847474e638e3702b76c65d4eb93428471a74778ef0f1be711717f89b5" -dependencies = [ - "hashbrown 0.17.1", -] - -[[package]] -name = "memchr" -version = "2.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" - -[[package]] -name = "mio" -version = "1.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" -dependencies = [ - "libc", - "log", - "wasi", - "windows-sys", -] - -[[package]] -name = "num-conv" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - -[[package]] -name = "palette" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddeed8580d347d2abf3dcf06a5f0b3dc020258338526b277847cd4248a70fc64" -dependencies = [ - "approx", - "libm", - "palette_derive", - "palette_math", -] - -[[package]] -name = "palette_derive" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88537020289b719d81be994ccf1bbf4990f477e2f69ee52fe3e45f43a02e56be" -dependencies = [ - "by_address", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "palette_math" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e6eb142958d64335fb0e345c5b9ead2ecd6fc438c307e9d7d3c4fd428dbaf12" -dependencies = [ - "libm", -] - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-link", -] - -[[package]] -name = "portable-atomic" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" - -[[package]] -name = "powerfmt" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a6394b9e965e73d0a289ee54f589087e2c676aedf60885baf52c76b771e4958" - -[[package]] -name = "proc-macro2" -version = "1.0.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "ratatui" -version = "0.30.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3274ba0a2c5e1bcad2a2005d20f4dc59dad26b2eb0940fb094500dba4099d57d" -dependencies = [ - "instability", - "ratatui-core", - "ratatui-crossterm", - "ratatui-widgets", - "serde", -] - -[[package]] -name = "ratatui-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbb175c433c8e28a809d1f5773a2ae96e68c0ce40db865cbab1020bf33ae479c" -dependencies = [ - "bitflags", - "compact_str", - "hashbrown 0.17.1", - "itertools", - "kasuari", - "lru", - "palette", - "serde", - "strum", - "thiserror", - "unicode-segmentation", - "unicode-truncate", - "unicode-width", -] - -[[package]] -name = "ratatui-crossterm" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567584a3b0e6a8203c23de40b4861497266725eb5363dbfd18a1edd603cca9f0" -dependencies = [ - "cfg-if", - "crossterm", - "instability", - "ratatui-core", -] - -[[package]] -name = "ratatui-widgets" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66e3d19bcc9130ca376277d93b60767ff121ace3be06f5f95f81dd68956407d1" -dependencies = [ - "bitflags", - "hashbrown 0.17.1", - "indoc", - "instability", - "itertools", - "line-clipping", - "ratatui-core", - "serde", - "strum", - "time", - "unicode-segmentation", - "unicode-width", -] - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - -[[package]] -name = "rustversion" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" - -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "semver" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "serde_json" -version = "1.0.145" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", - "serde_core", -] - -[[package]] -name = "signal-hook" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-mio" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" -dependencies = [ - "libc", - "mio", - "signal-hook", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - -[[package]] -name = "smallvec" -version = "1.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "syn" -version = "2.0.119" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "thiserror" -version = "2.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.6", -] - -[[package]] -name = "time" -version = "0.3.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" -dependencies = [ - "deranged", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde_core", - "time-core", -] - -[[package]] -name = "time-core" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" - -[[package]] -name = "unicode-ident" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" - -[[package]] -name = "unicode-segmentation" -version = "1.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" - -[[package]] -name = "unicode-truncate" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b380a1238663e5f8a691f9039c73e1cdae598a30e9855f541d29b08b53e9a5" -dependencies = [ - "itertools", - "unicode-segmentation", - "unicode-width", -] - -[[package]] -name = "unicode-width" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] diff --git a/examples/malleable-site/renderers/Cargo.toml b/examples/malleable-site/renderers/Cargo.toml deleted file mode 100644 index a9d88522..00000000 --- a/examples/malleable-site/renderers/Cargo.toml +++ /dev/null @@ -1,29 +0,0 @@ -[package] -name = "algal-surface-renderers" -version = "0.0.0" -edition = "2024" -publish = false - -# This feasibility experiment deliberately does not enlarge ALGAL's kernel workspace. -[workspace] - -[features] -default = ["tui"] -tui = ["dep:ratatui", "dep:crossterm"] - -[dependencies] -serde = { version = "=1.0.228", features = ["derive"] } -serde_json = "=1.0.145" -ratatui = { version = "=0.30.2", optional = true, default-features = false, features = ["crossterm", "crossterm_0_29", "unstable-rendered-line-info"] } -crossterm = { version = "=0.29.0", optional = true } - -[[bin]] -name = "surface-tui" -path = "src/bin/tui.rs" -required-features = ["tui"] - -[profile.release] -opt-level = "s" -lto = true -codegen-units = 1 -strip = true diff --git a/examples/malleable-site/renderers/README.md b/examples/malleable-site/renderers/README.md deleted file mode 100644 index 156d7ac5..00000000 --- a/examples/malleable-site/renderers/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# Renderer feasibility - -This isolated Rust workspace tests the **same admitted marketing view tree** in a -Ratatui terminal adapter. It does not add dependencies to the ALGAL -kernel workspace. `fixtures/view.json` is generated by the actual Rust-backed -ALGAL expression in `../surface.ts`, with the default configuration and signals. -The renderer consumes that result; it does not implement another view evaluator. - -The bounded input supports only `stack`, `text`, and a link whose destination is -the host-fixed `/docs/`. Text is inserted as text rather than HTML. A split layout places body -and CTA beside one another when space permits; the terminal has its own wrapping -and color treatment. Ratatui displays the link's destination without opening it. - -The earlier Dioxus web and desktop adapters were removed: their dependency -trees (WebView, GTK, servo HTML parsing) dominated this workspace's lockfile -while carrying advisories the experiment could not reach a fix for. The -[recorded measurements](measurement.json) remain as the dated evidence for -those removed adapters. - -From this directory: - -```sh -bun fixtures/generate.ts --check -cargo test --locked -cargo clippy --locked --all-targets -- -D warnings -cargo run --locked --bin surface-tui -- --snapshot -cargo run --locked --bin surface-tui -``` - -The interactive terminal exits with `q` or Escape. `--snapshot path/to/view.json` -loads another bounded tree and produces a plain text TestBackend rendering. -Interactive rendering uses the embedded fixture. No editor, proposal generation, -activation, or network request occurs in the TUI. - -Use the repository's host scheduler for heavyweight builds and browser/native -launches, as directed by `AGENTS.md`. Exact dependency resolution is retained in the -workspace's own lockfile. Ratatui is pinned because its paragraph line-count API -currently requires the `unstable-rendered-line-info` feature. - -These are renderer feasibility adapters, not packaged applications. -Browser-hosted `/docs/` resolution -belongs to the embedding site. The tree has no input widgets, so this experiment -does **not** qualify IME, draft/focus preservation across updates, assistive -technology behavior, or general form editing. Mobile, Windows, Linux desktop, -offline model inference, app signing, and distribution remain unqualified. - -The browser workbench and durable host lifecycle are implemented in the parent -example, not in these adapters. This experiment informs the later renderer choice; -it does not couple ALGAL semantics to Ratatui. - -The [recorded measurements](measurement.json) date from when the workspace also -carried Dioxus web and desktop adapters; they qualify the then-present web -release build, the macOS desktop build, five passing Rust tests, -strict Clippy, fixture freshness, -and the actual [terminal snapshot](tui-snapshot.txt), with unused trailing empty rows omitted. The web distribution was -362,713 bytes before compression, including a 311,048-byte WASM module. Browser -and native window interaction evidence belongs to the integration owner's -separate visual checks; compilation alone is not runtime qualification. - -The result supports keeping the semantic tree independent of a renderer. -It does not establish that a terminal should reproduce browser pixels. - -References: [Ratatui source](https://github.com/ratatui/ratatui). diff --git a/examples/malleable-site/renderers/fixtures/generate.ts b/examples/malleable-site/renderers/fixtures/generate.ts deleted file mode 100644 index e2630fba..00000000 --- a/examples/malleable-site/renderers/fixtures/generate.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** Keep the renderer input tied to the real ALGAL view program, not a mock. */ -import { DEFAULT_CONFIG, DEFAULT_SIGNALS, evaluateView, makeRevision } from "../../surface"; - -const fixture = new URL("./view.json", import.meta.url); -const expected = JSON.stringify(evaluateView(makeRevision(DEFAULT_CONFIG), DEFAULT_SIGNALS), null, 2) + "\n"; -if (Bun.argv.slice(2).join(" ") === "--write") { - await Bun.write(fixture, expected); -} else if (Bun.argv.slice(2).join(" ") === "--check") { - if (await Bun.file(fixture).text() !== expected) throw new Error("Renderer fixture differs from the ALGAL view program; regenerate deliberately"); - console.log("Renderer fixture matches the ALGAL view program"); -} else { - throw new Error("usage: bun fixtures/generate.ts --check | --write"); -} diff --git a/examples/malleable-site/renderers/fixtures/view.json b/examples/malleable-site/renderers/fixtures/view.json deleted file mode 100644 index 516cb194..00000000 --- a/examples/malleable-site/renderers/fixtures/view.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "kind": "stack", - "id": "surface", - "layout": "split", - "children": [ - { - "kind": "text", - "id": "audience", - "role": "eyebrow", - "text": "For people who build" - }, - { - "kind": "text", - "id": "headline", - "role": "heading", - "text": "Software that can grow with you." - }, - { - "kind": "text", - "id": "body", - "role": "body", - "text": "Build inspectable applications that can change their behavior while keeping their history. Start with one living component." - }, - { - "kind": "link", - "id": "cta", - "label": "Explore ALGAL", - "href": "/docs/" - }, - { - "kind": "text", - "id": "release", - "role": "status", - "text": "A living preview" - } - ] -} diff --git a/examples/malleable-site/renderers/measurement.json b/examples/malleable-site/renderers/measurement.json deleted file mode 100644 index 37efad2c..00000000 --- a/examples/malleable-site/renderers/measurement.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "kind": "experimental-renderer-feasibility-measurement", - "date": "2026-09-23", - "platform": { - "os": "macOS", - "version": "26.5.2", - "architecture": "arm64" - }, - "toolchain": { - "nativeRust": "1.97.1", - "webRust": "1.98.1", - "dioxus": "0.7.10", - "ratatui": "0.30.2", - "crossterm": "0.29.0", - "trunk": "0.21.14", - "wasmBindgen": "0.2.128", - "wasmOpt": "123" - }, - "fixture": { - "path": "fixtures/view.json", - "bytes": 777, - "gzipBytes": 328, - "sha256": "cbb6a3330251f548b0e5c4534399fe36ed4cbc6d7af44f4c10bdc11d5f8f10b5" - }, - "lockfileSha256": "83bd4bdb07f3d28995aedf7ccab5d8a8debff4df7708ccc35f1e8a20d54ab803", - "checks": { - "fixtureMatchesAlgalView": true, - "cargoFmt": true, - "cargoTest": { - "passed": 5, - "failed": 0 - }, - "cargoClippyAllTargetsDenyWarnings": true, - "dioxusWebReleaseBuild": true, - "dioxusDesktopDevBuild": true, - "ratatuiTestBackendWidths": [ - 36, - 100 - ], - "ratatuiSnapshotSize": [ - 88, - 30 - ] - }, - "artifacts": { - "webRelease": [ - { - "path": "dist/index.html", - "bytes": 1988, - "gzipBytes": 956, - "sha256": "3fa448dceab3ad307a234255ba76dd860935154bd5da48ee145ca90dab3cc1ed" - }, - { - "path": "dist/snippets/dioxus-interpreter-js-20451f6aefec841d/inline0.js", - "bytes": 20855, - "gzipBytes": 4391, - "sha256": "cd533b7b9f2192fa535f92f4f266d03d47c23105cf500498d0bc8d6cc90dc6cf" - }, - { - "path": "dist/snippets/dioxus-interpreter-js-20451f6aefec841d/src/js/hydrate.js", - "bytes": 488, - "gzipBytes": 195, - "sha256": "0659b58e105fbc8e7e97feb8aa123f455520333ae10c326fa37ec0eb4b08e833" - }, - { - "path": "dist/snippets/dioxus-interpreter-js-20451f6aefec841d/src/js/patch_console.js", - "bytes": 937, - "gzipBytes": 278, - "sha256": "9ef1d21e8c05e91f5dd9e46c8f47ae574185a64497527b687f8fdb9b98045f83" - }, - { - "path": "dist/snippets/dioxus-interpreter-js-20451f6aefec841d/src/js/set_attribute.js", - "bytes": 1887, - "gzipBytes": 680, - "sha256": "5b56995f71fe629934f4ab5eb292d5cfccd9d99037eb9a39ede5078c78db88df" - }, - { - "path": "dist/snippets/dioxus-web-eae67878b22d6805/inline0.js", - "bytes": 267, - "gzipBytes": 173, - "sha256": "853d44dbc9d2696e80d66c056e21d69e77b2bf68f9636826becd029f67c884a5" - }, - { - "path": "dist/surface-dioxus-b78edf967e89ce7e.js", - "bytes": 25243, - "gzipBytes": 5377, - "sha256": "4e6f2b548c371eb2554f56bc2fc8444c06ddef8ef7d920f3d55e978eec998ec2" - }, - { - "path": "dist/surface-dioxus-b78edf967e89ce7e_bg.wasm", - "bytes": 311048, - "gzipBytes": 136399, - "sha256": "8cdd861550948fdda325aaf3191b3d50c5b22532d4d29fc730e08d9688287813" - } - ], - "webReleaseTotalBytes": 362713, - "desktopDevBinary": { - "path": "target/debug/surface-dioxus", - "bytes": 25762848, - "gzipBytes": 5812148, - "sha256": "3815ef0619a76aab80cd090200cab64841b800165e8d89f51b40d2cd8853bafb" - }, - "tuiDevBinary": { - "path": "target/debug/surface-tui", - "bytes": 3370480, - "gzipBytes": 907268, - "sha256": "d2ceddcd1aebc97e190d068535d6d67a27e217132b13fbcebaa04e647dc3aae2" - }, - "terminalSnapshot": { - "path": "tui-snapshot.txt", - "bytes": 239, - "gzipBytes": 190, - "sha256": "fa450b6e418239fa8a97df97cf7b17d5eb253f33271662b3ab4e1664f829e0cd", - "normalization": "unused trailing empty rows omitted; TestBackend remains 88 by 30" - } - }, - "qualification": { - "webBrowserRuntime": "not measured by renderer worker; integration owner records browser evidence separately", - "desktopWindowRuntime": "not measured by renderer worker; compile only", - "terminal": "actual Ratatui TestBackend rendering; interactive terminal UX not qualified" - }, - "limitations": [ - "No input widgets: IME, draft/focus preservation and general form interaction remain unqualified.", - "No mobile, Windows or Linux desktop launch evidence.", - "Debug binary sizes are development artifacts, not packaged application sizes.", - "Desktop dependency block 0.1.6 emits the upstream uninhabited-static future-incompatibility warning on Rust 1.97.1.", - "No full ALGAL browser VM, inference, lifecycle activation or cloud host lives in these adapters." - ] -} diff --git a/examples/malleable-site/renderers/src/bin/tui.rs b/examples/malleable-site/renderers/src/bin/tui.rs deleted file mode 100644 index 092e0552..00000000 --- a/examples/malleable-site/renderers/src/bin/tui.rs +++ /dev/null @@ -1,52 +0,0 @@ -use algal_surface_renderers::{FIXTURE, MAX_BYTES, parse_view, tui_adapter::render}; -use crossterm::event::{self, Event, KeyCode, KeyEventKind}; -use ratatui::{Terminal, backend::TestBackend, layout::Margin}; -use std::io::Read; - -fn main() -> Result<(), Box> { - let mut args = std::env::args().skip(1); - let snapshot = match args.next().as_deref() { - None => false, - Some("--snapshot") => true, - _ => return Err("usage: surface-tui [--snapshot] [view.json]".into()), - }; - let input = if let Some(path) = args.next() { - let mut text = String::new(); - std::fs::File::open(path)? - .take((MAX_BYTES + 1) as u64) - .read_to_string(&mut text)?; - text - } else { - FIXTURE.to_owned() - }; - if args.next().is_some() { - return Err("unexpected argument".into()); - } - let tree = parse_view(&input)?; - if snapshot { - let mut terminal = Terminal::new(TestBackend::new(88, 30))?; - terminal.draw(|frame| render(frame, frame.area().inner(Margin::new(2, 1)), &tree))?; - for y in 0..30 { - let row: String = (0..88) - .map(|x| terminal.backend().buffer()[(x, y)].symbol()) - .collect(); - println!("{}", row.trim_end()); - } - return Ok(()); - } - let mut terminal = ratatui::init(); - let result = (|| -> Result<(), Box> { - loop { - terminal.draw(|frame| render(frame, frame.area().inner(Margin::new(2, 1)), &tree))?; - if let Event::Key(key) = event::read()? - && key.kind == KeyEventKind::Press - && matches!(key.code, KeyCode::Char('q') | KeyCode::Esc) - { - break; - } - } - Ok(()) - })(); - ratatui::restore(); - result -} diff --git a/examples/malleable-site/renderers/src/lib.rs b/examples/malleable-site/renderers/src/lib.rs deleted file mode 100644 index aefde549..00000000 --- a/examples/malleable-site/renderers/src/lib.rs +++ /dev/null @@ -1,183 +0,0 @@ -//! Renderer adapters for the experimental ALGAL marketing SurfaceNode contract. -//! They render admitted data; they do not evaluate ALGAL or confer revision authority. -use serde::{Deserialize, Serialize}; -use std::collections::BTreeSet; - -pub const MAX_BYTES: usize = 32_768; -pub const FIXTURE: &str = include_str!("../fixtures/view.json"); - -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] -#[serde(rename_all = "lowercase")] -pub enum Layout { - Stack, - Split, -} - -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] -#[serde(rename_all = "lowercase")] -pub enum Role { - Eyebrow, - Heading, - Body, - Status, -} - -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] -#[serde(tag = "kind", rename_all = "lowercase", deny_unknown_fields)] -pub enum SurfaceNode { - Stack { - id: String, - layout: Layout, - children: Vec, - }, - Text { - id: String, - role: Role, - text: String, - }, - Link { - id: String, - label: String, - href: String, - }, -} - -impl SurfaceNode { - pub fn id(&self) -> &str { - match self { - Self::Stack { id, .. } | Self::Text { id, .. } | Self::Link { id, .. } => id, - } - } -} - -/// Validate before handing untrusted input to any renderer. This adapter accepts -/// only the three node kinds and the host-fixed docs destination. -pub fn parse_view(input: &str) -> Result { - if input.len() > MAX_BYTES { - return Err("surface exceeds byte bound".into()); - } - let node: SurfaceNode = serde_json::from_str(input).map_err(|_| "invalid surface JSON")?; - if !matches!(node, SurfaceNode::Stack { .. }) { - return Err("surface root must be a stack".into()); - } - let mut ids = BTreeSet::new(); - validate(&node, 0, &mut ids)?; - Ok(node) -} - -fn bounded_text(value: &str, max: usize) -> bool { - // Match JavaScript String.trim and String.length at the shared boundary. - // Rust's Unicode whitespace set differs (for example U+0085 and U+FEFF). - !value.chars().all(|c| { - matches!(c as u32, - 9..=13 | 32 | 160 | 5760 | 8192..=8202 | 8232..=8233 | 8239 | 8287 | 12288 | 65279) - }) && value.encode_utf16().count() <= max - && !value - .chars() - .any(|c| matches!(c as u32, 0..=8 | 11..=12 | 14..=31 | 127)) -} - -fn validate(node: &SurfaceNode, depth: usize, ids: &mut BTreeSet) -> Result<(), String> { - let id = node.id(); - if depth > 4 || ids.len() >= 32 { - return Err("surface structure bound exceeded".into()); - } - if id.is_empty() - || id.len() > 64 - || !id.as_bytes()[0].is_ascii_lowercase() - || !id - .bytes() - .all(|c| c.is_ascii_lowercase() || c.is_ascii_digit() || c == b'-') - || !ids.insert(id.to_owned()) - { - return Err("invalid or duplicate surface identity".into()); - } - match node { - SurfaceNode::Stack { children, .. } => { - if children.is_empty() || children.len() > 16 { - return Err("invalid child count".into()); - } - for child in children { - validate(child, depth + 1, ids)?; - } - } - SurfaceNode::Text { text, .. } => { - if !bounded_text(text, 280) { - return Err("invalid surface text".into()); - } - } - SurfaceNode::Link { label, href, .. } => { - if !bounded_text(label, 32) || href != "/docs/" { - return Err("invalid surface link".into()); - } - } - } - Ok(()) -} - -#[cfg(feature = "tui")] -pub mod tui_adapter; - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn shared_fixture_round_trips() { - let view = parse_view(FIXTURE).unwrap(); - assert_eq!( - parse_view(&serde_json::to_string(&view).unwrap()).unwrap(), - view - ); - } - - #[test] - fn rejects_unknown_authority_and_duplicate_identity() { - let original: serde_json::Value = serde_json::from_str(FIXTURE).unwrap(); - let mutations: [fn(&mut serde_json::Value); 4] = [ - |v| { - v["onclick"] = "evil".into(); - }, - |v| { - v["children"][3]["href"] = "javascript:alert(1)".into(); - }, - |v| { - v["children"][1]["id"] = "surface".into(); - }, - |v| { - v["children"][1]["text"] = "x".repeat(281).into(); - }, - ]; - for mutate in mutations { - let mut input = original.clone(); - mutate(&mut input); - assert!(parse_view(&input.to_string()).is_err()); - } - } - - #[test] - fn markup_is_data_and_not_an_executable_node() { - let literal = FIXTURE.replace( - "Software that can grow with you.", - "", - ); - assert!(parse_view(&literal).is_ok()); - assert!( - parse_view(&FIXTURE.replace("\"kind\": \"link\"", "\"kind\": \"script\"")).is_err() - ); - } - - #[test] - fn matches_javascript_text_length_and_whitespace() { - let mut view: serde_json::Value = serde_json::from_str(FIXTURE).unwrap(); - for (text, valid) in [ - ("\u{feff}".into(), false), - ("\u{85}".into(), true), - ("🦀".repeat(140), true), - ("🦀".repeat(141), false), - ] { - view["children"][2]["text"] = serde_json::Value::String(text); - assert_eq!(parse_view(&view.to_string()).is_ok(), valid); - } - } -} diff --git a/examples/malleable-site/renderers/src/tui_adapter.rs b/examples/malleable-site/renderers/src/tui_adapter.rs deleted file mode 100644 index fd2d738f..00000000 --- a/examples/malleable-site/renderers/src/tui_adapter.rs +++ /dev/null @@ -1,136 +0,0 @@ -use crate::{Layout as SurfaceLayout, Role, SurfaceNode}; -use ratatui::{ - Frame, - layout::Rect, - style::{Color, Modifier, Style}, - widgets::{Paragraph, Wrap}, -}; - -/// A terminal renders the same semantics with terminal layout and text styles. -/// A link stays a labelled destination; this adapter never launches a browser. -pub fn render(frame: &mut Frame, area: Rect, node: &SurfaceNode) { - match node { - SurfaceNode::Stack { - layout, children, .. - } => { - let split = *layout == SurfaceLayout::Split && area.width >= 64; - let mut index = 0; - let mut y = area.y; - while index < children.len() && y < area.bottom() { - let child = &children[index]; - let pair = split - && matches!( - child, - SurfaceNode::Text { - role: Role::Body, - .. - } - ) - && matches!(children.get(index + 1), Some(SurfaceNode::Link { .. })); - let width = if pair { area.width / 2 } else { area.width }; - let next = children.get(index + 1); - let h = if pair { - height(child, width).max(height(next.unwrap(), width)) - } else { - height(child, width) - }; - let h = h.min(area.bottom() - y); - render(frame, Rect::new(area.x, y, width, h), child); - if pair { - render( - frame, - Rect::new(area.x + width + 1, y, area.width - width - 1, h), - next.unwrap(), - ); - } - y = y.saturating_add(h).saturating_add(1); - index += if pair { 2 } else { 1 }; - } - } - SurfaceNode::Text { role, text, .. } => { - let style = match role { - Role::Heading => Style::default() - .fg(Color::White) - .add_modifier(Modifier::BOLD), - Role::Eyebrow => Style::default().fg(Color::LightGreen), - Role::Body => Style::default().fg(Color::Gray), - Role::Status => Style::default().fg(Color::DarkGray), - }; - frame.render_widget( - Paragraph::new(text.as_str()) - .style(style) - .wrap(Wrap { trim: false }), - area, - ); - } - SurfaceNode::Link { label, href, .. } => frame.render_widget( - Paragraph::new(format!("{label} → {href}")) - .style( - Style::default() - .fg(Color::LightGreen) - .add_modifier(Modifier::UNDERLINED), - ) - .wrap(Wrap { trim: false }), - area, - ), - } -} - -fn height(node: &SurfaceNode, width: u16) -> u16 { - match node { - SurfaceNode::Stack { - layout, children, .. - } => { - let width = if *layout == SurfaceLayout::Split && width >= 64 { - width / 2 - } else { - width - }; - children - .iter() - .map(|c| height(c, width).saturating_add(1)) - .sum() - } - SurfaceNode::Text { text, .. } => Paragraph::new(text.as_str()) - .wrap(Wrap { trim: false }) - .line_count(width) as u16, - SurfaceNode::Link { label, href, .. } => Paragraph::new(format!("{label} → {href}")) - .wrap(Wrap { trim: false }) - .line_count(width) as u16, - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::{FIXTURE, parse_view}; - use ratatui::{Terminal, backend::TestBackend}; - - pub fn snapshot(width: u16, height: u16) -> String { - let mut terminal = Terminal::new(TestBackend::new(width, height)).unwrap(); - let tree = parse_view(FIXTURE).unwrap(); - terminal - .draw(|frame| render(frame, frame.area(), &tree)) - .unwrap(); - let buffer = terminal.backend().buffer(); - (0..height) - .map(|y| { - (0..width) - .map(|x| buffer[(x, y)].symbol()) - .collect::() - }) - .collect::>() - .join("\n") - } - - #[test] - fn renders_fixture_in_wide_and_narrow_terminal_buffers() { - for width in [36, 100] { - let output = snapshot(width, 40); - assert!(output.contains("Software that can grow with you.")); - assert!(output.contains("Explore ALGAL")); - assert!(output.contains("/docs/")); - assert!(!output.contains("\u{1b}")); - } - } -} diff --git a/examples/malleable-site/renderers/tui-snapshot.txt b/examples/malleable-site/renderers/tui-snapshot.txt deleted file mode 100644 index 0f56ab89..00000000 --- a/examples/malleable-site/renderers/tui-snapshot.txt +++ /dev/null @@ -1,10 +0,0 @@ - - For people who build - - Software that can grow with you. - - Build inspectable applications that can Explore ALGAL → /docs/ - change their behavior while keeping their - history. Start with one living component. - - A living preview diff --git a/tsconfig.json b/tsconfig.json index 1b8b6059..a7df6626 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -38,11 +38,8 @@ "site/tasks-render.ts", "site/browser-inference.ts", "site/browser-inference-worker.ts", - "examples/malleable-site/renderers/target", - "examples/malleable-site/renderers/dist", "dist", ".algal", - "examples/local-triage/renderers/target", "examples/local-triage/dist" ] }