From 21e154381b31cfd009c04debd7db24a27367fafc Mon Sep 17 00:00:00 2001 From: Surma Date: Thu, 12 Nov 2026 11:11:25 +0000 Subject: [PATCH] Remove box (Surma's private container service client) and spikes; drop personal hosts and paths from docs and code --- AGENTS.md | 3 +- Cargo.lock | 12 - Cargo.toml | 1 - README.md | 5 +- docs/RUNNING.md | 19 +- flake.nix | 2 +- host/src/cred/script.rs | 2 +- host/src/lib.rs | 2 +- host/tests/builder-fixture/build.rs | 2 +- spikes/s1-v8-harness/21.ts | 172 - spikes/s1-v8-harness/23.ts | 156 - spikes/s1-v8-harness/Cargo.lock | 5948 ----------------- spikes/s1-v8-harness/Cargo.toml | 22 - spikes/s1-v8-harness/README.md | 29 - spikes/s1-v8-harness/bootstrap.js | 27 - spikes/s1-v8-harness/real.ts | 24 - spikes/s1-v8-harness/sqlite.ts | 33 - spikes/s1-v8-harness/src/main.rs | 145 - spikes/s1-v8-harness/startup.js | 2 - spikes/s1-v8-harness/verify.nu | 12 - spikes/s2-shell/.gitignore | 2 - spikes/s2-shell/Cargo.lock | 2472 ------- spikes/s2-shell/Cargo.toml | 18 - spikes/s2-shell/README.md | 71 - spikes/s2-shell/compare.nu | 42 - spikes/s2-shell/corpus.sh | 18 - spikes/s2-shell/guest-process.rs | 76 - spikes/s2-shell/patch-brush.nu | 16 - spikes/s2-shell/process.wit | 6 - spikes/s2-shell/src/main.rs | 90 - spikes/s2-shell/src/process.rs | 191 - spikes/s2-shell/timings.nu | 36 - spikes/s2-shell/userland/Cargo.lock | 1505 ----- spikes/s2-shell/userland/Cargo.toml | 17 - spikes/s2-shell/userland/src/main.rs | 24 - .../s3-git/0001-wasi-no-syslog-header.patch | 6 - spikes/s3-git/README.md | 85 - spikes/s3-git/baseline.nu | 11 - spikes/s3-git/build.nu | 10 - spikes/s3-git/host_fs.wat | 16 - spikes/s3-git/host_net.wat | 15 - spikes/s3-git/host_process.wat | 21 - spikes/s3-git/host_tty.wat | 4 - spikes/s3-git/host_user.wat | 7 - spikes/s3-git/probe.nu | 56 - spikes/s3-git/stubs.nu | 23 - spikes/s3-git/test.nu | 44 - spikes/s4-builder/Cargo.lock | 7 - spikes/s4-builder/Cargo.toml | 6 - spikes/s4-builder/fixture/Cargo.lock | 75 - spikes/s4-builder/fixture/Cargo.toml | 9 - spikes/s4-builder/fixture/build.rs | 17 - spikes/s4-builder/fixture/src/main.rs | 16 - spikes/s4-builder/src/main.rs | 133 - spikes/s5-http/Cargo.lock | 2746 -------- spikes/s5-http/Cargo.toml | 18 - spikes/s5-http/README.md | 38 - spikes/s5-http/guest/Cargo.lock | 299 - spikes/s5-http/guest/Cargo.toml | 10 - spikes/s5-http/guest/src/main.rs | 31 - spikes/s5-http/repeat.nu | 22 - spikes/s5-http/src/main.rs | 387 -- spikes/s5-http/verify.nu | 10 - spikes/s6-esbuild/README.md | 61 - spikes/s6-esbuild/app.tsx | 8 - spikes/s6-esbuild/build.nu | 29 - spikes/s6-esbuild/check.mjs | 12 - spikes/s6-esbuild/clocks.wat | 10 - spikes/s6-esbuild/diagnose.nu | 19 - .../s6-esbuild/eager-state.experimental.patch | 14 - spikes/s6-esbuild/hello.go | 27 - spikes/s6-esbuild/limitations.nu | 15 - spikes/s6-esbuild/package-lock.json | 210 - spikes/s6-esbuild/package.json | 9 - spikes/s6-esbuild/test.nu | 58 - spikes/s7-preview1-adapter/README.md | 53 - spikes/s7-preview1-adapter/build.nu | 29 - spikes/s7-preview1-adapter/diagnostic.patch | 54 - spikes/s7-preview1-adapter/eager-state.patch | 14 - spikes/s7-preview1-adapter/test.nu | 43 - userland/box/Cargo.toml | 16 - userland/box/README.md | 118 - userland/box/src/archive.rs | 237 - userland/box/src/cli.rs | 264 - userland/box/src/excerpt.rs | 108 - userland/box/src/http.rs | 265 - userland/box/src/lib.rs | 746 --- userland/box/src/main.rs | 12 - userland/box/src/retention.rs | 93 - userland/box/src/transfer.rs | 379 -- userland/box/test.nu | 66 - 91 files changed, 13 insertions(+), 18280 deletions(-) delete mode 100644 spikes/s1-v8-harness/21.ts delete mode 100644 spikes/s1-v8-harness/23.ts delete mode 100644 spikes/s1-v8-harness/Cargo.lock delete mode 100644 spikes/s1-v8-harness/Cargo.toml delete mode 100644 spikes/s1-v8-harness/README.md delete mode 100644 spikes/s1-v8-harness/bootstrap.js delete mode 100644 spikes/s1-v8-harness/real.ts delete mode 100644 spikes/s1-v8-harness/sqlite.ts delete mode 100644 spikes/s1-v8-harness/src/main.rs delete mode 100644 spikes/s1-v8-harness/startup.js delete mode 100644 spikes/s1-v8-harness/verify.nu delete mode 100644 spikes/s2-shell/.gitignore delete mode 100644 spikes/s2-shell/Cargo.lock delete mode 100644 spikes/s2-shell/Cargo.toml delete mode 100644 spikes/s2-shell/README.md delete mode 100644 spikes/s2-shell/compare.nu delete mode 100644 spikes/s2-shell/corpus.sh delete mode 100644 spikes/s2-shell/guest-process.rs delete mode 100644 spikes/s2-shell/patch-brush.nu delete mode 100644 spikes/s2-shell/process.wit delete mode 100644 spikes/s2-shell/src/main.rs delete mode 100644 spikes/s2-shell/src/process.rs delete mode 100644 spikes/s2-shell/timings.nu delete mode 100644 spikes/s2-shell/userland/Cargo.lock delete mode 100644 spikes/s2-shell/userland/Cargo.toml delete mode 100644 spikes/s2-shell/userland/src/main.rs delete mode 100644 spikes/s3-git/0001-wasi-no-syslog-header.patch delete mode 100644 spikes/s3-git/README.md delete mode 100644 spikes/s3-git/baseline.nu delete mode 100644 spikes/s3-git/build.nu delete mode 100644 spikes/s3-git/host_fs.wat delete mode 100644 spikes/s3-git/host_net.wat delete mode 100644 spikes/s3-git/host_process.wat delete mode 100644 spikes/s3-git/host_tty.wat delete mode 100644 spikes/s3-git/host_user.wat delete mode 100644 spikes/s3-git/probe.nu delete mode 100644 spikes/s3-git/stubs.nu delete mode 100644 spikes/s3-git/test.nu delete mode 100644 spikes/s4-builder/Cargo.lock delete mode 100644 spikes/s4-builder/Cargo.toml delete mode 100644 spikes/s4-builder/fixture/Cargo.lock delete mode 100644 spikes/s4-builder/fixture/Cargo.toml delete mode 100644 spikes/s4-builder/fixture/build.rs delete mode 100644 spikes/s4-builder/fixture/src/main.rs delete mode 100644 spikes/s4-builder/src/main.rs delete mode 100644 spikes/s5-http/Cargo.lock delete mode 100644 spikes/s5-http/Cargo.toml delete mode 100644 spikes/s5-http/README.md delete mode 100644 spikes/s5-http/guest/Cargo.lock delete mode 100644 spikes/s5-http/guest/Cargo.toml delete mode 100644 spikes/s5-http/guest/src/main.rs delete mode 100644 spikes/s5-http/repeat.nu delete mode 100644 spikes/s5-http/src/main.rs delete mode 100644 spikes/s5-http/verify.nu delete mode 100644 spikes/s6-esbuild/README.md delete mode 100644 spikes/s6-esbuild/app.tsx delete mode 100644 spikes/s6-esbuild/build.nu delete mode 100644 spikes/s6-esbuild/check.mjs delete mode 100644 spikes/s6-esbuild/clocks.wat delete mode 100644 spikes/s6-esbuild/diagnose.nu delete mode 100644 spikes/s6-esbuild/eager-state.experimental.patch delete mode 100644 spikes/s6-esbuild/hello.go delete mode 100644 spikes/s6-esbuild/limitations.nu delete mode 100644 spikes/s6-esbuild/package-lock.json delete mode 100644 spikes/s6-esbuild/package.json delete mode 100644 spikes/s6-esbuild/test.nu delete mode 100644 spikes/s7-preview1-adapter/README.md delete mode 100644 spikes/s7-preview1-adapter/build.nu delete mode 100644 spikes/s7-preview1-adapter/diagnostic.patch delete mode 100644 spikes/s7-preview1-adapter/eager-state.patch delete mode 100644 spikes/s7-preview1-adapter/test.nu delete mode 100644 userland/box/Cargo.toml delete mode 100644 userland/box/README.md delete mode 100644 userland/box/src/archive.rs delete mode 100644 userland/box/src/cli.rs delete mode 100644 userland/box/src/excerpt.rs delete mode 100644 userland/box/src/http.rs delete mode 100644 userland/box/src/lib.rs delete mode 100644 userland/box/src/main.rs delete mode 100644 userland/box/src/retention.rs delete mode 100644 userland/box/src/transfer.rs delete mode 100644 userland/box/test.nu diff --git a/AGENTS.md b/AGENTS.md index fb78317..1789c23 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -3,8 +3,7 @@ Sausage is a world of WASI programs and durable agents. It is meant to be read and changed by agents, including its own. Keep it that way. -This branch (`v3`) rebuilds Sausage. The plan and its decisions (D1, D2, …) are in -`~/research/sausage-v3/PLAN.md`. `README.md` describes the current build and layout. +`README.md` describes the current build and layout. ## The boundary diff --git a/Cargo.lock b/Cargo.lock index 895864b..70c00d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -870,18 +870,6 @@ dependencies = [ "syn 3.0.9", ] -[[package]] -name = "box-cli" -version = "0.1.0" -dependencies = [ - "clap", - "serde", - "serde_json", - "tar", - "url", - "wasi 0.14.7+wasi-0.2.4", -] - [[package]] name = "boxed_error" version = "0.2.3" diff --git a/Cargo.toml b/Cargo.toml index ffda3a2..74673fa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,6 @@ members = [ "userland/ssh", "userland/curl", "userland/init", - "userland/box", "userland/archive-tools", "userland/fs-tools", "userland/undo", diff --git a/README.md b/README.md index 52b14cb..5158e62 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Sausage is a world of WASI programs and durable agents. The Rust host combines a process table, a shared virtual filesystem, and a durable JavaScript harness. Agents and their programs see the same world. The filesystem prevents mistakes, not attacks between agents. The host credentials manager is the intended security boundary. Coordination (branches, subagents, reviews, the lander) runs as world extensions. -Read [Run Sausage v3 on Citadel](docs/RUNNING.md) for the console, approvals, models, extensions and the known gaps. +Read [Run Sausage](docs/RUNNING.md) for the console, approvals, models, extensions and the known gaps. ## Build and run @@ -37,9 +37,6 @@ The `/api/` mount forwards to `host.sausage`, including NDJSON streams. The host - `host/`: the Rust host, process table, and durable harness. Its checked-in JavaScript bundles need no npm during a Nix build. - `vfs/`: the shared virtual filesystem and WASI adapters. - `userland/`: the default tools and patched Brush source, in the root Cargo workspace. `bundle.nu` builds them for `wasm32-wasip2`. -- `spikes/`: reference prototypes, not production dependencies. - -The design and decisions live in `~/research/sausage-v3/PLAN.md`. ## Development diff --git a/docs/RUNNING.md b/docs/RUNNING.md index 6d2619b..c37dd5d 100644 --- a/docs/RUNNING.md +++ b/docs/RUNNING.md @@ -1,4 +1,4 @@ -# Run Sausage v3 on Citadel +# Run Sausage Use the web UI for conversations, passkeys, approvals, and secret entry. The host serves only JSON through `/api/`. @@ -8,7 +8,7 @@ Keep the complete world folder between starts. ## Build and start -Run host commands from a checkout of the `v3` branch on Citadel. +Run host commands from a checkout of the repository. Use Nix with flakes. The package supplies the native Rust builder and its tools. Use `sausage run --no-builder-sandbox WORLD` only when the host must run the builder without namespace isolation. @@ -51,9 +51,6 @@ Cargo puts the host under `target/release/sausage`, unless `CARGO_TARGET_DIR` se Use that binary with `init WORLD --userland BUNDLE`, then `run WORLD`. Use the repository's build slots and shared executor target directory for agent validation builds. -Choose `$HOME/sausage-v3`, not the live v2 `~/world`. -For the actual cutover, let v2 finish its work before you stop it. -Do not run two production services. This guide does not stop or replace the deployed service. The host creates this layout: | Host path | Purpose | @@ -80,7 +77,7 @@ The pending-requests banner opens the approval view in the page. The host verifi Agents edit `/srv/www/index.html`. Each request reads the file fresh without a build or restart. The terminal console remains optional. Each nonempty console line submits a message to the main agent conversation. -Assistant text appears on stdout. This is not a shell or the v2 command dispatcher. +Assistant text appears on stdout. This is not a shell. Text such as `quit`, `help`, and `core.restart` has no special host meaning. Ask the agent to execute world commands when you need tools. @@ -100,10 +97,10 @@ and [`harness/mod.rs`](../host/src/harness/mod.rs). ## Reach the chat and approval pages The world web server listens on port 8080. The host opens no separate port. -From the laptop, create one SSH tunnel: +If Sausage runs on another machine, forward the port with one SSH tunnel from your computer: ```sh -ssh -N -L 8080:127.0.0.1:8080 citadel.vpn.surma.technology +ssh -N -L 8080:127.0.0.1:8080 YOUR-SERVER ``` Open **http://localhost:8080**. The first-passkey notice opens the Passkeys view. @@ -224,9 +221,8 @@ These are world programs, not console commands. Ask the agent to run them. | Tool | Use and limits | | --- | --- | | `cargo` | Build, run, and test Rust programs. The host copies the workspace through the VFS, fetches dependencies, then builds offline in namespaces. It publishes WASI artifacts into the world. Other targets are unsupported. | -| `box` | Build non-Rust projects or run browser tests in disposable containers. The default service is `citadel.vpn.surma.technology:8093`. It requires network access and service availability. Remove boxes after use. | | `undo` | Inspect tags and restore filesystem changes. Later edits can conflict. Network effects and native builds are not reversible. Retention is seven days or 4 GiB of unique content. | -| `systemctl` | Control world init services, not Citadel's systemd. Persistent units live under `/etc/systemd/system`. Init observes edits without daemon reload. | +| `systemctl` | Control world init services, not the host machine's systemd. Persistent units live under `/etc/systemd/system`. Init observes edits without daemon reload. | | `journalctl` | Read world service logs under `/var/log/journal`. Each unit retains a 1 MiB log and one rotated file. | | `git` | Manage world repositories. HTTPS credential rules can inject authorization through the host HTTP hook. SSH remotes use host signing. | | `ssh` | Execute a remote command without a PTY. Public identities and signatures come from the host. Private keys never enter the world. Host keys live in the world's known_hosts file. | @@ -237,7 +233,7 @@ A missing credential grant causes a pending host request, not an automatic appro A changed SSH host key fails even with the accept-new policy. Command reference and implementation evidence: -[`builder`](../host/src/builder/README.md), [`box`](../userland/box/README.md), +[`builder`](../host/src/builder/README.md), [`undo`](../userland/undo/README.md), [`init`](../userland/init/README.md), [`git`](../userland/git/README.md), and [`ssh`](../userland/ssh/README.md). @@ -277,6 +273,5 @@ Source: [`host API contract`](../host/src/api/README.md), - The bootstrap chat is deliberately plain. There is no item editor or credential dashboard. - The console has no shell commands, transcript navigation, or special quit command. - `sausage sh` requires `-c`. Its interactive shell is not implemented. -- This guide does not migrate a v2 world. Keep the live v2 folder untouched. A successful local start does not verify external services or the production passkey origin. diff --git a/flake.nix b/flake.nix index d5aea4f..2aa7fda 100644 --- a/flake.nix +++ b/flake.nix @@ -147,7 +147,7 @@ checks.shell = pkgs.runCommand "sausage-shell" { } '' export SAUSAGE_CACHE="$TMPDIR/sausage-cache" ${sausage}/bin/sausage sh "$TMPDIR/world" -c \ - 'set -e; echo hi | tr a-z A-Z; git --version; rg --version; awk "BEGIN {print 42}"; echo payload > /payload; tar -cf /test.tar /payload; tar -tf /test.tar; qjs -e "console.log(42)"; box --help; cargo --help; undo list' > output + 'set -e; echo hi | tr a-z A-Z; git --version; rg --version; awk "BEGIN {print 42}"; echo payload > /payload; tar -cf /test.tar /payload; tar -tf /test.tar; qjs -e "console.log(42)"; cargo --help; undo list' > output cat output grep -qx HI output grep -q 'git version' output diff --git a/host/src/cred/script.rs b/host/src/cred/script.rs index 1ed0a2c..47356b7 100644 --- a/host/src/cred/script.rs +++ b/host/src/cred/script.rs @@ -1,6 +1,6 @@ //! The contract between the credential pipeline and the script runtime that runs item validators //! and transforms. `cred::v8` implements it; the pipeline (`cred::inject`) and its tests use it. -//! It keeps v2 `jsrun::evaluate`'s behavior (see `~/world/plugins/cred/source/jsrun/`). +//! It keeps the behavior of the earlier `jsrun::evaluate` runtime. /// Requested limits. The runtime clamps them: time 1..1000 ms (default 100), heap 256 KiB..32 MiB /// (default 8 MiB). diff --git a/host/src/lib.rs b/host/src/lib.rs index 9ad732b..21d585c 100644 --- a/host/src/lib.rs +++ b/host/src/lib.rs @@ -1,5 +1,5 @@ //! The Sausage v3 host: a world folder behind a virtual filesystem, WASI programs in a process table, -//! and the durable agent harness. See `~/research/sausage-v3/PLAN.md` until the docs move here. +//! and the durable agent harness. pub mod api; pub mod builder; diff --git a/host/tests/builder-fixture/build.rs b/host/tests/builder-fixture/build.rs index c087c92..68b4a79 100644 --- a/host/tests/builder-fixture/build.rs +++ b/host/tests/builder-fixture/build.rs @@ -3,7 +3,7 @@ fn main() { if std::env::var("SAUSAGE_TEST_NO_BUILDER_SANDBOX").as_deref() == Ok("1") { println!("cargo:warning=namespace assertions skipped: builder sandbox disabled"); } else { - assert!(!std::path::Path::new("/home/surma/.ssh").exists()); + assert!(!std::path::Path::new("/home").exists()); assert!( !std::path::Path::new(&std::env::var("HOME").unwrap()) .join(".ssh") diff --git a/spikes/s1-v8-harness/21.ts b/spikes/s1-v8-harness/21.ts deleted file mode 100644 index 596828f..0000000 --- a/spikes/s1-v8-harness/21.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { openStorage } from "./sqlite.ts"; -// A foreground subagent tool: the parent's tool call creates a child conversation it owns, runs one task there, and -// returns the child's answer. Aborting the tool call aborts the child. A UI finds the child through the tool's running -// details and shows its view under the call. -// Uses OpenAI when OPENAI_API_KEY is set, and a scripted faux model otherwise. -// Run from packages/durable: -// node --conditions=source --experimental-strip-types test/examples/21-subagent-foreground.ts - -import type { Context } from "@earendil-works/chord/context"; -import { BACKGROUND_CONTEXT } from "@earendil-works/chord/context"; -import type { AssistantMessage, FauxResponseStep } from "@earendil-works/pi-ai"; -import { createModels } from "@earendil-works/pi-ai/models"; -import { fauxAssistantMessage, fauxProvider, fauxText, fauxToolCall } from "@earendil-works/pi-ai/providers/faux"; -import { openaiProvider } from "@earendil-works/pi-ai/providers/openai"; -import { obj, str } from "@earendil-works/pi-schema"; -import { - AssistantEntry, - type ConversationId, - configure, - createRegistry, - defineExtension, - defineTool, - type EntryId, - type EntryRecord, - type Extension, - Harness, - type LiveState, - type ToolExecutionApi, -} from "@earendil-works/pi-durable"; - -const context = BACKGROUND_CONTEXT; - -// ─── Product code: the subagent extension ─────────────────────────────────── - -async function answerText(api: ToolExecutionApi, answer: EntryId, callContext: Context): Promise { - const entry = await api.commit((tx) => tx.entry(AssistantEntry, answer), callContext); - const message = entry?.model?.[0] as AssistantMessage; - return message.content.flatMap((c) => (c.type === "text" ? [c.text] : [])).join(""); -} - -const Subagent: Extension = defineExtension({ - name: "subagent", - tools: [ - defineTool({ - name: "subagent", - description: "Delegate a self-contained task to a subagent and get its answer back.", - parameters: obj({ task: str({ description: "What the subagent should do" }) }), - // Safe to rerun after a crash: a rerun finds the child it already created and the submission it already made. - replay: "safe", - execute: async (args, api, callContext) => { - const { task } = args; - // The child is owned by this tool call's task, so aborting the call aborts the child, and the call - // finishes only once the child's work is done. - const child = await api.commit(async (tx) => { - // Ownership records the child: a rerun of this call finds it instead of creating another. - const existing = (await tx.scanConversations({ ownerTaskId: api.taskId }, 1)).items[0]; - if (existing !== undefined) return existing.id; - // Starts as a copy of this conversation's agent: model, thinking level, cwd, extensions, tools. - const created = await tx.createConversation({ ownership: { kind: "task", taskId: api.taskId } }); - // Without this extension, the child is not offered this tool. - await configure(tx, created.id, { extensions: { remove: [Subagent] } }); - return created.id; - }, callContext); - // A UI watching the parent sees this and can attach to the child. - await api.details({ conversationId: child }, callContext); - - const handle = (await api.conversation(child, callContext))!; - // The request ID makes a rerun get back the submission it made before the crash. - const request = { type: "input", content: task, requestId: `subagent:${api.taskId}` } as const; - const settled = await (await handle.submit(request, callContext)).wait(callContext); - if (settled.status !== "done" || settled.type !== "input") { - throw new Error(`Subagent failed: ${settled.status}`); - } - const text = await answerText(api, settled.answer, callContext); - return { output: [{ type: "text", text }], details: { conversationId: child } }; - }, - }), - ], -}); - -// ─── Host setup ───────────────────────────────────────────────────────────── - -const models = createModels(); -let fauxRun: ReturnType; -let childStarted = false; -let model = { provider: "openai", modelId: "gpt-6-sol" }; -if (process.env.OPENAI_API_KEY !== undefined) { - models.setProvider(openaiProvider()); -} else { - // The parent delegates, the child answers, and the parent reports. - const faux = fauxProvider({ tokensPerSecond: 100, tokenSize: { min: 1, max: 1 } }); - fauxRun = faux; - models.setProvider(faux.provider); - model = { provider: "faux", modelId: "faux-1" }; - const delegate = fauxToolCall("subagent", { task: "Name three prime numbers." }, { id: "call-1" }); - faux.setResponses([ - fauxAssistantMessage([delegate], { stopReason: "toolUse" }), - () => { - childStarted = true; - return fauxAssistantMessage([fauxText("2, 3, and 5.")]); - }, - fauxAssistantMessage([fauxText("The subagent says: 2, 3, and 5.")]), - ] satisfies FauxResponseStep[]); -} -const registry = createRegistry(); -registry.install(Subagent); -let harness = await Harness.open(await openStorage("/tmp/s1-v8-harness/21.sqlite"), { models, registry }, context); -let root = await harness.root(context, { agent: { model } }); -const requestId = crypto.randomUUID(); - -// ─── UI: the parent's transcript, with each subagent's indented under its call ─── - -/** Print an assistant entry's text and tool calls. */ -const print = (indent: string, entry: EntryRecord): void => { - const message = entry.model?.[0]; - if (entry.kind !== "pi.assistant" || message?.role !== "assistant") return; - for (const block of (message as AssistantMessage).content) { - if (block.type === "text" && block.text !== "") console.log(`${indent}assistant: ${block.text}`); - if (block.type === "toolCall") console.log(`${indent}tool ${block.name}(${JSON.stringify(block.arguments)})`); - } -}; -const attached = new Set(); -const attach = async (id: ConversationId, indent: string): Promise => { - attached.add(id); - const watch = await (await harness.conversation(id, context))!.watch(context); - let newest = watch.value.entries.at(-1)?.id ?? 0; - watch.start(async (call) => { - if (call.kind !== "value") return; - const { value } = call; - for (const entry of value.entries) if (entry.id > newest) print(indent, entry); - newest = value.entries.at(-1)?.id ?? newest; - // A running subagent call names its child conversation in its details. - for (const slot of (value.docs["pi.live"] as LiveState).tools ?? []) { - const child = (slot.details as { conversationId?: ConversationId } | undefined)?.conversationId; - if (child !== undefined && !attached.has(child)) await attach(child, `${indent} `); - } - }); -}; -await attach(root.id, ""); - -await root.submit( - { type: "input", content: "Use the subagent tool to find three prime numbers, then tell me what it said.", requestId }, - context, -); -harness.resume(); -const deadline = Date.now() + 10000; -while (!childStarted) { - if (Date.now() > deadline) throw new Error('Child did not start'); - await new Promise(resolve => setTimeout(resolve, 1)); -} -console.log('Stop with a live subagent, then reopen SQLite'); -await harness.close(context); -fauxRun!.setResponses([ - fauxAssistantMessage([fauxText('2, 3, and 5.')]), - fauxAssistantMessage([fauxText('The subagent says: 2, 3, and 5.')]), -]); -harness = await Harness.open(await openStorage('/tmp/s1-v8-harness/21.sqlite'), { models, registry }, context); -root = await harness.root(context); -harness.resume(); -const resumed = await root.submit({ type: 'input', content: 'Use the subagent tool to find three prime numbers, then tell me what it said.', requestId }, context); -const result = await resumed.wait(context); -if (result.status !== 'done') throw new Error(`Resume failed: ${result.status}`); -const view = await root.watch(context); -const answer = view.value.entries.filter(entry => entry.kind === 'pi.assistant').at(-1); -if (JSON.stringify(answer?.model).includes('The subagent says: 2, 3, and 5.') === false) throw new Error('Wrong resumed answer'); -print('', answer!); -await view.stop(); -console.log('21 resumed: done'); -await harness.waitForIdle(context); -// Watch callbacks run after their commit; let the last ones print. -await new Promise((resolve) => setTimeout(resolve, 0)); -await harness.close(context); diff --git a/spikes/s1-v8-harness/23.ts b/spikes/s1-v8-harness/23.ts deleted file mode 100644 index b5aa5cf..0000000 --- a/spikes/s1-v8-harness/23.ts +++ /dev/null @@ -1,156 +0,0 @@ -// A task that owns child tasks: a checkout charges four payments at once and waits for them. -// The task graph view prints the checkout's tree while its payments run. -// Run from packages/durable: -// node --conditions=source --experimental-strip-types test/examples/23-child-tasks.ts - - - -import { BACKGROUND_CONTEXT } from "@earendil-works/chord/context"; -import { createModels } from "@earendil-works/pi-ai/models"; -import { fauxProvider } from "@earendil-works/pi-ai/providers/faux"; -import { - type Conversation, - createRegistry, - defineExtension, - defineTask, - Harness, - type TaskGraph, - type TaskGraphNode, - type TaskId, -} from "@earendil-works/pi-durable"; -import { openStorage as openNodeSqliteStorage } from "./sqlite.ts"; - -const context = BACKGROUND_CONTEXT; - -// A fake bank: it declines an expired card at once, and confirms other charges after a moment. -const charged = new Set(); - -type PaymentInput = { card: string }; -type PaymentResult = { card: string }; -type PaymentState = { phase: "charge" } | { phase: "confirm" }; -const Payment = defineTask({ - name: "example.payment", - version: 1, - initial: () => ({ phase: "charge" }), - phases: { - charge: async (task, runtime, taskContext) => { - const card = task.input.card; - if (card.startsWith("expired")) { - const error = { message: `${card} declined` }; - await runtime.commit(() => ({ status: "terminal", outcome: { status: "failed", error } }), taskContext); - return; - } - charged.add(card); - // The bank confirms after a moment: wait for it without holding an invocation. - await runtime.sleepUntil(runtime.now() + 100, { phase: "confirm" }, taskContext); - }, - confirm: async (task, runtime, taskContext) => { - const card = task.input.card; - await runtime.commit( - () => ({ status: "terminal", outcome: { status: "completed", result: { card } } }), - taskContext, - ); - }, - }, - // Each payment undoes its own effect when aborted. - abort: async (task, runtime, taskContext) => { - const refunded = charged.delete(task.input.card); - console.log(` payment ${task.input.card} aborted${refunded ? ", refunded" : ""}`); - await runtime.commit(() => ({ status: "terminal", outcome: { status: "aborted" } }), taskContext); - }, -}); - -// The checkout creates its payments as child tasks and waits for all of them. -// With `failFast`, the first payment that fails aborts the others; the checkout -// itself is not aborted and decides its outcome once every payment is done. -type CheckoutState = { phase: "pay" } | { phase: "decide"; payments: TaskId[] }; -const Checkout = defineTask<{ cards: string[] }, CheckoutState, string>({ - name: "example.checkout", - version: 1, - initial: () => ({ phase: "pay" }), - phases: { - pay: async (task, runtime, taskContext) => { - await runtime.commit(async (tx) => { - const payments: TaskId[] = []; - for (const card of task.input.cards) { - payments.push(await tx.createTask(Payment, { card }, { ownership: { kind: "task", taskId: task.id } })); - } - return { status: "waiting", checkpoint: { phase: "decide", payments }, on: payments, policy: "failFast" }; - }, taskContext); - }, - decide: async (task, runtime, taskContext) => { - const outcomes = await runtime.outcomes(task.state.checkpoint.payments, taskContext); - console.log(` payments: ${outcomes.map((outcome) => outcome.status).join(", ")}`); - const paid = outcomes.every((outcome) => outcome.status === "completed"); - await runtime.commit( - () => - paid - ? { status: "terminal", outcome: { status: "completed", result: "order placed" } } - : { status: "terminal", outcome: { status: "failed", error: { message: "payment failed" } } }, - taskContext, - ); - }, - }, - // Runs only after every payment is done, so the refunds have already happened. - abort: async (_task, runtime, taskContext) => { - console.log(" checkout aborted"); - await runtime.commit(() => ({ status: "terminal", outcome: { status: "aborted" } }), taskContext); - }, -}); - -const registry = createRegistry(); -registry.install(defineExtension({ name: "checkout", tasks: [Payment, Checkout] })); - -const databasePath = "/tmp/s1-v8-harness/23.sqlite"; -const models = createModels(); -models.setProvider(fauxProvider().provider); -const open = async () => - Harness.open(await openNodeSqliteStorage(databasePath), { models, registry }, context); -/** Print the live tasks as a tree along their owner edges. */ -function printGraph(graph: TaskGraph): void { - const nodes = Object.values(graph.tasks); - const print = (node: TaskGraphNode, depth: number): void => { - const state = node.state; - const status = state.status === "waiting" ? `waiting on ${state.on.join(", ")}` : state.status; - console.log(` ${" ".repeat(depth)}${node.kind} ${node.id}: ${status}`); - for (const child of nodes.filter((candidate) => candidate.owner === node.id)) print(child, depth + 1); - }; - for (const node of nodes.filter((candidate) => candidate.owner === undefined)) print(node, 0); -} -const checkout = (root: Conversation, cards: string[]) => - root.commit((tx) => tx.createTask(Checkout, { cards }, { ownership: { kind: "conversation" } }), context); - -let harness = await open(); -let root = await harness.root(context); - -console.log("One card is declined:"); -let id = await checkout(root, ["visa-1", "expired-2", "visa-3", "visa-4"]); -console.log(` checkout: ${(await harness.waitForTask(id, context)).state.outcome.status}`); - -console.log("The customer cancels:"); -id = await checkout(root, ["visa-5", "visa-6", "visa-7", "visa-8"]); -harness.resume(); -await new Promise((resolve) => setTimeout(resolve, 20)); -const graph = await harness.watchTaskGraph(context); -printGraph(graph.value); -await graph.stop(); -await harness.abortTask(id, context); -console.log(` checkout: ${(await harness.waitForTask(id, context)).state.outcome.status}`); - -console.log("The process stops while the payments run, and a new one continues:"); -id = await checkout(root, ["visa-9", "visa-10", "visa-11", "visa-12"]); -await new Promise((resolve) => setTimeout(resolve, 20)); -const beforeStop = await harness.watchTaskGraph(context); -if (beforeStop.value.tasks[id].state.status === 'terminal') throw new Error('Checkout finished before the stop'); -printGraph(beforeStop.value); -await beforeStop.stop(); -await harness.close(context); -harness = await open(); -root = await harness.root(context); -harness.resume(); -const resumed = (await harness.waitForTask(id, context)).state.outcome; -if (resumed.status !== 'completed') throw new Error(`Resume failed: ${resumed.status}`); -console.log(` checkout: ${resumed.status}`); - -await harness.close(context); - diff --git a/spikes/s1-v8-harness/Cargo.lock b/spikes/s1-v8-harness/Cargo.lock deleted file mode 100644 index 71320e5..0000000 --- a/spikes/s1-v8-harness/Cargo.lock +++ /dev/null @@ -1,5948 +0,0 @@ -# This file is automatically @generated by Cargo. -# 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 = "aead" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" -dependencies = [ - "crypto-common 0.1.7", - "generic-array", -] - -[[package]] -name = "aes" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures 0.2.17", -] - -[[package]] -name = "aes-gcm" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" -dependencies = [ - "aead", - "aes", - "cipher", - "ctr", - "ghash", - "subtle", -] - -[[package]] -name = "aes-kw" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69fa2b352dcefb5f7f3a5fb840e02665d311d878955380515e4fd50095dd3d8c" -dependencies = [ - "aes", -] - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" -dependencies = [ - "memchr", -] - -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-no-stdlib" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2fb6cfd47bf496ff64095c20eaba0c201404ee38714d4142fcfa1dc334fcc7a" - -[[package]] -name = "alloc-stdlib" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" -dependencies = [ - "alloc-no-stdlib 2.0.4", -] - -[[package]] -name = "alloc-stdlib" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5c1865780388bfa186411ab5f247819487fc4864c6e9c3106611fa347586e1" -dependencies = [ - "alloc-no-stdlib 3.0.0", -] - -[[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 = "ar_archive_writer" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73cd58deff2140a0a8eae87e417bd01db68a33e148aa93d1e8cd837e55e312b6" -dependencies = [ - "object", -] - -[[package]] -name = "argon2" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c52ddac6d63c576bef8168db10c83c49c26444ecbc68060fef078925a901c" -dependencies = [ - "base64ct", - "blake2", - "cpufeatures 0.3.1", - "password-hash", -] - -[[package]] -name = "ascii" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" - -[[package]] -name = "asn1-rs" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" -dependencies = [ - "asn1-rs-derive", - "asn1-rs-impl", - "displaydoc", - "nom", - "num-traits", - "rusticata-macros", - "thiserror 1.0.69", - "time", -] - -[[package]] -name = "asn1-rs-derive" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "synstructure 0.12.6", -] - -[[package]] -name = "asn1-rs-impl" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ast_node" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb025ef00a6da925cf40870b9c8d008526b6004ece399cb0974209720f0b194" -dependencies = [ - "quote", - "swc_macros_common", - "syn 2.0.119", -] - -[[package]] -name = "async-compression" -version = "0.4.52" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ad47a740fb906fffdd891e8b6d5fde2511600f7bfaebd68939fa08a14999459" -dependencies = [ - "compression-codecs", - "compression-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "async-trait" -version = "0.1.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" - -[[package]] -name = "aws-lc-rs" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "048006790404103c488e6c5616b3e7e702a71292aadda08e8f7698a9e0d2eb53" -dependencies = [ - "aws-lc-sys 0.47.0", - "untrusted 0.7.1", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50037ee5e1e41e7b8f9d161680a725bd1626cb6f8c7e901f91f942850852fe7" -dependencies = [ - "cc", - "cmake", - "dunce", - "fs_extra", -] - -[[package]] -name = "aws-lc-sys" -version = "0.47.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bfbe32ac36b3c428696ce315464181bc4029d689fd58e3f2a4e58c252242f52" -dependencies = [ - "cc", - "cmake", - "dunce", - "fs_extra", - "pkg-config", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base16ct" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64-simd" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" -dependencies = [ - "outref", - "vsimd", -] - -[[package]] -name = "base64ct" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" - -[[package]] -name = "better_scoped_tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd228125315b132eed175bf47619ac79b945b26e56b848ba203ae4ea8603609" -dependencies = [ - "scoped-tls", -] - -[[package]] -name = "bindgen" -version = "0.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" -dependencies = [ - "bitflags", - "cexpr", - "clang-sys", - "itertools", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash 1.1.0", - "shlex 1.3.0", - "syn 2.0.119", -] - -[[package]] -name = "bindgen" -version = "0.72.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" -dependencies = [ - "bitflags", - "cexpr", - "clang-sys", - "itertools", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash 2.1.3", - "shlex 1.3.0", - "syn 2.0.119", -] - -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - -[[package]] -name = "bitflags" -version = "2.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" - -[[package]] -name = "bitvec" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "blake2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b5d4d889834ee8ecfc0f8426ad30faf7cdcb10f741a8e6d7224d95325479f6f" -dependencies = [ - "digest 0.11.3", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-buffer" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" -dependencies = [ - "hybrid-array", -] - -[[package]] -name = "block-padding" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" -dependencies = [ - "generic-array", -] - -[[package]] -name = "boxed_error" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d4f95e880cfd28c4ca5a006cf7f6af52b4bcb7b5866f573b2faa126fb7affb" -dependencies = [ - "quote", - "syn 2.0.119", -] - -[[package]] -name = "brotli" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" -dependencies = [ - "alloc-no-stdlib 2.0.4", - "alloc-stdlib 0.2.4", - "brotli-decompressor 4.0.3", -] - -[[package]] -name = "brotli" -version = "9.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "627b7cfb0578f0eafce087a90fcd40add1231900b69e4d4de2d456260a4f5d81" -dependencies = [ - "alloc-no-stdlib 3.0.0", - "alloc-stdlib 0.3.0", - "brotli-decompressor 6.3.0", -] - -[[package]] -name = "brotli-decompressor" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a334ef7c9e23abf0ce748e8cd309037da93e606ad52eb372e4ce327a0dcfbdfd" -dependencies = [ - "alloc-no-stdlib 2.0.4", - "alloc-stdlib 0.2.4", -] - -[[package]] -name = "brotli-decompressor" -version = "6.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d9071e5b45944c5a9c06baf13a7a65ffa2c88c204015967852c90869692c05" -dependencies = [ - "alloc-no-stdlib 3.0.0", - "alloc-stdlib 0.3.0", -] - -[[package]] -name = "bumpalo" -version = "3.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" -dependencies = [ - "allocator-api2", -] - -[[package]] -name = "bytes" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" - -[[package]] -name = "bytes-str" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dde6d05e75a31ec9610eb6446a6f0a10dd30ff5100d720fee4c7c7a9008b5ba" -dependencies = [ - "bytes", - "serde", -] - -[[package]] -name = "calendrical_calculations" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5abbd6eeda6885048d357edc66748eea6e0268e3dd11f326fff5bd248d779c26" -dependencies = [ - "core_maths", - "displaydoc", -] - -[[package]] -name = "capacity_builder" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f2d24a6dcf0cd402a21b65d35340f3a49ff3475dc5fdac91d22d2733e6641c6" -dependencies = [ - "capacity_builder_macros", - "itoa", -] - -[[package]] -name = "capacity_builder_macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b4a6cae9efc04cc6cbb8faf338d2c497c165c83e74509cf4dbedea948bbf6e5" -dependencies = [ - "quote", - "syn 2.0.119", -] - -[[package]] -name = "castaway" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" -dependencies = [ - "rustversion", -] - -[[package]] -name = "cbc" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" -dependencies = [ - "cipher", -] - -[[package]] -name = "cc" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ff2a8126fff0f8c839080d619675a585e61720bb12d2baceae45769fd66f155" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex 2.0.1", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[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 = "chrono" -version = "0.4.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" -dependencies = [ - "num-traits", - "serde", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common 0.1.7", - "inout", -] - -[[package]] -name = "clang-sys" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "157a8ba7b480713b56f4c09fd13fc3e0a22a5dfab8097ba61cbc5feef950788a" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "cmake" -version = "0.1.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" -dependencies = [ - "cc", -] - -[[package]] -name = "cmov" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" - -[[package]] -name = "compact_str" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f86b9c4c00838774a6d902ef931eff7470720c51d90c2e32cfe15dc304737b3f" -dependencies = [ - "castaway", - "cfg-if", - "itoa", - "ryu", - "static_assertions", -] - -[[package]] -name = "compression-codecs" -version = "0.4.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84f840cff84d10085260e460023934d0af699e71212b09b2a41452e8bd9cda43" -dependencies = [ - "brotli 9.1.1", - "compression-core", - "flate2", - "memchr", -] - -[[package]] -name = "compression-core" -version = "0.4.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ebdda89edc534bf8d5dd2857562633b6495557e5846552ade994b99ed13c36a" - -[[package]] -name = "const-hex" -version = "1.19.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e59eef12462b0f9b0a3620219be5d639afd79fe39dff0a42c3997061f9298b4" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "proptest", - "serde_core", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "const-oid" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" - -[[package]] -name = "cooked-waker" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147be55d677052dabc6b22252d5dd0fd4c29c8c27aa4f2fbef0f94aa003b406f" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -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_detect" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f8f80099a98041a3d1622845c271458a2d73e688351bf3cb999266764b81d48" - -[[package]] -name = "core_maths" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" -dependencies = [ - "libm", -] - -[[package]] -name = "cpubits" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b85f9c39137c3a891689859392b1bd49812121d0d61c9caf00d46ed5ce06ae" - -[[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.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f97d3416d5337d15c4b0d78c8c91df922ca143f57ec20e2d1c188333047ef04" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "critical-section" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" - -[[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 = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-bigint" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c035cb64cba03dad2fb921f3e218785e8cf9a41790da5eb3a1400f62fa2be11" -dependencies = [ - "cpubits", - "ctutils", - "getrandom 0.4.3", - "hybrid-array", - "num-traits", - "rand_core 0.10.1", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "typenum", -] - -[[package]] -name = "crypto-common" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" -dependencies = [ - "getrandom 0.4.3", - "hybrid-array", - "rand_core 0.10.1", -] - -[[package]] -name = "cssparser" -version = "0.36.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" -dependencies = [ - "cssparser-macros", - "dtoa-short", - "itoa", - "phf 0.13.1", - "smallvec", -] - -[[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 = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher", -] - -[[package]] -name = "ctutils" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261af4dc7a06ea8a527a8717d8cbba3417530d6ea14e1edb3de6b67806be474f" -dependencies = [ - "cmov", - "subtle", -] - -[[package]] -name = "curve25519-dalek" -version = "4.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "curve25519-dalek-derive", - "fiat-crypto", - "rustc_version", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "data-encoding" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" - -[[package]] -name = "data-url" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" - -[[package]] -name = "debugid" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" -dependencies = [ - "serde", - "uuid", -] - -[[package]] -name = "deno_ast" -version = "0.53.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f7c1384d87fc0a6439a065312fbef8f6ac6128689dbc2831b28b3a1d4f3a4e6" -dependencies = [ - "base64", - "capacity_builder", - "deno_error", - "deno_media_type", - "deno_terminal", - "dprint-swc-ext", - "percent-encoding", - "serde", - "swc_atoms", - "swc_common", - "swc_config", - "swc_config_macro", - "swc_ecma_ast", - "swc_ecma_codegen", - "swc_ecma_codegen_macros", - "swc_ecma_lexer", - "swc_ecma_loader", - "swc_ecma_parser", - "swc_ecma_transforms_base", - "swc_ecma_transforms_classes", - "swc_ecma_transforms_macros", - "swc_ecma_transforms_proposal", - "swc_ecma_transforms_react", - "swc_ecma_transforms_typescript", - "swc_ecma_utils", - "swc_ecma_visit", - "swc_eq_ignore_macros", - "swc_macros_common", - "swc_sourcemap", - "swc_visit", - "text_lines", - "thiserror 2.0.21", - "unicode-width", - "url", -] - -[[package]] -name = "deno_core" -version = "0.413.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ad7d5294f640fd99db08c455e2453c9860b1fa728b76fbdacf0eed3e308d48a" -dependencies = [ - "anyhow", - "base64", - "bit-set", - "bit-vec", - "boxed_error", - "bytes", - "cooked-waker", - "deno_error", - "deno_ops", - "deno_path_util", - "deno_unsync", - "deno_v8", - "futures", - "indexmap", - "inventory", - "libc", - "num-bigint", - "parking_lot", - "percent-encoding", - "pin-project", - "serde", - "serde_json", - "serde_v8", - "smallvec", - "sourcemap", - "static_assertions", - "sys_traits", - "thiserror 2.0.21", - "tokio", - "url", - "uuid", - "wasm_dep_analyzer", - "windows-sys 0.59.0", -] - -[[package]] -name = "deno_crypto" -version = "0.274.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef31d2df277d7632c37a87bab384330a8395b8bb988666ff3719c9cf41729640" -dependencies = [ - "aes", - "aes-gcm", - "aes-kw", - "argon2", - "aws-lc-rs", - "base64", - "cbc", - "const-oid 0.9.6", - "ctr", - "curve25519-dalek", - "deno_core", - "deno_crypto_provider", - "deno_error", - "ecdsa", - "elliptic-curve 0.13.8", - "fips203", - "fips205", - "hmac", - "num-traits", - "ocb3", - "once_cell", - "p256", - "p384", - "p521", - "rand 0.8.5", - "rsa", - "serde", - "serde_bytes", - "sha1", - "sha2", - "sha3", - "signature 2.2.0", - "spki 0.7.3", - "subtle", - "thiserror 2.0.21", - "tiny-keccak", - "tokio", - "uuid", - "x25519-dalek", -] - -[[package]] -name = "deno_crypto_provider" -version = "0.54.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d40d7a3f65f5e608523af9c283abfa4f0016457a4a1c798fd220f33aefebeb75" -dependencies = [ - "aws-lc-sys 0.40.0", - "ed448-goldilocks", -] - -[[package]] -name = "deno_error" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfafd2219b29886a71aecbb3449e462deed1b2c474dc5b12f855f0e58c478931" -dependencies = [ - "deno_error_macro", - "libc", - "serde", - "serde_json", - "tokio", - "url", -] - -[[package]] -name = "deno_error_macro" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c28ede88783f14cd8aae46ca89f230c226b40e4a81ab06fa52ed72af84beb2f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "deno_features" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af0a77c0b8c65f0adb9e8017a81dc549de9df514bb7ba6ce4d6645e465573b65" -dependencies = [ - "deno_core", -] - -[[package]] -name = "deno_fetch" -version = "0.284.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "752387783c99f75ea6962bb88af3735baba9f4a9e66716eacd39586db0e28d99" -dependencies = [ - "async-compression", - "base64", - "bytes", - "data-url", - "deno_core", - "deno_error", - "deno_fs", - "deno_io", - "deno_path_util", - "deno_permissions", - "deno_tls", - "error_reporter", - "h2", - "hickory-resolver", - "http", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "ipnet", - "percent-encoding", - "rustls-webpki", - "serde_json", - "thiserror 2.0.21", - "tokio", - "tokio-rustls", - "tokio-socks", - "tokio-util", - "tokio-vsock", - "tower", - "tower-service", -] - -[[package]] -name = "deno_fs" -version = "0.170.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f502b5a662cdc5a9031482ea7c50d7a16c38a65d2053fe3d73c79bd8a9817487" -dependencies = [ - "async-trait", - "boxed_error", - "deno_core", - "deno_error", - "deno_io", - "deno_maybe_sync", - "deno_path_util", - "deno_permissions", - "filetime", - "junction", - "libc", - "nix 0.30.1", - "rand 0.8.5", - "rayon", - "same-file", - "serde", - "thiserror 2.0.21", - "tokio", - "windows-sys 0.59.0", -] - -[[package]] -name = "deno_io" -version = "0.170.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f932d685fb9f8824ab8d001cd7a880966a996ee7f1f210089396080bf9fe7fbf" -dependencies = [ - "async-trait", - "deno_core", - "deno_error", - "deno_permissions", - "deno_subprocess_windows", - "filetime", - "libc", - "log", - "nix 0.30.1", - "os_pipe", - "parking_lot", - "pin-project", - "rand 0.8.5", - "tokio", - "uuid", - "windows-sys 0.59.0", -] - -[[package]] -name = "deno_maybe_sync" -version = "0.47.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736ef832523f957746819704e658f0a73fbb799ce7d2a69a0ad761c255697d7e" -dependencies = [ - "rustc-hash 2.1.3", -] - -[[package]] -name = "deno_media_type" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "debab24ecd9f4fd64aa42fb18a02dff20a97d5830b2b85b98ce70b509f790763" -dependencies = [ - "data-url", - "serde", - "url", -] - -[[package]] -name = "deno_native_certs" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86bc737e098a45aa5742d51ce694ac7236a1e69fb0d9df8c862e9b4c9583c5f9" -dependencies = [ - "dlopen2", - "dlopen2_derive", - "once_cell", - "rustls-native-certs", - "rustls-pemfile", -] - -[[package]] -name = "deno_net" -version = "0.252.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e9f25b320adf4f748464b6b6b42d81159df0ac4a9bc77b4c72af0c687e69e25" -dependencies = [ - "deno_core", - "deno_error", - "deno_features", - "deno_permissions", - "deno_signals", - "deno_tls", - "deno_tunnel", - "hickory-proto", - "hickory-resolver", - "libc", - "log", - "pin-project", - "quinn", - "rustls-tokio-stream", - "serde", - "sha2", - "socket2 0.5.10", - "thiserror 2.0.21", - "tokio", - "tokio-vsock", - "url", - "web-transport-proto", - "x509-parser", -] - -[[package]] -name = "deno_ops" -version = "0.289.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa9d0b78c77e9484b52d356e9a5519e11e0cf5bad56f469f05d7752e89031640" -dependencies = [ - "indexmap", - "proc-macro2", - "quote", - "stringcase", - "strum", - "strum_macros", - "syn 2.0.119", - "syn-match", - "thiserror 2.0.21", -] - -[[package]] -name = "deno_path_util" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c7e98943f0d068928906db0c7bde89de684fa32c6a8018caacc4cee2cdd72b" -dependencies = [ - "deno_error", - "percent-encoding", - "sys_traits", - "thiserror 2.0.21", - "url", -] - -[[package]] -name = "deno_permissions" -version = "0.119.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c90594920e898c112a21f2908e7cb57233c663980f96c27837c0548eb330e065" -dependencies = [ - "capacity_builder", - "chrono", - "deno_error", - "deno_path_util", - "deno_terminal", - "deno_unsync", - "dunce", - "fqdn", - "ipnet", - "libc", - "log", - "nix 0.30.1", - "once_cell", - "parking_lot", - "serde", - "serde_json", - "sys_traits", - "thiserror 2.0.21", - "unicode-normalization", - "url", - "which 8.0.6", - "windows-sys 0.59.0", -] - -[[package]] -name = "deno_signals" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f7f3f33cb9389028d8377822467638505c3b5d5f098b52f03ec265d94513e46" -dependencies = [ - "libc", - "signal-hook", - "thiserror 2.0.21", - "tokio", - "windows-sys 0.59.0", -] - -[[package]] -name = "deno_subprocess_windows" -version = "0.55.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2955b1cfba9d2c2db3712d6939ab54b1d80867c3de0691c2de6071f7c5dd879" -dependencies = [ - "futures-channel", - "libc", - "rand 0.8.5", - "windows-sys 0.59.0", -] - -[[package]] -name = "deno_telemetry" -version = "0.82.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69eaa149e1e638990ff7d8885559d76cf83437290a7bf06e6c408579c95d2954" -dependencies = [ - "async-trait", - "deno_core", - "deno_error", - "deno_net", - "deno_signals", - "deno_terminal", - "deno_tls", - "flate2", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "log", - "once_cell", - "opentelemetry", - "opentelemetry-http", - "opentelemetry-otlp", - "opentelemetry-proto", - "opentelemetry-semantic-conventions", - "opentelemetry_sdk", - "pin-project", - "prost", - "serde", - "sys_traits", - "thiserror 2.0.21", - "tokio", - "tokio-vsock", - "tower-service", -] - -[[package]] -name = "deno_terminal" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3ba8041ae7319b3ca6a64c399df4112badcbbe0868b4517637647614bede4be" -dependencies = [ - "once_cell", - "termcolor", -] - -[[package]] -name = "deno_tls" -version = "0.247.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33b25abb86a9bd6cfaa9a5895a4607e14ccbb4da98ddd387804be6d40a334cd" -dependencies = [ - "deno_core", - "deno_error", - "deno_native_certs", - "log", - "rustls", - "rustls-pemfile", - "rustls-tokio-stream", - "rustls-webpki", - "serde", - "thiserror 2.0.21", - "tokio", - "webpki-roots", -] - -[[package]] -name = "deno_tunnel" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e432929e0c167f2a003b963ee406c714fcd947a87d4f9edc7b3255e87be9881d" -dependencies = [ - "pin-project", - "quinn", - "serde", - "serde_json", - "socket2 0.6.5", - "thiserror 2.0.21", - "tokio", - "tracing", -] - -[[package]] -name = "deno_unsync" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6742a724e8becb372a74c650a1aefb8924a5b8107f7d75b3848763ea24b27a87" -dependencies = [ - "futures-util", - "parking_lot", - "tokio", -] - -[[package]] -name = "deno_v8" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfb3151dcae150420c2fe784928b0dbce8897c6d8bc4bac7b54a5565e06b288" -dependencies = [ - "v8", - "v8x", -] - -[[package]] -name = "deno_web" -version = "0.291.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8658d7955894408e10b53018f651435ca6418b873be2e0b7d98224f3493c20f2" -dependencies = [ - "async-trait", - "brotli 6.0.0", - "bytes", - "cssparser", - "deno_core", - "deno_error", - "encoding_rs", - "flate2", - "futures", - "serde", - "thiserror 2.0.21", - "tokio", - "unicode-normalization", - "urlpattern", - "uuid", -] - -[[package]] -name = "deno_webidl" -version = "0.260.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de03e5cc0901f948592021dc9046b2c5ebe80956014eacd9198d2b05d55ec89" -dependencies = [ - "deno_core", -] - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid 0.9.6", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "der" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a996a108feb8b427a6e12fcf6af4aa83409b79d72c15337d7741368131ee004" -dependencies = [ - "const-oid 0.10.2", - "zeroize", -] - -[[package]] -name = "der-parser" -version = "8.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" -dependencies = [ - "asn1-rs", - "displaydoc", - "nom", - "num-bigint", - "num-traits", - "rusticata-macros", -] - -[[package]] -name = "deranged" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e9de72ce2ad1f90dc62fa25f0f430ef85eb4b0d8fa0be4f30373bc40a21d28e" - -[[package]] -name = "derive-io" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58cc7f4740088458993d183a200fe56e62378736f94bf0e2dd45807407e7bb94" -dependencies = [ - "derive-io-macros", - "tokio", -] - -[[package]] -name = "derive-io-macros" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d0a1bd7eeab72097740967d03d53db5fbaf8e3c0dd471ebdefa43ce445a20a6" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "const-oid 0.9.6", - "crypto-common 0.1.7", - "subtle", -] - -[[package]] -name = "digest" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" -dependencies = [ - "block-buffer 0.12.1", - "crypto-common 0.2.2", - "ctutils", -] - -[[package]] -name = "diplomat" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8b37a6cea72eb6df5143d3e091d4c34cb0cf4046dd1ddcc082988886fe1f809" -dependencies = [ - "diplomat_core", - "proc-macro2", - "quote", - "syn 3.0.9", -] - -[[package]] -name = "diplomat-runtime" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9d981121ba76150987fda68185b37853c0b928a55dfdc28897348cd068440be" - -[[package]] -name = "diplomat_core" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b18e806f9ecb92df828d080efe47984ae1193958295d4a84fb8b32c9a1aa1b" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "smallvec", - "strck", - "syn 3.0.9", -] - -[[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.9", -] - -[[package]] -name = "dlopen2" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" -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 = "dprint-swc-ext" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c78414cb4ed3a037f12e68231fb0c2b49b6f9cd37367d2157616d2ad472ceaaa" -dependencies = [ - "num-bigint", - "rustc-hash 2.1.3", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_ecma_lexer", - "swc_ecma_parser", - "text_lines", -] - -[[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 = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der 0.7.10", - "digest 0.10.7", - "elliptic-curve 0.13.8", - "rfc6979", - "signature 2.2.0", - "spki 0.7.3", -] - -[[package]] -name = "ed448" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae112a25f86ae3598d4e8533ed1e65149cec6eb21918e7a6f4c06dddec370263" -dependencies = [ - "pkcs8 0.11.0", - "signature 3.0.0", -] - -[[package]] -name = "ed448-goldilocks" -version = "0.14.0-pre.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b805154de2e68f59874ec217ca36790dcffe500cd872c60fe509d28d0814a74d" -dependencies = [ - "ed448", - "elliptic-curve 0.14.3", - "hash2curve", - "rand_core 0.10.1", - "serdect 0.4.3", - "shake", - "signature 3.0.0", - "subtle", -] - -[[package]] -name = "either" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be" - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct 0.2.0", - "base64ct", - "crypto-bigint 0.5.5", - "digest 0.10.7", - "ff 0.13.1", - "generic-array", - "group 0.13.0", - "hkdf", - "pem-rfc7468", - "pkcs8 0.10.2", - "rand_core 0.6.4", - "sec1 0.7.3", - "serde_json", - "serdect 0.2.0", - "subtle", - "zeroize", -] - -[[package]] -name = "elliptic-curve" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900f37e7e18d74a2347389af6cd69e3a30d5cc9e697f40004865679aa75e9c7c" -dependencies = [ - "base16ct 1.0.0", - "crypto-bigint 0.7.10", - "crypto-common 0.2.2", - "ff 0.14.0", - "group 0.14.0", - "hybrid-array", - "pkcs8 0.11.0", - "rand_core 0.10.1", - "sec1 0.8.1", - "subtle", - "zeroize", -] - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enum-as-inner" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "equivalent" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826" - -[[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 = "error_reporter" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31ae425815400e5ed474178a7a22e275a9687086a12ca63ec793ff292d8fdae8" - -[[package]] -name = "fallible-iterator" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" - -[[package]] -name = "fallible-streaming-iterator" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" - -[[package]] -name = "fastbloom" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef975e30683b2d965054bb0a836f8973857c4ebf6acf274fe46617cd285060d8" -dependencies = [ - "foldhash", - "libm", - "portable-atomic", - "siphasher 1.0.4", -] - -[[package]] -name = "fastrand" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" - -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "ff" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f686ab92a9fb0eaf188f6c6c87b89490baa6fdb0db4544ba4dc47f7942489f" -dependencies = [ - "rand_core 0.10.1", - "subtle", -] - -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - -[[package]] -name = "filetime" -version = "0.2.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" -dependencies = [ - "cfg-if", - "libc", -] - -[[package]] -name = "find-msvc-tools" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c66915cc5391097de7a2b0b972e8505aa33c0df401fd3a6811dbdb32881ba48" - -[[package]] -name = "fips203" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8bdb6454f692ca2a2b45cd554c6828c639d7f9c968cf83a678899ec4443a280" -dependencies = [ - "rand_core 0.6.4", - "sha3", - "subtle", - "zeroize", -] - -[[package]] -name = "fips205" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f5626bf5534df4ebdbd2536465d7eaa8a9dc2cdeb7e036e0ecf291dcc80ffb6" -dependencies = [ - "rand_core 0.6.4", - "sha2", - "sha3", - "zeroize", -] - -[[package]] -name = "flate2" -version = "1.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626d4928326b646e70f65ed36fc7cf9f206bdb68a0019ee7c6b4709da4e084c4" -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 = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fqdn" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "886ac788f62d16d6b0f26b2fa762b34ef16ebfb4b624c2c15fbcadc9173c0f72" - -[[package]] -name = "from_variant" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ff35a391aef949120a0340d690269b3d9f63460a6106e99bd07b961f345ea9" -dependencies = [ - "swc_macros_common", - "syn 2.0.119", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "fslock" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04412b8935272e3a9bae6f48c7bfff74c2911f60525404edfdd28e49884c3bfb" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[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.9", -] - -[[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 = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[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", - "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 = "ghash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" -dependencies = [ - "opaque-debug", - "polyval", -] - -[[package]] -name = "glob" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff 0.13.1", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "group" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd1a1c7a5206c5b7a3f5a0d7ccd3ff85d0c8f5133d62a02680255b0004af5f4" -dependencies = [ - "ff 0.14.0", - "rand_core 0.10.1", - "subtle", -] - -[[package]] -name = "gzip-header" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86848f4fd157d91041a62c78046fb7b248bcc2dce78376d436a1756e9a038577" -dependencies = [ - "crc32fast", -] - -[[package]] -name = "h2" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d29020232d6aa3fb1daca64c1127cf662cf97f254ae16c18c05b8ab635fc118" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hash2curve" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1eaf40612d7d854743e7189228a6d528f0f6e8502cf6a0cb831d28a218b7f3f6" -dependencies = [ - "digest 0.11.3", - "elliptic-curve 0.14.3", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" -dependencies = [ - "foldhash", -] - -[[package]] -name = "hashbrown" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" - -[[package]] -name = "hashlink" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824e001ac4f3012dd16a264bec811403a67ca9deb6c102fc5049b32c4574b35f" -dependencies = [ - "hashbrown 0.16.1", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" - -[[package]] -name = "hickory-proto" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" -dependencies = [ - "async-trait", - "cfg-if", - "data-encoding", - "enum-as-inner", - "futures-channel", - "futures-io", - "futures-util", - "idna", - "ipnet", - "once_cell", - "rand 0.9.5", - "ring", - "serde", - "thiserror 2.0.21", - "tinyvec", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "hickory-resolver" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" -dependencies = [ - "cfg-if", - "futures-util", - "hickory-proto", - "ipconfig", - "moka", - "once_cell", - "parking_lot", - "rand 0.9.5", - "resolv-conf", - "serde", - "smallvec", - "thiserror 2.0.21", - "tokio", - "tracing", -] - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "home" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "hstr" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bb87e4b300d73412f6dcc7022ee7741452b51b155c2b06e5994d0770c2dbe2" -dependencies = [ - "hashbrown 0.14.5", - "new_debug_unreachable", - "once_cell", - "rustc-hash 2.1.3", - "serde", - "triomphe", -] - -[[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 = "hybrid-array" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27f864f10dfb56725ce5ce5472bc52252c8f93a4ab86327122cebf62c5f59a17" -dependencies = [ - "subtle", - "typenum", - "zeroize", -] - -[[package]] -name = "hyper" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3e324da4c95177d6291d4c8730197c0d1822f8a9766814a4a44fa5ab797c9c" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "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", -] - -[[package]] -name = "hyper-util" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc03d96684f9226b8a787cdb71488417b53ab5ea8fdb1dac946cb9431cc8bff" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "httparse", - "hyper", - "libc", - "pin-project-lite", - "socket2 0.6.5", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "icu_calendar" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68ffb801cc7acb8dcae62da7c692c47934698d2dd4f479ddee1eb442763dea1" -dependencies = [ - "calendrical_calculations", - "displaydoc", - "icu_calendar_data", - "icu_locale_core", - "icu_locale_fallback", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_calendar_data" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514da54e79efa36b5976232d5b3d1d8ee1b47b19ab658f1b1ebe39221696c2d8" - -[[package]] -name = "icu_collections" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe090a42a0d3140fed8c63263ed1fecc02422cb2f4bfe55cd8de2de1b8e105dd" -dependencies = [ - "displaydoc", - "potential_utf", - "utf8_iter", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25d29b57c17c6528d0dc4c2141cfa2d08200465acb537a3909c8b9b8a4a984c0" -dependencies = [ - "displaydoc", - "litemap", - "serde", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locale_fallback" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406e9ae5b95d8aa37db6293405931b766a6172d1848daee22d70eb44aa78a43c" -dependencies = [ - "icu_locale_core", - "icu_locale_fallback_data", - "icu_provider", - "potential_utf", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locale_fallback_data" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3632ebbd0c5c3637ba1a40bdf8288f2cb9d2268e73441a69d5fc73d7cfbaa87c" - -[[package]] -name = "icu_normalizer" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "404a3b8c486f205c87fe7f23ab6894d84a4ad76d6e4671ae1981ba7def87c599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20f0088bfb7441f7a37fa0c9e20cb1e9cba1cac6b9ce8cd2a6dc44294f8e8cbc" - -[[package]] -name = "icu_properties" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ea83d991c56158f7cf898bf86436c1dfe7c07ee82fe88951f2695c9f37a379f" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98f29af82d02b163fe50161388350e743bb3107cc8e8c2f7314cb505faddfcf" - -[[package]] -name = "icu_provider" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413099315636c588ee8f011190b329b971a09a8fae9d157e01dcae8379468514" -dependencies = [ - "displaydoc", - "icu_locale_core", - "serde", - "stable_deref_trait", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[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 = "if_chain" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd62e6b5e86ea8eeeb8db1de02880a6abc01a397b2ebb64b5d74ac255318f5cb" - -[[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", - "serde", - "serde_core", -] - -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "block-padding", - "generic-array", -] - -[[package]] -name = "inventory" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6928282826c822ad91bf1c9a1cb90a30ba1c26770749929b4656cd6be829cd7c" -dependencies = [ - "rustversion", -] - -[[package]] -name = "ipconfig" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d40460c0ce33d6ce4b0630ad68ff63d6661961c48b6dba35e5a4d81cfb48222" -dependencies = [ - "socket2 0.6.5", - "widestring", - "windows-registry", - "windows-result", - "windows-sys 0.61.2", -] - -[[package]] -name = "ipnet" -version = "2.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0" - -[[package]] -name = "is-macro" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8267aa6001e25494f3015f9663bbd88a18240c74483afa5f0934a1b3e4c388e9" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" - -[[package]] -name = "ixdtf" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4754a1731458af0443709c9667302793d3f63cc90ec4ba4c8259f2b9515478e5" - -[[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.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dc09d2154098bbf4ef54eab6b117a3c24cbbffe94046b16ee6d6d4510584d3a" -dependencies = [ - "cfg-if", - "futures-util", - "wasm-bindgen", -] - -[[package]] -name = "junction" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72bbdfd737a243da3dfc1f99ee8d6e166480f17ab4ac84d7c34aacd73fc7bd16" -dependencies = [ - "scopeguard", - "windows-sys 0.52.0", -] - -[[package]] -name = "keccak" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" -dependencies = [ - "cpufeatures 0.2.17", -] - -[[package]] -name = "keccak" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8f198d1db720e4940b5a493201d199d9f24f568f8f746bd13706243a2f71598" -dependencies = [ - "cfg-if", - "cpufeatures 0.3.1", -] - -[[package]] -name = "lazy_static" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb" -dependencies = [ - "spin", -] - -[[package]] -name = "libc" -version = "0.2.191" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" - -[[package]] -name = "libloading" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" -dependencies = [ - "cfg-if", - "windows-link", -] - -[[package]] -name = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - -[[package]] -name = "libsqlite3-sys" -version = "0.36.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b4103cffefa72eb8428cb6b47d6627161e51c2739fc5e3b734584157bc642a" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "litemap" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" - -[[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.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d15f86d12da44cd8d4ec3c73984537eb7f4cadcb9776a575a0a8a05ca11005c" - -[[package]] -name = "lru-slab" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4050469837a6ff301cd14c1f8f24f88549e6d548f24f64e2148eb0f72cebc51f" - -[[package]] -name = "memchr" -version = "2.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", -] - -[[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.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.61.2", -] - -[[package]] -name = "moka" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4293f18e7567a1caf3c584855554377025c65e0aa445344d04171f5ad63d19b9" -dependencies = [ - "crossbeam-channel", - "crossbeam-epoch", - "crossbeam-utils", - "equivalent", - "parking_lot", - "portable-atomic", - "smallvec", - "tagptr", - "uuid", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - -[[package]] -name = "nix" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" -dependencies = [ - "bitflags", - "cfg-if", - "cfg_aliases", - "libc", - "memoffset", -] - -[[package]] -name = "nix" -version = "0.31.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" -dependencies = [ - "bitflags", - "cfg-if", - "cfg_aliases", - "libc", - "memoffset", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[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", - "serde", -] - -[[package]] -name = "num-bigint-dig" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" -dependencies = [ - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand 0.8.5", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-conv" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" - -[[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-iter" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" -dependencies = [ - "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", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.39.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5a6c098c7a3b6547378093f5cc30bc54fd361ce711e05293a5cc589562739b" -dependencies = [ - "memchr", -] - -[[package]] -name = "ocb3" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c196e0276c471c843dd5777e7543a36a298a4be942a2a688d8111cd43390dedb" -dependencies = [ - "aead", - "cipher", - "ctr", - "subtle", -] - -[[package]] -name = "oid-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" -dependencies = [ - "asn1-rs", -] - -[[package]] -name = "once_cell" -version = "1.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" -dependencies = [ - "critical-section", - "portable-atomic", -] - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "opentelemetry" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0142c63252a9e054e68a4c61a5778f7b14f576274d593f8ce883d191a099682" -dependencies = [ - "futures-core", - "futures-sink", - "js-sys", - "pin-project-lite", - "thiserror 2.0.21", - "tracing", -] - -[[package]] -name = "opentelemetry-http" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5683015d09e2df236ef005b17f6f196f0d5f6313c4fa43a7b6a53b52776e4331" -dependencies = [ - "async-trait", - "bytes", - "http", - "opentelemetry", -] - -[[package]] -name = "opentelemetry-otlp" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9966929966d17620d7c316c643ba62631826e10021409357772d5eea84f62c35" -dependencies = [ - "http", - "opentelemetry", - "opentelemetry-http", - "opentelemetry-proto", - "opentelemetry_sdk", - "prost", - "serde_json", - "thiserror 2.0.21", -] - -[[package]] -name = "opentelemetry-proto" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56d658ba1faf63f7b9c492cfbe6e0ec365440a16132d3270c1065f7b33f1b638" -dependencies = [ - "base64", - "const-hex", - "opentelemetry", - "opentelemetry_sdk", - "prost", - "serde", -] - -[[package]] -name = "opentelemetry-semantic-conventions" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c913ac17a6c451661ee255f4625d143e51647ae78ebd969b75e41c4442f4fe47" - -[[package]] -name = "opentelemetry_sdk" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b59f80e1ac4d5ff7a2db8fb6c80badb7f0f3f858211fba08dd9aaec750894f9" -dependencies = [ - "futures-channel", - "futures-executor", - "futures-util", - "opentelemetry", - "percent-encoding", - "portable-atomic", - "rand 0.9.5", - "thiserror 2.0.21", - "tokio", - "tokio-stream", -] - -[[package]] -name = "os_pipe" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "outref" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" - -[[package]] -name = "p256" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" -dependencies = [ - "ecdsa", - "elliptic-curve 0.13.8", - "primeorder", - "sha2", -] - -[[package]] -name = "p384" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" -dependencies = [ - "ecdsa", - "elliptic-curve 0.13.8", - "primeorder", - "sha2", -] - -[[package]] -name = "p521" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc9e2161f1f215afdfce23677034ae137bbd45016a880c2eb3ba8eb95f085b2" -dependencies = [ - "base16ct 0.2.0", - "ecdsa", - "elliptic-curve 0.13.8", - "primeorder", - "rand_core 0.6.4", - "sha2", -] - -[[package]] -name = "par-core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96cbd21255b7fb29a5d51ef38a779b517a91abd59e2756c039583f43ef4c90f" -dependencies = [ - "once_cell", -] - -[[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 = "password-hash" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aab41826031698d6ffcd9cff78ef56ef998e39dc7e5067cdfebe373842d4723b" -dependencies = [ - "phc", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pathdiff" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "phc" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44dc769b75f93afdddd8c7fa12d685292ddeff1e66f7f0f3a234cf1818afe892" -dependencies = [ - "base64ct", - "ctutils", -] - -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_macros 0.11.3", - "phf_shared 0.11.3", -] - -[[package]] -name = "phf" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" -dependencies = [ - "phf_macros 0.13.1", - "phf_shared 0.13.1", - "serde", -] - -[[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.5", -] - -[[package]] -name = "phf_generator" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" -dependencies = [ - "fastrand", - "phf_shared 0.13.1", -] - -[[package]] -name = "phf_macros" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" -dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "phf_macros" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" -dependencies = [ - "phf_generator 0.13.1", - "phf_shared 0.13.1", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher 1.0.4", -] - -[[package]] -name = "phf_shared" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" -dependencies = [ - "siphasher 1.0.4", -] - -[[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 = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der 0.7.10", - "pkcs8 0.10.2", - "spki 0.7.3", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der 0.7.10", - "spki 0.7.3", -] - -[[package]] -name = "pkcs8" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7" -dependencies = [ - "der 0.8.3", - "spki 0.8.1", -] - -[[package]] -name = "pkg-config" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" - -[[package]] -name = "polyval" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "opaque-debug", - "universal-hash", -] - -[[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 = [ - "serde_core", - "writeable", - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a6394b9e965e73d0a289ee54f589087e2c676aedf60885baf52c76b771e4958" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn 2.0.119", -] - -[[package]] -name = "primeorder" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" -dependencies = [ - "elliptic-curve 0.13.8", -] - -[[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 = "proptest" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8530004ccb15eae51c7e40009fbe317f341f804db54dc033eec1c50be28cfa0" -dependencies = [ - "bitflags", - "chacha20", - "core_detect", - "num-traits", - "rand 0.10.3", - "rand_xorshift", - "regex-syntax", - "unarray", -] - -[[package]] -name = "prost" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-derive" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" -dependencies = [ - "anyhow", - "itertools", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "psm" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd034599e63b970727f70d79e02d62390a4a84f7c6b827c27c46d5ac3fa622" -dependencies = [ - "ar_archive_writer", - "cc", -] - -[[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 0.6.5", - "thiserror 2.0.21", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e750cca55fe4f0439a15d0bb529da9651e79993e8e72c61a899a36d462befbe" -dependencies = [ - "aws-lc-rs", - "bytes", - "fastbloom", - "getrandom 0.4.3", - "lru-slab", - "rand 0.10.3", - "rand_pcg", - "ring", - "rustc-hash 2.1.3", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.21", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af66907df18639dcf4db56ca65490cabc4b27a97dbadd96f2926cca73298f016" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2 0.6.5", - "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 = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -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.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.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_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 = "rand_xorshift" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60aa6af80be32871323012e02e6e65f8a7cc7890931ae421d217ad8fe0df2ccf" -dependencies = [ - "rand_core 0.10.1", -] - -[[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 = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags", -] - -[[package]] -name = "regex" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" - -[[package]] -name = "resb" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22d392791f3c6802a1905a509e9d1a6039cbbcb5e9e00e5a6d3661f7c874f390" -dependencies = [ - "potential_utf", - "serde_core", -] - -[[package]] -name = "resolv-conf" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[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 0.9.0", - "windows-sys 0.52.0", -] - -[[package]] -name = "rsa" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" -dependencies = [ - "const-oid 0.9.6", - "digest 0.10.7", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8 0.10.2", - "rand_core 0.6.4", - "signature 2.2.0", - "spki 0.7.3", - "subtle", - "zeroize", -] - -[[package]] -name = "rsqlite-vfs" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51c9ae4df8a7fba42103df5c621fa3c37eccf3a3c650879e90fc48b11cc192c" -dependencies = [ - "hashbrown 0.16.1", - "thiserror 2.0.21", -] - -[[package]] -name = "rusqlite" -version = "0.38.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1c93dd1c9683b438c392c492109cb702b8090b2bfc8fed6f6e4eb4523f17af3" -dependencies = [ - "bitflags", - "fallible-iterator", - "fallible-streaming-iterator", - "hashlink", - "libsqlite3-sys", - "smallvec", - "sqlite-wasm-rs", -] - -[[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 = "rusticata-macros" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" -dependencies = [ - "nom", -] - -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustls" -version = "0.23.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" -dependencies = [ - "aws-lc-rs", - "log", - "once_cell", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" -dependencies = [ - "openssl-probe", - "rustls-pemfile", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[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-tokio-stream" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0560d12c0d8c672f849197de91b9ee61f5bf9aa024c97aaeeb112ec2f6c347fd" -dependencies = [ - "derive-io", - "futures", - "rustls", - "socket2 0.5.10", - "tokio", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443b1b6d39d7c663139942cc4558262562d2c84123bb6282ef177009ca8b281" -dependencies = [ - "aws-lc-rs", - "ring", - "rustls-pki-types", - "untrusted 0.9.0", -] - -[[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 = "ryu-js" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04d056b875a9d2e6cb9a61d127afee9ac5999b9f87bcb32079d1318e505be714" - -[[package]] -name = "s1-v8-harness" -version = "0.1.0" -dependencies = [ - "deno_ast", - "deno_core", - "deno_crypto", - "deno_error", - "deno_fetch", - "deno_net", - "deno_permissions", - "deno_telemetry", - "deno_web", - "deno_webidl", - "rusqlite", - "serde_json", - "sys_traits", - "tokio", -] - -[[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.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cb23c424d8ee841bb4d813677ca237e2a610067d594fec130f87d6093495ab5" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct 0.2.0", - "der 0.7.10", - "generic-array", - "pkcs8 0.10.2", - "serdect 0.2.0", - "subtle", - "zeroize", -] - -[[package]] -name = "sec1" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56d437c2f19203ce5f7122e507831de96f3d2d4d3be5af44a0b0a09d8a80e4d" -dependencies = [ - "base16ct 1.0.0", - "ctutils", - "der 0.8.3", - "hybrid-array", - "subtle", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags", - "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 = "semver" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" - -[[package]] -name = "seq-macro" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" - -[[package]] -name = "serde" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_bytes" -version = "0.11.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" -dependencies = [ - "serde", - "serde_core", -] - -[[package]] -name = "serde_core" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", -] - -[[package]] -name = "serde_json" -version = "1.0.154" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" -dependencies = [ - "foldhash", - "indexmap", - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "serde_v8" -version = "0.322.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6973c29f2c5cc313d6f5fbed7fbfc7e5c4064d6f3f8bb8ec09838a5a8176b809" -dependencies = [ - "deno_error", - "deno_v8", - "num-bigint", - "serde", - "smallvec", - "thiserror 2.0.21", -] - -[[package]] -name = "serdect" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" -dependencies = [ - "base16ct 0.2.0", - "serde", -] - -[[package]] -name = "serdect" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66cf8fedced2fcf12406bcb34223dffb92eaf34908ede12fed414c82b7f00b3e" -dependencies = [ - "base16ct 1.0.0", - "serde", -] - -[[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 0.10.7", -] - -[[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 0.10.7", -] - -[[package]] -name = "sha3" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" -dependencies = [ - "digest 0.10.7", - "keccak 0.1.6", -] - -[[package]] -name = "shake" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09057cb2149ad4cbd2da1e26b351f9a4c354219421229c69c3063e6f61947c4a" -dependencies = [ - "digest 0.11.3", - "keccak 0.2.2", - "sponge-cursor", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[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-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "signature" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d567dcbaf0049cb8ac2608a76cd95ff9e4412e1899d389ee400918ca7537f5" -dependencies = [ - "digest 0.11.3", - "rand_core 0.10.1", -] - -[[package]] -name = "simd-adler32" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" - -[[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.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "smallvec" -version = "1.16.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0d5d4b1981b8bbbb7aed204cae5726d683d5d6ac7e74ec54122ea28f315e7c8" - -[[package]] -name = "smartstring" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" -dependencies = [ - "autocfg", - "static_assertions", - "version_check", -] - -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[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 = "sourcemap" -version = "9.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "314d62a489431668f719ada776ca1d49b924db951b7450f8974c9ae51ab05ad7" -dependencies = [ - "base64-simd", - "bitvec", - "data-encoding", - "debugid", - "if_chain", - "rustc-hash 2.1.3", - "serde", - "serde_json", - "unicode-id-start", - "url", -] - -[[package]] -name = "spin" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der 0.7.10", -] - -[[package]] -name = "spki" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef958a98b9d5da290cfc78946e9f3e61e1e62a18db0d92cac0b83cc161491a9" -dependencies = [ - "base64ct", - "der 0.8.3", -] - -[[package]] -name = "sponge-cursor" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a0219bd7d979d58245a4f41f695e1ac9f8befdffadd7f61f1bae9e39abc6620" - -[[package]] -name = "sqlite-wasm-rs" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc3efc0da82635d7e1ced0053bbbfa8c7ab9645d0bf36ceb4f7127bb85315d75" -dependencies = [ - "cc", - "js-sys", - "rsqlite-vfs", - "wasm-bindgen", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "stacker" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707f49d46706bacf8a2b00d51dace3f9de527c13eec3778f570c411f89e69967" -dependencies = [ - "cc", - "cfg-if", - "libc", - "psm", - "windows-sys 0.61.2", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strck" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42316e70da376f3d113a68d138a60d8a9883c604fe97942721ec2068dab13a9f" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "string_enum" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae36a4951ca7bd1cfd991c241584a9824a70f6aff1e7d4f693fb3f2465e4030e" -dependencies = [ - "quote", - "swc_macros_common", - "syn 2.0.119", -] - -[[package]] -name = "stringcase" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72abeda133c49d7bddece6c154728f83eec8172380c80ab7096da9487e20d27c" - -[[package]] -name = "strum" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "swc_allocator" -version = "4.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d7eefd2c8b228a8c73056482b2ae4b3a1071fbe07638e3b55ceca8570cc48bb" -dependencies = [ - "allocator-api2", - "bumpalo", - "hashbrown 0.14.5", - "rustc-hash 2.1.3", -] - -[[package]] -name = "swc_atoms" -version = "9.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4ccbe2ecad10ad7432100f878a107b1d972a8aee83ca53184d00c23a078bb8a" -dependencies = [ - "hstr", - "once_cell", - "serde", -] - -[[package]] -name = "swc_common" -version = "17.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "259b675d633a26d24efe3802a9d88858c918e6e8f062d3222d3aa02d56a2cf4c" -dependencies = [ - "anyhow", - "ast_node", - "better_scoped_tls", - "bytes-str", - "either", - "from_variant", - "new_debug_unreachable", - "num-bigint", - "once_cell", - "rustc-hash 2.1.3", - "serde", - "siphasher 0.3.11", - "swc_atoms", - "swc_eq_ignore_macros", - "swc_sourcemap", - "swc_visit", - "tracing", - "unicode-width", - "url", -] - -[[package]] -name = "swc_config" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e90b52ee734ded867104612218101722ad87ff4cf74fe30383bd244a533f97" -dependencies = [ - "anyhow", - "bytes-str", - "indexmap", - "serde", - "serde_json", - "swc_config_macro", -] - -[[package]] -name = "swc_config_macro" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b416e8ce6de17dc5ea496e10c7012b35bbc0e3fef38d2e065eed936490db0b3" -dependencies = [ - "proc-macro2", - "quote", - "swc_macros_common", - "syn 2.0.119", -] - -[[package]] -name = "swc_ecma_ast" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a573a0c72850dec8d4d8085f152d5778af35a2520c3093b242d2d1d50776da7c" -dependencies = [ - "bitflags", - "is-macro", - "num-bigint", - "once_cell", - "phf 0.11.3", - "rustc-hash 2.1.3", - "serde", - "string_enum", - "swc_atoms", - "swc_common", - "swc_visit", - "unicode-id-start", -] - -[[package]] -name = "swc_ecma_codegen" -version = "20.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2a6ee1ec49dda8dedeac54e4147b4e8b3f278d9bb34ab28983257a393d34ed" -dependencies = [ - "ascii", - "compact_str", - "memchr", - "num-bigint", - "once_cell", - "regex", - "rustc-hash 2.1.3", - "ryu-js", - "serde", - "swc_allocator", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_ecma_codegen_macros", - "swc_sourcemap", - "tracing", -] - -[[package]] -name = "swc_ecma_codegen_macros" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e276dc62c0a2625a560397827989c82a93fd545fcf6f7faec0935a82cc4ddbb8" -dependencies = [ - "proc-macro2", - "swc_macros_common", - "syn 2.0.119", -] - -[[package]] -name = "swc_ecma_lexer" -version = "26.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e82f7747e052c6ff6e111fa4adeb14e33b46ee6e94fe5ef717601f651db48fc" -dependencies = [ - "bitflags", - "either", - "num-bigint", - "rustc-hash 2.1.3", - "seq-macro", - "serde", - "smallvec", - "smartstring", - "stacker", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_ecma_parser", - "tracing", -] - -[[package]] -name = "swc_ecma_loader" -version = "17.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbcababb48f0d46587a0a854b2c577eb3a56fa99687de558338021e93cd2c8f5" -dependencies = [ - "anyhow", - "pathdiff", - "rustc-hash 2.1.3", - "serde", - "swc_atoms", - "swc_common", - "tracing", -] - -[[package]] -name = "swc_ecma_parser" -version = "27.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f1a51af1a92cd4904c073b293e491bbc0918400a45d58227b34c961dd6f52d7" -dependencies = [ - "bitflags", - "either", - "num-bigint", - "phf 0.11.3", - "rustc-hash 2.1.3", - "seq-macro", - "serde", - "smartstring", - "stacker", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "tracing", -] - -[[package]] -name = "swc_ecma_transforms_base" -version = "30.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250f6f165578ca4fee47bd57585c1b9597c94bf4ea6591df47f2b5fa5b1883fe" -dependencies = [ - "better_scoped_tls", - "indexmap", - "once_cell", - "par-core", - "phf 0.11.3", - "rustc-hash 2.1.3", - "serde", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_ecma_parser", - "swc_ecma_utils", - "swc_ecma_visit", - "tracing", -] - -[[package]] -name = "swc_ecma_transforms_classes" -version = "30.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3ab35eff4a980e02d708798ae4c35bc017612292adbffe7b7b554df772fdf5" -dependencies = [ - "swc_common", - "swc_ecma_ast", - "swc_ecma_transforms_base", - "swc_ecma_utils", - "swc_ecma_visit", -] - -[[package]] -name = "swc_ecma_transforms_macros" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc777288799bf6786e5200325a56e4fbabba590264a4a48a0c70b16ad0cf5cd8" -dependencies = [ - "proc-macro2", - "quote", - "swc_macros_common", - "syn 2.0.119", -] - -[[package]] -name = "swc_ecma_transforms_proposal" -version = "30.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2d7748d4112c87ce1885260035e4a43cebfe7661a40174b7d77a0a04760a257" -dependencies = [ - "either", - "rustc-hash 2.1.3", - "serde", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_ecma_transforms_base", - "swc_ecma_transforms_classes", - "swc_ecma_utils", - "swc_ecma_visit", -] - -[[package]] -name = "swc_ecma_transforms_react" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03de12e38e47ac1c96ac576f793ad37a9d7b16fbf4f2203881f89152f2498682" -dependencies = [ - "base64", - "bytes-str", - "indexmap", - "once_cell", - "rustc-hash 2.1.3", - "serde", - "sha1", - "string_enum", - "swc_atoms", - "swc_common", - "swc_config", - "swc_ecma_ast", - "swc_ecma_parser", - "swc_ecma_transforms_base", - "swc_ecma_utils", - "swc_ecma_visit", -] - -[[package]] -name = "swc_ecma_transforms_typescript" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4408800fdeb541fabf3659db622189a0aeb386f57b6103f9294ff19dfde4f7b0" -dependencies = [ - "bytes-str", - "rustc-hash 2.1.3", - "serde", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_ecma_transforms_base", - "swc_ecma_transforms_react", - "swc_ecma_utils", - "swc_ecma_visit", -] - -[[package]] -name = "swc_ecma_utils" -version = "24.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fb99e179988cabd473779a4452ab942bcb777176983ca3cbaf22a8f056a65b0" -dependencies = [ - "indexmap", - "num_cpus", - "once_cell", - "par-core", - "rustc-hash 2.1.3", - "ryu-js", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_ecma_visit", - "tracing", -] - -[[package]] -name = "swc_ecma_visit" -version = "18.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9611a72a4008d62608547a394e5d72a5245413104db096d95a52368a8cc1d63" -dependencies = [ - "new_debug_unreachable", - "num-bigint", - "swc_atoms", - "swc_common", - "swc_ecma_ast", - "swc_visit", - "tracing", -] - -[[package]] -name = "swc_eq_ignore_macros" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c16ce73424a6316e95e09065ba6a207eba7765496fed113702278b7711d4b632" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "swc_macros_common" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aae1efbaa74943dc5ad2a2fb16cbd78b77d7e4d63188f3c5b4df2b4dcd2faaae" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "swc_sourcemap" -version = "9.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de08ef00f816acdd1a58ee8a81c0e1a59eefef2093aefe5611f256fa6b64c4d7" -dependencies = [ - "base64-simd", - "bitvec", - "bytes-str", - "data-encoding", - "debugid", - "if_chain", - "rustc-hash 2.1.3", - "serde", - "serde_json", - "unicode-id-start", - "url", -] - -[[package]] -name = "swc_visit" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62fb71484b486c185e34d2172f0eabe7f4722742aad700f426a494bb2de232a2" -dependencies = [ - "either", - "new_debug_unreachable", -] - -[[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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn-match" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b8f0a9004d6aafa6a588602a1119e6cdaacec9921aa1605383e6e7d6258fd6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" - -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "unicode-xid", -] - -[[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.9", -] - -[[package]] -name = "sys_traits" -version = "0.1.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a35f11f9773f11930a7d1e6276766f1577400ee2530b7f0cf3844c2dcbf12b" -dependencies = [ - "libc", - "sys_traits_macros", -] - -[[package]] -name = "sys_traits_macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "181f22127402abcf8ee5c83ccd5b408933fec36a6095cf82cda545634692657e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "tagptr" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "temporal_capi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f48eb9ca4ca22caaa48d1e7a534ad3fd598a23d1a71945e8ad5ac0be501fa5f2" -dependencies = [ - "diplomat", - "diplomat-runtime", - "icu_calendar", - "icu_locale_core", - "num-traits", - "temporal_rs", - "timezone_provider", - "writeable", - "zoneinfo64", -] - -[[package]] -name = "temporal_rs" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a978fef907a27736827d336c0bfaab14fb8a7509dd6dc2b43c44e51d59aca5b" -dependencies = [ - "calendrical_calculations", - "core_maths", - "icu_calendar", - "icu_locale_core", - "ixdtf", - "num-traits", - "timezone_provider", - "tinystr", - "writeable", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "text_lines" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd5828de7deaa782e1dd713006ae96b3bee32d3279b79eb67ecf8072c059bcf" -dependencies = [ - "serde", -] - -[[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.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" -dependencies = [ - "thiserror-impl 2.0.21", -] - -[[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.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", -] - -[[package]] -name = "time" -version = "0.3.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" -dependencies = [ - "deranged", - "num-conv", - "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 = "timezone_provider" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ec4f4eebb4817fde02a411aedc7ac5f66c89c68c49e5d4b17a8139f077af52" -dependencies = [ - "tinystr", - "zerotrie", - "zerovec", - "zoneinfo64", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinystr" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abc840c238154d58f9e86b2792261edfde565a17696e1cda1a449de27979801a" -dependencies = [ - "displaydoc", - "serde_core", - "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.54.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b52fd3255258d26fac7264ab5a76b53c13367136dc011d3d6ad4f8ed070396a3" -dependencies = [ - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2 0.6.5", - "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.9", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9cc2678c2cdd569ef8215e2afd7954ada2ae20b4fdd2c5fe6139a3b02d105db" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-socks" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7e2948f60dbe26b35f2c7fb74ac2854c1fddded0fe9d7548fcc674a246f7615" -dependencies = [ - "either", - "futures-util", - "thiserror 1.0.69", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e464cf451ba96ebfc6f9b6542f17ee8b8956e33f1e40d9690624e59d7a7f8a4b" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "libc", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-vsock" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "676ade3d183052ca2703288b48f63a2e82633a24836ca279eb6724ab2a97b05d" -dependencies = [ - "bytes", - "futures", - "libc", - "tokio", - "vsock", -] - -[[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-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 = [ - "log", - "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 = "triomphe" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d15f4f5898bcfc5d8a8e45ed30b2f108d710c1a2e5489dbf80e078f707181bc" -dependencies = [ - "serde", - "stable_deref_trait", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "typenum" -version = "1.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicode-id-start" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0825d2e09dcae814a4273c1e1435979d414ede25b2ee235b1545da6682483765" - -[[package]] -name = "unicode-ident" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" - -[[package]] -name = "unicode-normalization" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75cd3fb03d5288b3ba9a1ee103ac7e9cbb59f0b03d64f8ddfcc04dd42758a85d" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-width" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca718471876992059f251e33aafc334346ada08042b7661dd1fe313a9bced557" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "universal-hash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" -dependencies = [ - "crypto-common 0.1.7", - "subtle", -] - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[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", - "serde_derive", -] - -[[package]] -name = "urlpattern" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f805818f843b548bacc19609eb3619dd2850e54746f5cada37927393c2ef4ec" -dependencies = [ - "icu_properties", - "regex", - "serde", - "url", -] - -[[package]] -name = "utf8_iter" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af3bd9d3e571c26fcce9d033b87ea5ab061b8d2ffe9b7a5675d810d68f03edf0" -dependencies = [ - "utf_types", -] - -[[package]] -name = "utf_types" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3b425286980a367278453f3b6d28cdcb134b574e5a35824a6ff5eebad50bb6" - -[[package]] -name = "uuid" -version = "1.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0e2d11620c50695fe12bbbfde96b3477fe606e7284c22d505c12ce51214514" -dependencies = [ - "getrandom 0.4.3", - "js-sys", - "serde_core", - "wasm-bindgen", -] - -[[package]] -name = "v8" -version = "150.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42a978ff11f15b24e5c05a7123cf2b68f41e763546699781a924ef4e2cf43a49" -dependencies = [ - "bindgen 0.72.1", - "bitflags", - "fslock", - "gzip-header", - "home", - "miniz_oxide 0.8.9", - "paste", - "temporal_capi", - "which 6.0.3", -] - -[[package]] -name = "v8x" -version = "149.4.0-rc.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3701ffb3692a24808503d17f758b0a3f688d2c451779247982566b5941033e63" -dependencies = [ - "bindgen 0.70.1", - "bitflags", - "cc", - "paste", - "temporal_capi", - "temporal_rs", - "timezone_provider", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "vsimd" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" - -[[package]] -name = "vsock" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7d4dba01e366e2ffbdf0700b1876f747c548db72dced534de41c54945c0148" -dependencies = [ - "libc", - "nix 0.31.3", -] - -[[package]] -name = "want" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec4cdd0dd910afe868b7ef477227d8d538b46b3075031afee8a9f2acb0a2ed0b" -dependencies = [ - "try-lock", -] - -[[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.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0181c14ddd6c7b8b0b0132a5f1ea2f32be0d893cd3ea97b6e3b28886b8a3d1c" -dependencies = [ - "cfg-if", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e931a02a39abdbf66966fc35902b5ed58344750a70885bed4ebb3d8eaf28ed9" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca4b54280e455bd831e33a6b8e734baf432fe63fbc35c42ac14ce67a043a53a" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 3.0.9", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b1f9c3798725016c6ee5f2f57869ec0831e8bbc0ab0310a86e787e97f41389e" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm_dep_analyzer" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a10e6b67c951a84de7029487e0e0a496860dae49f6699edd279d5ff35b8fbf54" -dependencies = [ - "deno_error", - "thiserror 2.0.21", -] - -[[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 = "web-transport-proto" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "974fa1e325e6cc5327de8887f189a441fcff4f8eedcd31ec87f0ef0cc5283fbc" -dependencies = [ - "bytes", - "http", - "thiserror 2.0.21", - "url", -] - -[[package]] -name = "webpki-roots" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5f280bbb2b287bc8e7de7e3852945a0ff50d1bbcb5ed42b6c7a568c546df171" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "which" -version = "6.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ee928febd44d98f2f459a4a79bd4d928591333a494a10a868418ac1b39cf1f" -dependencies = [ - "either", - "home", - "rustix", - "winsafe", -] - -[[package]] -name = "which" -version = "8.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bae2f2b2b816647a1cab1acc91f5bd20812d53cb344382635ec2181940c8034f" - -[[package]] -name = "widestring" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" - -[[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-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" -dependencies = [ - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[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_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winsafe" -version = "0.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "x25519-dalek" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" -dependencies = [ - "curve25519-dalek", - "rand_core 0.6.4", - "serde", - "zeroize", -] - -[[package]] -name = "x509-parser" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7069fba5b66b9193bd2c5d3d4ff12b839118f6bcbef5328efafafb5395cf63da" -dependencies = [ - "asn1-rs", - "data-encoding", - "der-parser", - "lazy_static", - "nom", - "oid-registry", - "rusticata-macros", - "thiserror 1.0.69", - "time", -] - -[[package]] -name = "yoke" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "417ef3fcf6c300b7dbd25c85531a746931c02ad536f3cf4786ed1e88223340b3" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", - "synstructure 0.14.0", -] - -[[package]] -name = "zerocopy" -version = "0.8.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5fe1f8f1b06191a00962174c61aa5005e0bb391a6d80d07e24d115c01a92ed8" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "863ad3ac83293fb4d740aedbfdc9240dd8d1a50c1099acd76ce80ce7c7230c7f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "zerofrom" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", - "synstructure 0.14.0", -] - -[[package]] -name = "zeroize" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13084392c5e4bc371903e2935a5eaeed24905a7511356b883835e18a78f6879" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "zerotrie" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "zerovec" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58a2799cfe9a1670c7ea8edbd52ef8edb93cb37a7f83bf31ba9e35d9dae6a40" -dependencies = [ - "serde", - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3743ddbf47738d929cd1ae2e199d40d0162979dfe31aef8ae646d2bf00bf97a" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", -] - -[[package]] -name = "zlib-rs" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" - -[[package]] -name = "zmij" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" - -[[package]] -name = "zoneinfo64" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed6eb2607e906160c457fd573e9297e65029669906b9ac8fb1b5cd5e055f0705" -dependencies = [ - "calendrical_calculations", - "icu_locale_core", - "potential_utf", - "resb", - "serde", -] diff --git a/spikes/s1-v8-harness/Cargo.toml b/spikes/s1-v8-harness/Cargo.toml deleted file mode 100644 index 3871039..0000000 --- a/spikes/s1-v8-harness/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "s1-v8-harness" -version = "0.1.0" -edition = "2024" - -[workspace] - -[dependencies] -deno_core = "=0.413.0" -deno_web = "=0.291.0" -deno_webidl = "=0.260.0" -deno_crypto = "=0.274.0" -deno_fetch = "=0.284.0" -deno_net = "=0.252.0" -deno_telemetry = "=0.82.0" -deno_ast = { version = "=0.53.3", features = ["transpiling"] } -deno_permissions = "=0.119.0" -deno_error = "=0.7.1" -rusqlite = { version = "0.38", features = ["bundled"] } -serde_json = "1" -sys_traits = { version = "0.1", features = ["real", "libc"] } -tokio = { version = "1", features = ["full"] } diff --git a/spikes/s1-v8-harness/README.md b/spikes/s1-v8-harness/README.md deleted file mode 100644 index ca543f1..0000000 --- a/spikes/s1-v8-harness/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# S1: V8 harness - -This spike runs pi-durable examples 21 and 23 in Rust through deno_core. -Rust owns the SQLite file. The portable adapter queues transactions and calls rusqlite through a Rust op. -The JavaScript uses Deno's Web API crates, not Node. - -The sources adapt the upstream examples at: -https://github.com/earendil-works/pi/tree/main/packages/durable/test/examples - -Install and bundle: - -```sh -npm install --prefix /tmp/s1-v8-harness @earendil-works/pi-durable@1.5.0 @earendil-works/pi-ai@1.5.0 @earendil-works/chord@1.5.0 esbuild@0.28.2 -NODE_PATH=/tmp/s1-v8-harness/node_modules /tmp/s1-v8-harness/node_modules/.bin/esbuild spikes/s1-v8-harness/21.ts spikes/s1-v8-harness/23.ts spikes/s1-v8-harness/real.ts --bundle --format=esm --platform=browser --outdir=/tmp/s1-v8-harness/bundles -nix develop -c cargo build --manifest-path spikes/s1-v8-harness/Cargo.toml -j 2 -``` - -Run all three cases with `nu spikes/s1-v8-harness/verify.nu`. -The real call requires `PI_PROXY_BASE_URL` and `PI_PROXY_API_KEY`. -The examples retain their SQLite files in `/tmp/s1-v8-harness/`. -Example 21 uses a new request ID for each run and preserves it across reopen. - -The host loads bundles as ES modules, so `import.meta` and top-level await work. -Deno fetch also requires the net and telemetry extensions. -The host uses deno_ast to transpile Deno's internal telemetry TypeScript. -The host does not enable telemetry export. - -Both restart examples and the real proxy call passed. -The report at `.board/T1.report.md` records the commands, measurements, and remaining limits. diff --git a/spikes/s1-v8-harness/bootstrap.js b/spikes/s1-v8-harness/bootstrap.js deleted file mode 100644 index 88dbb3d..0000000 --- a/spikes/s1-v8-harness/bootstrap.js +++ /dev/null @@ -1,27 +0,0 @@ -// Install Deno's native Web APIs. No Node runtime is present. -const core = Deno.core; -const expose = (path, names) => { - const exports = core.loadExtScript(path); - for (const name of names) globalThis[name] = exports[name]; -}; -expose('ext:deno_web/01_dom_exception.js', ['DOMException']); -expose('ext:deno_web/02_event.js', ['Event', 'EventTarget', 'MessageEvent']); -expose('ext:deno_web/13_message_port.js', ['MessageChannel', 'MessagePort']); -expose('ext:deno_web/00_url.js', ['URL', 'URLSearchParams']); -expose('ext:deno_web/02_timers.js', ['setTimeout', 'clearTimeout', 'setInterval', 'clearInterval']); -expose('ext:deno_web/03_abort_signal.js', ['AbortController', 'AbortSignal']); -expose('ext:deno_web/06_streams.js', ['ReadableStream', 'WritableStream', 'TransformStream']); -expose('ext:deno_web/08_text_encoding.js', ['TextEncoder', 'TextDecoder']); -expose('ext:deno_web/09_file.js', ['Blob', 'File']); -expose('ext:deno_web/15_performance.js', ['performance']); -expose('ext:deno_web/02_structured_clone.js', ['structuredClone']); -expose('ext:deno_web/05_base64.js', ['atob', 'btoa']); -expose('ext:deno_crypto/00_crypto.js', ['crypto']); -expose('ext:deno_fetch/20_headers.js', ['Headers']); -expose('ext:deno_fetch/21_formdata.js', ['FormData']); -expose('ext:deno_fetch/23_request.js', ['Request']); -expose('ext:deno_fetch/23_response.js', ['Response']); -expose('ext:deno_fetch/26_fetch.js', ['fetch']); -const { Console } = core.loadExtScript('ext:deno_web/01_console.js'); -globalThis.console = new Console((message, level) => core.print(message, level > 1)); -globalThis.process = { env: {} }; diff --git a/spikes/s1-v8-harness/real.ts b/spikes/s1-v8-harness/real.ts deleted file mode 100644 index b3342db..0000000 --- a/spikes/s1-v8-harness/real.ts +++ /dev/null @@ -1,24 +0,0 @@ -// Make one streamed call through Surma's proxy with pi-ai's OpenAI provider. -import { createModels } from '@earendil-works/pi-ai/models'; -import { openaiProvider } from '@earendil-works/pi-ai/providers/openai'; -const models = createModels(); -models.setProvider(openaiProvider()); -const model = { - id: 'gpt-6.1-sol', name: 'gpt-6.1-sol', provider: 'openai', api: 'openai-responses', - baseUrl: `${process.env.PI_PROXY_BASE_URL}/v1`, reasoning: true, input: ['text'], - cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, contextWindow: 200000, maxTokens: 1024, -}; -const answer = await models.completeSimple(model as any, { - messages: [{ role: 'user', content: 'Reply with one short sentence about prime numbers.', timestamp: Date.now() }], -}, { apiKey: process.env.PI_PROXY_API_KEY, maxTokens: 1024, reasoning: 'low', headers: { 'Shopify-Usage-Tag': JSON.stringify(['pi', 's1-v8-harness']) } }); -if (answer.stopReason === 'error') { - let message = answer.errorMessage ?? 'Real model call failed'; - for (const key of ['PI_PROXY_BASE_URL', 'PI_PROXY_API_KEY']) { - const value = process.env[key]; - if (value) message = message.split(value).join('[redacted]'); - } - throw new Error(message); -} -const text = answer.content.filter(c => c.type === 'text').map(c => c.text).join(''); -if (!text) throw new Error('Real model returned no answer text'); -console.log(text); diff --git a/spikes/s1-v8-harness/sqlite.ts b/spikes/s1-v8-harness/sqlite.ts deleted file mode 100644 index 4c5bd09..0000000 --- a/spikes/s1-v8-harness/sqlite.ts +++ /dev/null @@ -1,33 +0,0 @@ -// Portable SQLite facade. Rust owns the connection and executes every statement. -import { SqliteStorage } from '@earendil-works/pi-durable/storage/sqlite'; -const op = (kind: string, sql = '', params: any[] = []) => Deno.core.ops.op_sql(kind, sql, params.map(p => p instanceof Uint8Array ? Array.from(p) : typeof p === 'bigint' ? Number(p) : p)); -export async function openStorage(path: string) { - op('open', path); - let tail = Promise.resolve(); - const queue = (call: () => Promise): Promise => { - const result = tail.then(call); - tail = result.then(() => {}, () => {}); - return result; - }; - const executor = { - exec: async (sql: string) => { op('exec', sql); }, - run: async (sql: string, ...params: any[]) => { op('run', sql, params); }, - runCounted: async (sql: string, ...params: any[]) => op('run', sql, params).changes, - get: async (sql: string, ...params: any[]) => (await executor.all(sql, ...params))[0], - all: async (sql: string, ...params: any[]) => op('all', sql, params).map((row: any) => Object.fromEntries(Object.entries(row).map(([key, value]) => [key, Array.isArray(value) ? new Uint8Array(value) : value]))), - }; - const database = Object.fromEntries(Object.entries(executor).map(([name, method]) => [name, (...args: any[]) => queue(() => method(...args))])); - database.transaction = (callback: any) => queue(async () => { - op('exec', 'BEGIN IMMEDIATE'); - try { - const result = await callback(executor); - op('exec', 'COMMIT'); - return result; - } catch (error) { - op('exec', 'ROLLBACK'); - throw error; - } - }); - database.close = () => queue(async () => { op('close'); }); - return SqliteStorage.open(database as any); -} diff --git a/spikes/s1-v8-harness/src/main.rs b/spikes/s1-v8-harness/src/main.rs deleted file mode 100644 index 8e52c82..0000000 --- a/spikes/s1-v8-harness/src/main.rs +++ /dev/null @@ -1,145 +0,0 @@ -//! Runs bundled pi examples in V8 with a rusqlite connection owned by Rust. -use deno_core::{JsRuntime, OpState, RuntimeOptions, op2}; -use deno_error::JsErrorBox; -use rusqlite::{Connection, types::Value as SqlValue}; -use serde_json::{Value, json}; -use std::sync::Arc; - -#[op2] -#[serde] -fn op_sql( - state: &mut OpState, - #[string] kind: String, - #[string] sql: String, - #[serde] params: Vec, -) -> Result { - let work = || -> Result> { - if kind == "open" { - state.put(Connection::open(sql)?); - return Ok(Value::Null); - } - if kind == "close" { - state.take::(); - return Ok(Value::Null); - } - let db = state.borrow::(); - if kind == "exec" { - db.execute_batch(&sql)?; - return Ok(Value::Null); - } - let params: Vec = params - .into_iter() - .map(|v| match v { - Value::Null => SqlValue::Null, - Value::Number(n) => n - .as_i64() - .map(SqlValue::Integer) - .unwrap_or_else(|| SqlValue::Real(n.as_f64().unwrap())), - Value::String(s) => SqlValue::Text(s), - Value::Array(a) => { - SqlValue::Blob(a.into_iter().map(|n| n.as_u64().unwrap() as u8).collect()) - } - _ => panic!("unsupported SQL parameter"), - }) - .collect(); - let mut stmt = db.prepare_cached(&sql)?; - if kind == "run" { - let changes = stmt.execute(rusqlite::params_from_iter(params))?; - return Ok(json!({"changes": changes, "lastInsertRowid": db.last_insert_rowid()})); - } - let names: Vec = stmt.column_names().into_iter().map(str::to_owned).collect(); - let mut rows = stmt.query(rusqlite::params_from_iter(params))?; - let mut result = vec![]; - while let Some(row) = rows.next()? { - let mut obj = serde_json::Map::new(); - for (i, name) in names.iter().enumerate() { - let v = match row.get::<_, SqlValue>(i)? { - SqlValue::Null => Value::Null, - SqlValue::Integer(n) => json!(n), - SqlValue::Real(n) => json!(n), - SqlValue::Text(s) => json!(s), - SqlValue::Blob(b) => json!(b), - }; - obj.insert(name.clone(), v); - } - result.push(Value::Object(obj)); - } - Ok(json!(result)) - }; - work().map_err(|e| JsErrorBox::generic(e.to_string())) -} - -deno_core::extension!(storage, ops = [op_sql]); - -#[tokio::main(flavor = "current_thread")] -async fn main() -> Result<(), Box> { - let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![ - deno_telemetry::deno_telemetry::init(), - deno_webidl::deno_webidl::init(), - deno_web::deno_web::init( - Arc::new(deno_web::BlobStore::default()), - None, - false, - Default::default(), - ), - deno_crypto::deno_crypto::init(None), - deno_net::deno_net::init(None, None), - deno_fetch::deno_fetch::init(Default::default()), - storage::init(), - ], - extension_transpiler: Some(std::rc::Rc::new(|name, source| { - if !name.ends_with(".ts") { - return Ok((source, None)); - } - let parsed = deno_ast::parse_module(deno_ast::ParseParams { - specifier: deno_core::url::Url::parse(&name).unwrap(), - text: source.into(), - media_type: deno_ast::MediaType::TypeScript, - capture_tokens: false, - scope_analysis: false, - maybe_syntax: None, - }) - .map_err(|e| JsErrorBox::generic(e.to_string()))?; - let emitted = parsed - .transpile( - &Default::default(), - &Default::default(), - &deno_ast::EmitOptions { - source_map: deno_ast::SourceMapOption::None, - ..Default::default() - }, - ) - .map_err(|e| JsErrorBox::generic(e.to_string()))? - .into_source(); - Ok((emitted.text.into(), None)) - })), - ..Default::default() - }); - runtime - .op_state() - .borrow_mut() - .put(deno_permissions::PermissionsContainer::allow_all(Arc::new( - deno_permissions::RuntimePermissionDescriptorParser::new(sys_traits::impls::RealSys), - ))); - runtime.execute_script("bootstrap.js", include_str!("../bootstrap.js"))?; - let env: serde_json::Map = ["PI_PROXY_BASE_URL", "PI_PROXY_API_KEY"] - .into_iter() - .filter_map(|key| std::env::var(key).ok().map(|v| (key.to_owned(), json!(v)))) - .collect(); - runtime.execute_script("env.js", format!("process.env = {};", Value::Object(env)))?; - let input = std::env::args() - .nth(1) - .ok_or("usage: s1-v8-harness BUNDLE.js")?; - let input = std::fs::canonicalize(input)?; - let specifier = deno_core::ModuleSpecifier::from_file_path(&input).unwrap(); - let module = runtime - .load_main_es_module_from_code(&specifier, std::fs::read_to_string(input)?) - .await?; - let result = runtime.mod_evaluate(module); - runtime - .with_event_loop_promise(result, Default::default()) - .await?; - runtime.run_event_loop(Default::default()).await?; - Ok(()) -} diff --git a/spikes/s1-v8-harness/startup.js b/spikes/s1-v8-harness/startup.js deleted file mode 100644 index af3a215..0000000 --- a/spikes/s1-v8-harness/startup.js +++ /dev/null @@ -1,2 +0,0 @@ -// Cold-start probe: the host installed all Web APIs before this script executes. -console.log('V8 ready'); diff --git a/spikes/s1-v8-harness/verify.nu b/spikes/s1-v8-harness/verify.nu deleted file mode 100644 index 352a70b..0000000 --- a/spikes/s1-v8-harness/verify.nu +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env nu -# Build the three bundles and execute them with the same Rust binary. -$env.NODE_PATH = '/tmp/s1-v8-harness/node_modules' -^/tmp/s1-v8-harness/node_modules/.bin/esbuild spikes/s1-v8-harness/21.ts spikes/s1-v8-harness/23.ts spikes/s1-v8-harness/real.ts --bundle --format=esm --platform=browser --outdir=/tmp/s1-v8-harness/bundles -if $env.LAST_EXIT_CODE != 0 { error make {msg: 'Bundle failed'} } -^nix develop -c cargo build --manifest-path spikes/s1-v8-harness/Cargo.toml -j 2 -if $env.LAST_EXIT_CODE != 0 { error make {msg: 'Build failed'} } -for example in ['21' '23' 'real'] { - print $'Example ($example):' - ^spikes/s1-v8-harness/target/debug/s1-v8-harness $'/tmp/s1-v8-harness/bundles/($example).js' - if $env.LAST_EXIT_CODE != 0 { error make {msg: $'Example ($example) failed'} } -} diff --git a/spikes/s2-shell/.gitignore b/spikes/s2-shell/.gitignore deleted file mode 100644 index 05fd257..0000000 --- a/spikes/s2-shell/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/target/ -/userland/target/ diff --git a/spikes/s2-shell/Cargo.lock b/spikes/s2-shell/Cargo.lock deleted file mode 100644 index 59509eb..0000000 --- a/spikes/s2-shell/Cargo.lock +++ /dev/null @@ -1,2472 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "addr2line" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59317f77929f0e679d39364702289274de2f0f0b22cbf50b2b8cff2169a0b27a" -dependencies = [ - "gimli", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "ambient-authority" -version = "0.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" - -[[package]] -name = "anyhow" -version = "1.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" - -[[package]] -name = "arbitrary" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bc62ac97cc33321f50863d514c3bc38a453947a8f9e781137e47c7401020aed" - -[[package]] -name = "async-trait" -version = "0.1.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", -] - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bitflags" -version = "2.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bumpalo" -version = "3.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" -dependencies = [ - "allocator-api2", -] - -[[package]] -name = "bytes" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" - -[[package]] -name = "cap-fs-ext" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ff379b70af8e08307a8f65e7040c7301cb4a572538ade16b4984f0da77847f" -dependencies = [ - "cap-primitives", - "cap-std", - "io-lifetimes 3.0.1", - "windows-sys 0.61.2", -] - -[[package]] -name = "cap-primitives" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b5f74729fd2f44701d1a8eb47e906cdb3ccd9ec0f02baad85a744b791940b18" -dependencies = [ - "ambient-authority", - "fs-set-times", - "io-extras", - "io-lifetimes 3.0.1", - "ipnet", - "maybe-owned", - "rustix", - "rustix-linux-procfs", - "windows-sys 0.61.2", - "winx", -] - -[[package]] -name = "cap-std" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ec78e242cfa2cfe276807ac2ecc00315a6c97786977414bcd1c3963b6c91b8" -dependencies = [ - "cap-primitives", - "io-extras", - "io-lifetimes 3.0.1", - "rustix", -] - -[[package]] -name = "cc" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ff2a8126fff0f8c839080d619675a585e61720bb12d2baceae45769fd66f155" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" - -[[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", -] - -[[package]] -name = "cobs" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" -dependencies = [ - "thiserror 2.0.21", -] - -[[package]] -name = "core_detect" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f8f80099a98041a3d1622845c271458a2d73e688351bf3cb999266764b81d48" - -[[package]] -name = "cpp_demangle" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0667304c32ea56cb4cd6d2d7c0cfe9a2f8041229db8c033af7f8d69492429def" -dependencies = [ - "cfg-if", -] - -[[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 = "cranelift-assembler-x64" -version = "0.136.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "249a61efca6a54425e027f5704a6f68a0232b4df527e05a3ef947d89dbdcb078" -dependencies = [ - "cranelift-assembler-x64-meta", -] - -[[package]] -name = "cranelift-assembler-x64-meta" -version = "0.136.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5336a46e05db2d515440b1ce8a9363e7bc04b608c0f66cc98dddc5492a66fbf" -dependencies = [ - "cranelift-srcgen", -] - -[[package]] -name = "cranelift-bforest" -version = "0.136.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b3675b13214270fddbd257d5fbf4109be8b02d92fc636fe96e2829514a7235" -dependencies = [ - "cranelift-entity", - "wasmtime-internal-core", -] - -[[package]] -name = "cranelift-bitset" -version = "0.136.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c1d67aa02b6e174bd2b165c113e94af9498fcc20e2892d0f4d5ab8c9618d09" -dependencies = [ - "serde", - "serde_derive", - "wasmtime-internal-core", -] - -[[package]] -name = "cranelift-codegen" -version = "0.136.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fe6f3ec5344c32602c414e986dcbe699fa501a3e3e7b02f887d9d12b14ae42" -dependencies = [ - "bumpalo", - "cranelift-assembler-x64", - "cranelift-bforest", - "cranelift-bitset", - "cranelift-codegen-meta", - "cranelift-codegen-shared", - "cranelift-control", - "cranelift-entity", - "cranelift-isle", - "gimli", - "hashbrown 0.17.1", - "libm", - "log", - "postcard", - "pulley-interpreter", - "regalloc2", - "rustc-hash", - "serde", - "serde_derive", - "sha2", - "smallvec", - "target-lexicon", - "wasmtime-internal-core", -] - -[[package]] -name = "cranelift-codegen-meta" -version = "0.136.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c5e6323d458486d95781defdb5016a1176fc911d8bc8e64b696adbda6e9044" -dependencies = [ - "cranelift-assembler-x64-meta", - "cranelift-codegen-shared", - "cranelift-srcgen", - "heck", - "pulley-interpreter", -] - -[[package]] -name = "cranelift-codegen-shared" -version = "0.136.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1260aa93b0bd48e8e55c1c7fd9ff6a260f1a1bc46e1f0151a5055b124e5b15d" - -[[package]] -name = "cranelift-control" -version = "0.136.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c179632a09850f81f1a1e9116cb09330c734a86689f3ee4c3f4ec81543acbd" -dependencies = [ - "arbitrary", -] - -[[package]] -name = "cranelift-entity" -version = "0.136.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8c071188cb1c3b1803e23ae415a8d5f58d741d3a4b26a79b83dd61921112eac" -dependencies = [ - "cranelift-bitset", - "serde", - "serde_derive", - "wasmtime-internal-core", -] - -[[package]] -name = "cranelift-frontend" -version = "0.136.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b85ba0a55d7685117b275fe6f36c819d438862e4223d28f0b97902460ff0ac" -dependencies = [ - "cranelift-codegen", - "hashbrown 0.17.1", - "log", - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cranelift-isle" -version = "0.136.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20ed364edcaed769da7b2709d540f8f7d0ff257749ba193f475e22dba6a0178b" - -[[package]] -name = "cranelift-native" -version = "0.136.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418d98c3dce08f0d13526692bbd1888bff4c5f45207f5093d168b5a224fbc88c" -dependencies = [ - "cranelift-codegen", - "libc", - "target-lexicon", -] - -[[package]] -name = "cranelift-srcgen" -version = "0.136.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f016b9994e39cad68107f33fa5b8dcee8fb7e38332bde3f97690e5e8abe1b10" - -[[package]] -name = "crc32fast" -version = "1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f97d3416d5337d15c4b0d78c8c91df922ca143f57ec20e2d1c188333047ef04" -dependencies = [ - "cfg-if", -] - -[[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 = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "debugid" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" -dependencies = [ - "uuid", -] - -[[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 = "directories-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[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.9", -] - -[[package]] -name = "either" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be" - -[[package]] -name = "embedded-io" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" - -[[package]] -name = "embedded-io" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" - -[[package]] -name = "encoding_rs" -version = "0.8.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89253175e704ab869b04f9db224d38630e0211a53841a79181deae0889e169f5" -dependencies = [ - "cfg-if", - "core_detect", - "multiversion_no_op", - "rustversion", - "scopeguard", - "simdutf8", -] - -[[package]] -name = "equivalent" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826" - -[[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 = "fastrand" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" - -[[package]] -name = "find-msvc-tools" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c66915cc5391097de7a2b0b972e8505aa33c0df401fd3a6811dbdb32881ba48" - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[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 = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fs-set-times" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a" -dependencies = [ - "io-lifetimes 2.0.4", - "rustix", - "windows-sys 0.59.0", -] - -[[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-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-io" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" - -[[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-sink", - "futures-task", - "memchr", - "pin-project-lite", - "slab", -] - -[[package]] -name = "fxprof-processed-profile" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25234f20a3ec0a962a61770cfe39ecf03cb529a6e474ad8cff025ed497eda557" -dependencies = [ - "bitflags", - "debugid", - "rustc-hash", - "serde", - "serde_derive", - "serde_json", -] - -[[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 = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[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", - "rand_core", -] - -[[package]] -name = "gimli" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf7f043f89559805f8c7cacc432749b2fa0d0a0a9ee46ce47164ed5ba7f126c" -dependencies = [ - "fnv", - "hashbrown 0.16.1", - "indexmap", - "stable_deref_trait", -] - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" - -[[package]] -name = "hashbrown" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" -dependencies = [ - "foldhash", - "serde", - "serde_core", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "icu_collections" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe090a42a0d3140fed8c63263ed1fecc02422cb2f4bfe55cd8de2de1b8e105dd" -dependencies = [ - "displaydoc", - "potential_utf", - "utf8_iter", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25d29b57c17c6528d0dc4c2141cfa2d08200465acb537a3909c8b9b8a4a984c0" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "404a3b8c486f205c87fe7f23ab6894d84a4ad76d6e4671ae1981ba7def87c599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20f0088bfb7441f7a37fa0c9e20cb1e9cba1cac6b9ce8cd2a6dc44294f8e8cbc" - -[[package]] -name = "icu_properties" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ea83d991c56158f7cf898bf86436c1dfe7c07ee82fe88951f2695c9f37a379f" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98f29af82d02b163fe50161388350e743bb3107cc8e8c2f7314cb505faddfcf" - -[[package]] -name = "icu_provider" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413099315636c588ee8f011190b329b971a09a8fae9d157e01dcae8379468514" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - -[[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 = "indexmap" -version = "2.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" -dependencies = [ - "equivalent", - "hashbrown 0.17.1", - "serde", - "serde_core", -] - -[[package]] -name = "io-extras" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20fd6de4ccfcc187e38bc21cfa543cb5a302cb86a8b114eb7f0bf0dc9f8ac00f" -dependencies = [ - "io-lifetimes 3.0.1", - "windows-sys 0.60.2", -] - -[[package]] -name = "io-lifetimes" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06432fb54d3be7964ecd3649233cddf80db2832f47fec34c01f65b3d9d774983" - -[[package]] -name = "io-lifetimes" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0fb0570afe1fed943c5c3d4102d5358592d8625fda6a0007fdbe65a92fba96" - -[[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 = "ittapi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b996fe614c41395cdaedf3cf408a9534851090959d90d54a535f675550b64b1" -dependencies = [ - "anyhow", - "ittapi-sys", - "log", -] - -[[package]] -name = "ittapi-sys" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f5385394064fa2c886205dba02598013ce83d3e92d33dbdc0c52fe0e7bf4fc" -dependencies = [ - "cc", -] - -[[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.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dc09d2154098bbf4ef54eab6b117a3c24cbbffe94046b16ee6d6d4510584d3a" -dependencies = [ - "cfg-if", - "futures-util", - "wasm-bindgen", -] - -[[package]] -name = "leb128" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c83bff1d572d6b9aeef67ddfc8448e4a3737909cb28e81f97c791b9018703e52" - -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - -[[package]] -name = "libc" -version = "0.2.191" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" - -[[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 = "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 = "log" -version = "0.4.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d15f86d12da44cd8d4ec3c73984537eb7f4cadcb9776a575a0a8a05ca11005c" - -[[package]] -name = "mach2" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dae608c151f68243f2b000364e1f7b186d9c29845f7d2d85bd31b9ad77ad552b" - -[[package]] -name = "maybe-owned" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" - -[[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 = "mio" -version = "1.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.61.2", -] - -[[package]] -name = "multiversion_no_op" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743fb55ba31b18fb1ecef6bdc9aa2743314978ac084044301a7eee33fb99a20d" - -[[package]] -name = "object" -version = "0.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd229a0361b9d0d4396176e02d65897f487eebeab7caa6d443855ee152ca0b9c" -dependencies = [ - "crc32fast", - "hashbrown 0.17.1", - "indexmap", - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap", -] - -[[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 = "postcard" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" -dependencies = [ - "cobs", - "embedded-io 0.4.0", - "embedded-io 0.6.1", - "serde", -] - -[[package]] -name = "potential_utf" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" -dependencies = [ - "zerovec", -] - -[[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 = "pulley-interpreter" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d74df9e20cba0f6dd07f01c3140535a6b23e40aecccfcacfb921621b41d0acb" -dependencies = [ - "cranelift-bitset", - "log", - "pulley-macros", - "wasmtime-internal-core", -] - -[[package]] -name = "pulley-macros" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8415513bfa407c06de6f11dbe9437f2352e075a5520ff491a131166d3d90aed1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[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 = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" - -[[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", -] - -[[package]] -name = "rand_core" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" - -[[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 = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 1.0.69", -] - -[[package]] -name = "regalloc2" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757712e8e61590d6d4f5d563483755538b5aa13467837a3b41cd9832509a7f85" -dependencies = [ - "allocator-api2", - "bumpalo", - "hashbrown 0.17.1", - "log", - "rustc-hash", - "serde", - "smallvec", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b74b56ffa8bb2830709a538c2cbcae9aa062db0d2a42563bfb09bdaae44020eb" - -[[package]] -name = "rustc-hash" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" - -[[package]] -name = "rustix" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5e76742e5294153d4dde1207dbec5bdd81eef6fabdc0d2118babadabfd858aa" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustix-linux-procfs" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fc84bf7e9aa16c4f2c758f27412dc9841341e16aa682d9c7ac308fe3ee12056" -dependencies = [ - "once_cell", - "rustix", -] - -[[package]] -name = "rustversion" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" - -[[package]] -name = "s2-shell" -version = "0.1.0" -dependencies = [ - "anyhow", - "sausage-vfs", - "serde", - "serde_json", - "tokio", - "wasmtime", - "wasmtime-wasi", -] - -[[package]] -name = "sausage-vfs" -version = "0.1.0" -dependencies = [ - "async-trait", - "bytes", - "cap-fs-ext", - "cap-std", - "tokio", - "wasmtime", - "wasmtime-wasi", -] - -[[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" -dependencies = [ - "serde", - "serde_core", -] - -[[package]] -name = "serde" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", -] - -[[package]] -name = "serde_json" -version = "1.0.154" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" -dependencies = [ - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "serde_spanned" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7523beb55eece201a2356bee0bbca0d1ab466c14c07703b2e0ee6d42cb0c2c" -dependencies = [ - "serde_core", -] - -[[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 = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "smallvec" -version = "1.16.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0d5d4b1981b8bbbb7aed204cae5726d683d5d6ac7e74ec54122ea28f315e7c8" -dependencies = [ - "serde", -] - -[[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 = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" -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.9", -] - -[[package]] -name = "target-lexicon" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" - -[[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 = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[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.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" -dependencies = [ - "thiserror-impl 2.0.21", -] - -[[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.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", -] - -[[package]] -name = "tinystr" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abc840c238154d58f9e86b2792261edfde565a17696e1cda1a449de27979801a" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tokio" -version = "1.54.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b52fd3255258d26fac7264ab5a76b53c13367136dc011d3d6ad4f8ed070396a3" -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.9", -] - -[[package]] -name = "toml" -version = "1.2.0+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5ffcdf8f50436dbbfd675c1fe1b8e0854f42b7defea8584bdebe1aee900e561" -dependencies = [ - "indexmap", - "serde_core", - "serde_spanned", - "toml_datetime", - "toml_parser", - "toml_writer", - "winnow", -] - -[[package]] -name = "toml_datetime" -version = "1.1.2+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b86d767906c6c42421dcba507eb9d203e779497710a47782a224bb871653053" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_parser" -version = "1.1.5+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baa693a8032d7e1cada7d0041e96126df243179ff061456783ac7f12bda4744c" -dependencies = [ - "winnow", -] - -[[package]] -name = "toml_writer" -version = "1.2.0+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "009dbb7700f11c55ef83aebbe4c0e9cf1f1ac0844bd8d6f00dc38f302026e13a" - -[[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 = "typenum" -version = "1.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" - -[[package]] -name = "unicode-ident" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" - -[[package]] -name = "unicode-width" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca718471876992059f251e33aafc334346ada08042b7661dd1fe313a9bced557" - -[[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 = "utf8_iter" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af3bd9d3e571c26fcce9d033b87ea5ab061b8d2ffe9b7a5675d810d68f03edf0" -dependencies = [ - "utf_types", -] - -[[package]] -name = "utf_types" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3b425286980a367278453f3b6d28cdcb134b574e5a35824a6ff5eebad50bb6" - -[[package]] -name = "uuid" -version = "1.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0e2d11620c50695fe12bbbfde96b3477fe606e7284c22d505c12ce51214514" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasm-bindgen" -version = "0.2.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0181c14ddd6c7b8b0b0132a5f1ea2f32be0d893cd3ea97b6e3b28886b8a3d1c" -dependencies = [ - "cfg-if", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e931a02a39abdbf66966fc35902b5ed58344750a70885bed4ebb3d8eaf28ed9" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca4b54280e455bd831e33a6b8e734baf432fe63fbc35c42ac14ce67a043a53a" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 3.0.9", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b1f9c3798725016c6ee5f2f57869ec0831e8bbc0ab0310a86e787e97f41389e" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-compose" -version = "0.258.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27dc71f96d21a8b9153da9005c603f4f20d5781b7e6d2675ea0ca5def8713b75" -dependencies = [ - "anyhow", - "heck", - "indexmap", - "log", - "petgraph", - "smallvec", - "wasm-encoder 0.258.3", - "wasmparser 0.258.3", - "wat", -] - -[[package]] -name = "wasm-encoder" -version = "0.258.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64765e43c000fae008a48db8b288e175e237fc9ce20a26586836878c1bee89f" -dependencies = [ - "leb128fmt", - "wasmparser 0.258.3", -] - -[[package]] -name = "wasm-encoder" -version = "0.263.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b883a26aea02eaabe2d2c3fba7eb039ef5cdcb5d5201ae5551e73d5e251a81f" -dependencies = [ - "leb128fmt", - "wasmparser 0.263.0", -] - -[[package]] -name = "wasm-metadata" -version = "0.258.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e10808eb27efde692f1b1706089fe19296728bf872291f5b4e0d50fba88f2f" -dependencies = [ - "anyhow", - "indexmap", - "wasm-encoder 0.258.3", - "wasmparser 0.258.3", -] - -[[package]] -name = "wasmparser" -version = "0.258.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9269dd817e0e7021bf534ccd9761bc2d64778b6708e41228b8439d75eaa0b1" -dependencies = [ - "bitflags", - "hashbrown 0.17.1", - "indexmap", - "semver", - "serde", -] - -[[package]] -name = "wasmparser" -version = "0.263.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fa0a054ae153606df820eb0a84213e28cda41bbe04ba2628e71b6ba100fcb" -dependencies = [ - "bitflags", - "indexmap", - "semver", -] - -[[package]] -name = "wasmprinter" -version = "0.258.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14a457ba8670a3db3d357c1aeac3ed4fe378a76054a221789f0df0ea507e292b" -dependencies = [ - "anyhow", - "termcolor", - "wasmparser 0.258.3", -] - -[[package]] -name = "wasmtime" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d45bf3b13781b9febb0eef42e1e145146c92ef891f345fd918e0e0fa1568c992" -dependencies = [ - "addr2line", - "async-trait", - "bitflags", - "bumpalo", - "bytes", - "cc", - "encoding_rs", - "futures", - "fxprof-processed-profile", - "gimli", - "ittapi", - "libc", - "log", - "mach2", - "memfd", - "object", - "once_cell", - "postcard", - "pulley-interpreter", - "rayon", - "rustix", - "semver", - "serde", - "serde_derive", - "serde_json", - "smallvec", - "target-lexicon", - "tempfile", - "wasm-compose", - "wasm-encoder 0.258.3", - "wasmparser 0.258.3", - "wasmtime-environ", - "wasmtime-internal-cache", - "wasmtime-internal-component-macro", - "wasmtime-internal-component-util", - "wasmtime-internal-core", - "wasmtime-internal-cranelift", - "wasmtime-internal-fiber", - "wasmtime-internal-jit-debug", - "wasmtime-internal-jit-icache-coherence", - "wasmtime-internal-unwinder", - "wasmtime-internal-versioned-export-macros", - "wat", - "windows-sys 0.61.2", - "wit-parser", -] - -[[package]] -name = "wasmtime-environ" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833f00f3dc6128159284c5b71e211f24c97d45e052230a14f767fd830a6fb8b0" -dependencies = [ - "anyhow", - "cpp_demangle", - "cranelift-bforest", - "cranelift-bitset", - "cranelift-entity", - "gimli", - "hashbrown 0.17.1", - "indexmap", - "log", - "object", - "postcard", - "rustc-demangle", - "semver", - "serde", - "serde_derive", - "sha2", - "smallvec", - "target-lexicon", - "wasm-encoder 0.258.3", - "wasmparser 0.258.3", - "wasmprinter", - "wasmtime-internal-component-util", - "wasmtime-internal-core", -] - -[[package]] -name = "wasmtime-internal-cache" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85f1bafc5f2237c5fb6f8babc77b5db2eee8128766b8f1cfe52e771ebbcbed89" -dependencies = [ - "base64", - "directories-next", - "log", - "postcard", - "rustix", - "serde", - "serde_derive", - "sha2", - "toml", - "wasmtime-environ", - "windows-sys 0.61.2", - "zstd", -] - -[[package]] -name = "wasmtime-internal-component-macro" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d69c34412409072d2e8ec399101524c330e334ff313f77415e6984cc9c6a172" -dependencies = [ - "anyhow", - "proc-macro2", - "quote", - "syn 2.0.119", - "wasmtime-internal-component-util", - "wasmtime-internal-wit-bindgen", - "wit-parser", -] - -[[package]] -name = "wasmtime-internal-component-util" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b168d39f2d6b896d89fe096afa4ccdd7a8e927b01469b590af84f02fca3126a1" - -[[package]] -name = "wasmtime-internal-core" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ad86a65d12c6a9202584ceb658c9a20cf5b25c32eed61c9be5e5f863f88f0d9" -dependencies = [ - "anyhow", - "hashbrown 0.17.1", - "libm", - "serde", -] - -[[package]] -name = "wasmtime-internal-cranelift" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a71f0fd1dd40e4e18d4a20cdba29ff8e0eb2c0f21b12c2eb5869e0fea789dd05" -dependencies = [ - "cranelift-codegen", - "cranelift-control", - "cranelift-entity", - "cranelift-frontend", - "cranelift-native", - "gimli", - "itertools", - "log", - "object", - "pulley-interpreter", - "smallvec", - "target-lexicon", - "thiserror 2.0.21", - "wasmparser 0.258.3", - "wasmtime-environ", - "wasmtime-internal-core", - "wasmtime-internal-unwinder", - "wasmtime-internal-versioned-export-macros", -] - -[[package]] -name = "wasmtime-internal-fiber" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4dfa39e58735b24ce3d28bfc8c2b3041603cc8a941bb268395351beff90172" -dependencies = [ - "cc", - "libc", - "rustix", - "wasmtime-environ", - "wasmtime-internal-versioned-export-macros", - "windows-sys 0.61.2", -] - -[[package]] -name = "wasmtime-internal-jit-debug" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2eb98d4486c7b0163447d77dea06f3cc87e5e5ba5fc93613f8ec42e27ea181d" -dependencies = [ - "cc", - "object", - "rustix", - "wasmtime-internal-versioned-export-macros", -] - -[[package]] -name = "wasmtime-internal-jit-icache-coherence" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852cae234735d79db6c58fe0d04b32f4078ad01fdb3fd6d488ac366132ba9785" -dependencies = [ - "libc", - "wasmtime-internal-core", - "windows-sys 0.61.2", -] - -[[package]] -name = "wasmtime-internal-unwinder" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9289378c82b9db7e7cf933d6bb441ad968536ac48f3f38c55b7cf9d3e8d87e1" -dependencies = [ - "cranelift-codegen", - "log", - "object", - "wasmtime-environ", -] - -[[package]] -name = "wasmtime-internal-versioned-export-macros" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc5c60c732d99dbcc5d670b71ba6ccf2b015cd16fc828990eaad2c4b8805ebdb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "wasmtime-internal-wit-bindgen" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77e4fcc7cd22772578458c5e233df47190ebc9b8b65788797d99a02787c9000" -dependencies = [ - "anyhow", - "bitflags", - "heck", - "indexmap", - "wit-component", - "wit-parser", -] - -[[package]] -name = "wasmtime-wasi" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "705b90d1fa1084cc73df656868948da77711b97f6b895d145a4949f86bcea674" -dependencies = [ - "async-trait", - "bitflags", - "bytes", - "cap-primitives", - "futures", - "rand", - "rustix", - "rustix-linux-procfs", - "thiserror 2.0.21", - "tokio", - "tracing", - "url", - "wasmtime", - "wasmtime-wasi-io", - "wiggle", - "windows-sys 0.61.2", - "winx", -] - -[[package]] -name = "wasmtime-wasi-io" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d2b6a255be488639f450b380e7e0923789f946de3463696cd30f2fe8a65cc3" -dependencies = [ - "async-trait", - "bytes", - "futures", - "tracing", - "wasmtime", -] - -[[package]] -name = "wast" -version = "35.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ef140f1b49946586078353a453a1d28ba90adfc54dde75710bc1931de204d68" -dependencies = [ - "leb128", -] - -[[package]] -name = "wast" -version = "263.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d90bcf581b501aa1c358bc5dc0faa979cd375796908860ebcb6d1d70b907c7" -dependencies = [ - "bumpalo", - "leb128fmt", - "memchr", - "unicode-width", - "wasm-encoder 0.263.0", -] - -[[package]] -name = "wat" -version = "1.263.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbc9c5aca783b3f1838be89f3f9937c528b90ec5faa6fb62d809726c16a7d8f7" -dependencies = [ - "wast 263.0.0", -] - -[[package]] -name = "wiggle" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1ef4f7720340c50b9d28718516f7ab881a169b9021268e7dc67729435d9ccfd" -dependencies = [ - "bitflags", - "thiserror 2.0.21", - "tracing", - "wasmtime", - "wasmtime-environ", - "wiggle-macro", -] - -[[package]] -name = "wiggle-generate" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1692e27a88a6fa5bacd69a645e982a439c5ae835d9180394992627b0124cb705" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.119", - "wasmtime-environ", - "witx", -] - -[[package]] -name = "wiggle-macro" -version = "49.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562354c56fa0b83911512f0b60baf33c824e431de67a6012939ce52d224713b9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", - "wiggle-generate", -] - -[[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-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[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", -] - -[[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", - "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_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.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.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winnow" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3b93199df0ab874cdf0c6a94f0a0dc3423fe41f1cafb62b8bd7b1deb277aef" - -[[package]] -name = "winx" -version = "0.36.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f3fd376f71958b862e7afb20cfe5a22830e1963462f3a17f49d82a6c1d1f42d" -dependencies = [ - "bitflags", - "windows-sys 0.59.0", -] - -[[package]] -name = "wit-component" -version = "0.258.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0fca88950af0c1f42bc77e17315e48798b8d68340171b6d204f62bc19a878a6" -dependencies = [ - "anyhow", - "bitflags", - "indexmap", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder 0.258.3", - "wasm-metadata", - "wasmparser 0.258.3", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.258.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2127663dcf3ee16614fb0e3c33d5c6c66fec9dad317a8b0fdd3869487a533" -dependencies = [ - "anyhow", - "hashbrown 0.17.1", - "id-arena", - "indexmap", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-ident", - "wasmparser 0.258.3", -] - -[[package]] -name = "witx" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e366f27a5cabcddb2706a78296a40b8fcc451e1a6aba2fc1d94b4a01bdaaef4b" -dependencies = [ - "anyhow", - "log", - "thiserror 1.0.69", - "wast 35.0.2", -] - -[[package]] -name = "writeable" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" - -[[package]] -name = "yoke" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "417ef3fcf6c300b7dbd25c85531a746931c02ad536f3cf4786ed1e88223340b3" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", - "synstructure", -] - -[[package]] -name = "zerofrom" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", - "synstructure", -] - -[[package]] -name = "zerotrie" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58a2799cfe9a1670c7ea8edbd52ef8edb93cb37a7f83bf31ba9e35d9dae6a40" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3743ddbf47738d929cd1ae2e199d40d0162979dfe31aef8ae646d2bf00bf97a" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", -] - -[[package]] -name = "zmij" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" - -[[package]] -name = "zstd" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb02c3132d251ab1606e9fc913a7da6c6ed08cc263df15edf082e1dc497d157" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c8ea04668f5de8d8d51051714ba560c9536519cadcdb8829bba4fe2ad159b03" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.1.2+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "481ada9c543b2323cbb7bbdbb5249177fbf0188ed959ed2c15e4b22421c84ed3" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/spikes/s2-shell/Cargo.toml b/spikes/s2-shell/Cargo.toml deleted file mode 100644 index e3974f5..0000000 --- a/spikes/s2-shell/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "s2-shell" -version = "0.1.0" -edition = "2024" - -[workspace] - -[profile.dev.package."*"] -opt-level = 2 - -[dependencies] -anyhow = "1" -serde = { version = "1", features = ["derive"] } -serde_json = "1" -sausage-vfs = { path = "../../vfs" } -tokio = { version = "1", features = ["macros", "rt-multi-thread", "net", "io-util"] } -wasmtime = "49.0.2" -wasmtime-wasi = "49.0.2" diff --git a/spikes/s2-shell/README.md b/spikes/s2-shell/README.md deleted file mode 100644 index 017bebb..0000000 --- a/spikes/s2-shell/README.md +++ /dev/null @@ -1,71 +0,0 @@ -# S2 shell experiment - -The target is a brush shell inside WASI with external uutils commands in separate Wasmtime stores. -All instances share one world root through `sausage-vfs`. -The process import must preserve streaming, EOF, broken pipes, and exit codes. - -## Reproduction - -The scratch checkout must use brush revision `943553433ae04f5b3bd55d2cf207e39eb9ef2af7`. -The toolchain comes from the repository devshell. - -```sh -git clone --depth 1 https://github.com/reubeno/brush /tmp/s2-shell/brush -git -C /tmp/s2-shell/brush fetch --depth 1 origin 943553433ae04f5b3bd55d2cf207e39eb9ef2af7 -git -C /tmp/s2-shell/brush checkout --detach 943553433ae04f5b3bd55d2cf207e39eb9ef2af7 -nu --no-config-file /home/surma/src/gitea.surma.technology/surma/sausage/spikes/s2-shell/patch-brush.nu -nix develop -c cargo build --manifest-path /tmp/s2-shell/brush/Cargo.toml -p brush-shell --release --no-default-features --features minimal --target wasm32-wasip2 -j 2 -nix develop -c wasm-tools strip /tmp/s2-shell/brush/target/wasm32-wasip2/release/brush.wasm -o /tmp/s2-shell/brush-release.wasm -nix develop -c cargo build --manifest-path spikes/s2-shell/userland/Cargo.toml --release --target wasm32-wasip2 -j 2 -nix develop -c cargo build --manifest-path spikes/s2-shell/Cargo.toml -j 2 -nu --no-config-file /home/surma/src/gitea.surma.technology/surma/sausage/spikes/s2-shell/compare.nu /home/surma/src/gitea.surma.technology/surma/sausage/spikes/s2-shell/target/debug/s2-shell /tmp/s2-shell/brush-release.wasm -# Run the same comparison again after the cache is warm. -nu --no-config-file /home/surma/src/gitea.surma.technology/surma/sausage/spikes/s2-shell/compare.nu /home/surma/src/gitea.surma.technology/surma/sausage/spikes/s2-shell/target/debug/s2-shell /tmp/s2-shell/brush-release.wasm -nu --no-config-file /home/surma/src/gitea.surma.technology/surma/sausage/spikes/s2-shell/timings.nu /home/surma/src/gitea.surma.technology/surma/sausage/spikes/s2-shell/target/debug/s2-shell /tmp/s2-shell/brush-release.wasm -``` - -`userland/` builds the six commands from the published uutils 0.12.0 crates. -Its entry point calls libc's `chdir` with the host-supplied `S2_CWD` before it dispatches the command. -The packaged uutils component does not import `initial-cwd` and otherwise starts every command at `/`. -`compare.nu` copies the rebuilt multicall component into each bin alias in the test worlds. -The host checks the bin alias and reuses one compiled uutils component for these identical files. -It does not implement arbitrary executable resolution. - -`corpus.sh` covers the requested syntax and traversal into another top-level folder. -`compare.nu` creates separate native and guest fixtures under `/tmp/s2-shell/comparison`. -It compares stdout and exit codes, and preserves stderr separately. -It removes the native fixture prefix from stdout because the guest sees the fixture as `/`. - -## Bridge - -`patch-brush.nu` copies `guest-process.rs` into the wasm launcher seam of the scratch checkout. -It adds the WIT import and its dependencies to that checkout only. -The guest launcher transfers bounded chunks between brush's open files and host-backed pipes. -It starts an independent Tokio task for each child's IO pump. -Brush waits for child processes sequentially, so a pump cannot run only inside the child's wait future. -Each pump yields between exchanges so the downstream pipeline stage can execute. -It closes the host output pipe when brush reports a broken pipe. - -The host starts each child component in a separate store. -Unix socket pairs provide bounded, streamed stdin, stdout, and stderr. -The host uses the default Cranelift optimization level. -The dev profile optimizes dependencies at level 2, so Cranelift itself does not run unoptimized. -Wasmtime stores compiled modules in `/tmp/s2-shell/cache` and reuses them across host invocations. -The first comparison warms this cache. Cold compilation can take minutes. -`timings.nu` compares and times each corpus construct after the cache is warm. -Every child receives the same VFS root, its environment, and its initial working directory. -The guest process exchanges do not buffer a whole command's output. -Brush's existing in-memory pipes still buffer between cooperative shell tasks. - -## Scope - -The experiment supports only the acceptance corpus and its six uutils aliases. -It does not implement exec, signals, process groups, or interactive stdin inheritance. -It treats the shell's original stdin as EOF for external commands. -It does forward redirected stdin and pipeline stdin. -The fixture uses an ordinary file at `/dev/null`, not a device implementation. -The process import is spike-specific, not a proposed stable ABI. - -AgentOS supplies the prior art, not code in this implementation. -Its standard library patches target `host_process` imports in its V8 runtime. -This experiment does not patch Rust's standard library. diff --git a/spikes/s2-shell/compare.nu b/spikes/s2-shell/compare.nu deleted file mode 100644 index 3244fe0..0000000 --- a/spikes/s2-shell/compare.nu +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env nu -# Compare one shell script with bash. Keep both streams and exact exit codes. -def main [host: path, shell: path] { - let base = '/tmp/s2-shell/comparison' - mkdir $base - for name in [native guest] { - let root = ($base | path join $name) - mkdir ($root | path join work sub) ($root | path join other) ($root | path join bin) ($root | path join dev) - "alpha\n" | save -f ($root | path join work f) - "one\ntwo\n" | save -f ($root | path join work file) - '' | save -f ($root | path join work a.txt) - '' | save -f ($root | path join work b.txt) - "before\n" | save -f ($root | path join work log) - '' | save -f ($root | path join dev 'null') - for tool in [cat tr ls wc yes head] { - cp --force ($env.FILE_PWD | path join userland target wasm32-wasip2 release s2-userland.wasm) ($root | path join bin $tool) - } - } - let script = (open --raw ($env.FILE_PWD | path join corpus.sh)) - let native_root = ($base | path join native) - let native = (do { cd $native_root; ^bash --noprofile --norc -c $script } | complete) - let stdout = ($native.stdout | str replace --all $native_root '') - $stdout | save -f ($base | path join native.stdout) - $native.stderr | save -f ($base | path join native.stderr) - print $'native exit=($native.exit_code)' - let start = (date now) - let guest = (^$host ($base | path join guest) $shell -c $script | complete) - print $'guest elapsed=((date now) - $start)' - $guest.stdout | save -f ($base | path join guest.stdout) - $guest.stderr | save -f ($base | path join guest.stderr) - print $'guest exit=($guest.exit_code)' - print $'equal stdout=($stdout == $guest.stdout)' - print '--- native stdout ---' - print $stdout - print '--- guest stdout ---' - print $guest.stdout - print '--- guest stderr ---' - print $guest.stderr - if $native.exit_code != $guest.exit_code or $stdout != $guest.stdout { - error make {msg: 'shell comparison failed'} - } -} diff --git a/spikes/s2-shell/corpus.sh b/spikes/s2-shell/corpus.sh deleted file mode 100644 index 14e3c18..0000000 --- a/spikes/s2-shell/corpus.sh +++ /dev/null @@ -1,18 +0,0 @@ -cd work -printf 'pwd=%s\n' "$(pwd)" -printf 'upper=%s\n' "$(cat f | tr a-z A-Z)" -ls *.txt | wc -l -( cd sub && pwd ) -cat <<'EOF' -$HOME stays literal -EOF -cat missing 2>/dev/null >> log -cat f 2>/dev/null >> log -cat log -wc -l < file -for f in *; do printf 'entry=%s\n' "$f"; done -false || echo ok -false -echo $? -( cd sub && cd ../../other && pwd && cd ../work && pwd ) -yes | head -n 2 diff --git a/spikes/s2-shell/guest-process.rs b/spikes/s2-shell/guest-process.rs deleted file mode 100644 index a6c0db4..0000000 --- a/spikes/s2-shell/guest-process.rs +++ /dev/null @@ -1,76 +0,0 @@ -//! Launches external components through the S2 host import and pumps their streams. -#![allow(clippy::all, missing_docs)] -use crate::{ - ExecutionResult, - openfiles::OpenFile, - processes::{ChildProcess, LaunchRequest}, -}; -use std::io::{Read, Write}; -mod bindings { - wit_bindgen::generate!({ path: "s2-process.wit", world: "shell" }); -} -pub(crate) type ProcessId = i32; -pub(crate) fn spawn(mut request: LaunchRequest) -> std::io::Result { - let json = serde_json::json!({ - "argv": std::iter::once(request.argv0).chain(request.args).collect::>(), - "env": request.env, - "cwd": request.working_dir, - }) - .to_string(); - let pid = bindings::s2::process::host::spawn(&json); - let mut input = request.open_files.remove_fd(0); - if matches!(input, Some(OpenFile::Stdin(_))) { - input = None; - } - let mut output = request.open_files.remove_fd(1); - let mut error = request.open_files.remove_fd(2); - // Brush waits for pipeline stages sequentially. Pump every child's IO independently. - let pump = tokio::spawn(async move { - let mut pending = Vec::new(); - let mut eof = input.is_none(); - let mut closed = output.is_none(); - loop { - if pending.is_empty() && !eof { - let mut buf = [0; 8192]; - match input - .as_mut() - .expect("input exists until EOF") - .read(&mut buf) - { - Ok(0) => { - eof = true; - input = None; - } - Ok(n) => pending.extend_from_slice(&buf[..n]), - Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {} - Err(e) => return Err(e), - } - } - let (consumed, done, code, out, err) = - bindings::s2::process::host::exchange(pid, &pending, eof, closed); - pending.drain(..consumed as usize); - if let Some(writer) = output.as_mut() { - if let Err(e) = writer.write_all(&out) { - if e.kind() != std::io::ErrorKind::BrokenPipe { - return Err(e); - } - closed = true; - output = None; - } - } - if let Some(writer) = error.as_mut() { - writer.write_all(&err)?; - } - if done { - return Ok(ExecutionResult::new(code as u8)); - } - tokio::task::yield_now().await; - } - }); - Ok(ChildProcess::from_future(async move { - pump.await.map_err(std::io::Error::other)? - })) -} -pub(crate) fn exec(_request: LaunchRequest) -> std::io::Error { - std::io::ErrorKind::Unsupported.into() -} diff --git a/spikes/s2-shell/patch-brush.nu b/spikes/s2-shell/patch-brush.nu deleted file mode 100644 index 5af8c55..0000000 --- a/spikes/s2-shell/patch-brush.nu +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env nu -# Apply the experiment only to the pinned scratch checkout. -def main [] { - let root = '/tmp/s2-shell/brush' - let revision = (^git -C $root rev-parse HEAD | str trim) - if $revision != '943553433ae04f5b3bd55d2cf207e39eb9ef2af7' { error make {msg: 'unexpected brush revision'} } - let core = ($root | path join brush-core) - cp ($env.FILE_PWD | path join guest-process.rs) ($core | path join src sys wasm process.rs) - cp ($env.FILE_PWD | path join process.wit) ($core | path join s2-process.wit) - let manifest = ($core | path join Cargo.toml) - let text = (open --raw $manifest) - let marker = "[target.'cfg(target_family = \"wasm\")'.dependencies]" - if not ($text | str contains 'wit-bindgen =') { - $text | str replace $marker ($marker + "\nwit-bindgen = \"0.46\"\nserde_json = \"1\"") | save -f $manifest - } -} diff --git a/spikes/s2-shell/process.wit b/spikes/s2-shell/process.wit deleted file mode 100644 index a685acc..0000000 --- a/spikes/s2-shell/process.wit +++ /dev/null @@ -1,6 +0,0 @@ -package s2:process; -interface host { - spawn: func(request: string) -> u32; - exchange: func(pid: u32, input: list, eof: bool, close-output: bool) -> tuple, list>; -} -world shell { import host; } diff --git a/spikes/s2-shell/src/main.rs b/spikes/s2-shell/src/main.rs deleted file mode 100644 index 3be8765..0000000 --- a/spikes/s2-shell/src/main.rs +++ /dev/null @@ -1,90 +0,0 @@ -//! Runs the shell component against one virtual world root for the S2 experiment. -mod process; -use sausage_vfs::{ - Host, Mounts, Process, - adapter::{self, Adapter, View}, -}; -use std::sync::Arc; -use wasmtime::{ - Engine, Store, - component::{Component, Linker, ResourceTable}, -}; -use wasmtime_wasi::{WasiCtx, WasiCtxBuilder, WasiCtxView, WasiView}; - -struct State { - wasi: WasiCtx, - table: ResourceTable, - fs: Adapter, - runtime: Arc, - children: Vec, -} -impl WasiView for State { - fn ctx(&mut self) -> WasiCtxView<'_> { - WasiCtxView { - ctx: &mut self.wasi, - table: &mut self.table, - } - } -} - -#[tokio::main] -async fn main() -> anyhow::Result<()> { - let args: Vec = std::env::args().collect(); - anyhow::ensure!( - args.len() == 5 && args[3] == "-c", - "usage: s2-shell WORLD SHELL.wasm -c SCRIPT" - ); - let mut config = wasmtime::Config::new(); - let mut cache = wasmtime::CacheConfig::new(); - cache.with_directory("/tmp/s2-shell/cache"); - config.cache(Some(wasmtime::Cache::new(cache)?)); - let engine = Engine::new(&config)?; - let component = Component::from_file(&engine, &args[2])?; - let runtime = Arc::new(process::Runtime { - engine: engine.clone(), - utility: Component::from_file(&engine, std::path::Path::new(&args[1]).join("bin/cat"))?, - world: args[1].clone().into(), - }); - let mut mounts = Mounts::default(); - mounts.mount( - "/", - Arc::new(Host::new(&args[1], Process::default())?), - false, - ); - let mut linker = Linker::new(&engine); - wasmtime_wasi::p2::add_to_linker_async(&mut linker)?; - adapter::add_to_linker(&mut linker, |s: &mut State| View { - adapter: &mut s.fs, - table: &mut s.table, - })?; - process::add(&mut linker)?; - let mut wasi = WasiCtxBuilder::new(); - wasi.inherit_stdio() - .args(&["sh", "--noprofile", "--norc", "-c", &args[4]]) - .env("PATH", "/bin") - .env("HOME", "/") - .env("PWD", "/") - .initial_cwd("/"); - let mut store = Store::new( - &engine, - State { - wasi: wasi.build(), - table: ResourceTable::new(), - fs: Adapter::new(mounts), - runtime, - children: Vec::new(), - }, - ); - let command = - wasmtime_wasi::p2::bindings::Command::instantiate_async(&mut store, &component, &linker) - .await?; - let code = match command.wasi_cli_run().call_run(&mut store).await { - Ok(Ok(())) => 0, - Ok(Err(())) => 1, - Err(error) => match error.downcast_ref::() { - Some(exit) => exit.0, - None => return Err(error.into()), - }, - }; - std::process::exit(code); -} diff --git a/spikes/s2-shell/src/process.rs b/spikes/s2-shell/src/process.rs deleted file mode 100644 index 8c0d62e..0000000 --- a/spikes/s2-shell/src/process.rs +++ /dev/null @@ -1,191 +0,0 @@ -//! Starts a uutils component in its own store and exchanges bounded pipe chunks. -use super::State; -use sausage_vfs::{ - Host, Mounts, Process, - adapter::{self, Adapter, View}, -}; -use serde::Deserialize; -use std::{ - path::PathBuf, - sync::{ - Arc, - atomic::{AtomicI32, Ordering}, - }, -}; -use tokio::net::UnixStream; -use wasmtime::{ - Engine, Store, StoreContextMut, - component::{Component, Linker, ResourceTable}, -}; -use wasmtime_wasi::{ - WasiCtxBuilder, - cli::{AsyncStdinStream, AsyncStdoutStream}, -}; - -pub struct Runtime { - pub engine: Engine, - pub utility: Component, - pub world: PathBuf, -} -pub struct Child { - input: Option, - output: Option, - error: Option, - code: Arc, -} -#[derive(Deserialize)] -struct Request { - argv: Vec, - env: Vec<(String, String)>, - cwd: String, -} -fn pair() -> wasmtime::Result<(UnixStream, UnixStream)> { - let (a, b) = std::os::unix::net::UnixStream::pair()?; - a.set_nonblocking(true)?; - b.set_nonblocking(true)?; - Ok((UnixStream::from_std(a)?, UnixStream::from_std(b)?)) -} -fn drain(pipe: &mut Option) -> wasmtime::Result> { - let Some(stream) = pipe else { - return Ok(Vec::new()); - }; - let mut bytes = vec![0; 8192]; - match stream.try_read(&mut bytes) { - Ok(0) => { - *pipe = None; - bytes.clear(); - } - Ok(n) => bytes.truncate(n), - Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => bytes.clear(), - Err(e) => return Err(e.into()), - } - Ok(bytes) -} -pub fn add(linker: &mut Linker) -> wasmtime::Result<()> { - let mut host = linker.instance("s2:process/host")?; - host.func_wrap( - "spawn", - |mut store: StoreContextMut<'_, State>, (json,): (String,)| { - let request: Request = serde_json::from_str(&json)?; - let runtime = store.data().runtime.clone(); - let name = std::path::Path::new(&request.argv[0]) - .file_name() - .ok_or_else(|| wasmtime::format_err!("missing command name"))?; - wasmtime::ensure!( - runtime.world.join("bin").join(name).is_file(), - "command is absent from /bin" - ); - let (input, child_input) = pair()?; - let (output, child_output) = pair()?; - let (error, child_error) = pair()?; - let code = Arc::new(AtomicI32::new(-1)); - let result_code = code.clone(); - tokio::spawn(async move { - let result = run(runtime, request, child_input, child_output, child_error).await; - let status = match result { - Ok(status) => status, - Err(error) => { - eprintln!("child component: {error:#}"); - 125 - } - }; - result_code.store(status, Ordering::Release); - }); - let state = store.data_mut(); - let pid = state.children.len() as u32; - state.children.push(Child { - input: Some(input), - output: Some(output), - error: Some(error), - code, - }); - Ok((pid,)) - }, - )?; - host.func_wrap( - "exchange", - |mut store: StoreContextMut<'_, State>, - (pid, bytes, eof, closed): (u32, Vec, bool, bool)| { - let child = &mut store.data_mut().children[pid as usize]; - let consumed = match child.input.as_mut() { - Some(input) if !bytes.is_empty() => match input.try_write(&bytes) { - Ok(n) => n, - Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => 0, - Err(e) if e.kind() == std::io::ErrorKind::BrokenPipe => { - child.input = None; - bytes.len() - } - Err(e) => return Err(e.into()), - }, - _ => bytes.len(), - }; - if eof && consumed == bytes.len() { - child.input = None; - } - if closed { - child.output = None; - } - let out = drain(&mut child.output)?; - let err = drain(&mut child.error)?; - let code = child.code.load(Ordering::Acquire); - let done = code >= 0 && child.output.is_none() && child.error.is_none(); - Ok(((consumed as u32, done, code.max(0) as u32, out, err),)) - }, - )?; - Ok(()) -} -async fn run( - runtime: Arc, - request: Request, - input: UnixStream, - output: UnixStream, - error: UnixStream, -) -> wasmtime::Result { - let mut mounts = Mounts::default(); - mounts.mount( - "/", - Arc::new(Host::new(&runtime.world, Process::default())?), - false, - ); - let mut linker = Linker::new(&runtime.engine); - wasmtime_wasi::p2::add_to_linker_async(&mut linker)?; - adapter::add_to_linker(&mut linker, |s: &mut State| View { - adapter: &mut s.fs, - table: &mut s.table, - })?; - let mut wasi = WasiCtxBuilder::new(); - let (reader, _) = input.into_split(); - let (_, writer) = output.into_split(); - let (_, err_writer) = error.into_split(); - wasi.args(&request.argv) - .envs(&request.env) - .env("S2_CWD", &request.cwd) - .initial_cwd(&request.cwd) - .stdin(AsyncStdinStream::new(reader)) - .stdout(AsyncStdoutStream::new(8192, writer)) - .stderr(AsyncStdoutStream::new(8192, err_writer)); - let mut store = Store::new( - &runtime.engine, - State { - wasi: wasi.build(), - table: ResourceTable::new(), - fs: Adapter::new(mounts), - runtime: runtime.clone(), - children: Vec::new(), - }, - ); - let command = wasmtime_wasi::p2::bindings::Command::instantiate_async( - &mut store, - &runtime.utility, - &linker, - ) - .await?; - match command.wasi_cli_run().call_run(&mut store).await { - Ok(Ok(())) => Ok(0), - Ok(Err(())) => Ok(1), - Err(error) => match error.downcast_ref::() { - Some(exit) => Ok(exit.0), - None => Err(error), - }, - } -} diff --git a/spikes/s2-shell/timings.nu b/spikes/s2-shell/timings.nu deleted file mode 100644 index 32d210b..0000000 --- a/spikes/s2-shell/timings.nu +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env nu -# Time each corpus construct after compare.nu creates the worlds and warms the cache. -def main [host: path, shell: path] { - let root = '/tmp/s2-shell/comparison' - let cases = [ - {name: 'command substitution: pwd', script: 'printf "%s\n" "$(pwd)"'} - {name: 'command substitution: cat | tr', script: 'printf "%s\n" "$(cat f | tr a-z A-Z)"'} - {name: 'glob: ls | wc', script: 'ls *.txt | wc -l'} - {name: 'subshell: cd', script: '( cd sub && pwd )'} - {name: 'quoted heredoc', script: "cat <<'EOF'\n$HOME stays literal\nEOF\n"} - {name: 'stderr and append redirects', script: 'cat missing 2>/dev/null >> log; cat f 2>/dev/null >> log; cat log'} - {name: 'stdin redirect', script: 'wc -l < file'} - {name: 'glob loop', script: 'for f in *; do printf "entry=%s\n" "$f"; done'} - {name: 'false || echo', script: 'false || echo ok'} - {name: 'exit status', script: 'false; echo $?'} - {name: 'stderr and child exit', script: 'cat missing'} - {name: 'whole-root traversal', script: '( cd sub && cd ../../other && pwd && cd ../work && pwd )'} - {name: 'external paths across root', script: 'cd ../other; pwd; cat ../work/f; cat @ROOT@/work/f'} - {name: 'yes | head', script: 'yes | head -n 2'} - ] - let results = ($cases | each {|case| - let script = ('cd work; ' + $case.script) - let native_root = ($root | path join native) - let start = (date now) - let native = (do { cd $native_root; ^bash --noprofile --norc -c ($script | str replace --all '@ROOT@' $native_root) } | complete) - let native_ms = (((date now) - $start) / 1ms) - let start = (date now) - let guest = (^$host ($root | path join guest) $shell -c ($script | str replace --all '@ROOT@' '') | complete) - let guest_ms = (((date now) - $start) / 1ms) - let equal = (($native.stdout | str replace --all $native_root '') == $guest.stdout and $native.exit_code == $guest.exit_code) - if not $equal { error make {msg: $'case failed: ($case.name)', help: $guest.stderr} } - if $native.stderr != '' and $guest.stderr == '' { error make {msg: 'child stderr was lost'} } - {command: $case.name, native_ms: $native_ms, guest_ms: $guest_ms, exit: $guest.exit_code, equal: $equal} - }) - $results | to json -} diff --git a/spikes/s2-shell/userland/Cargo.lock b/spikes/s2-shell/userland/Cargo.lock deleted file mode 100644 index d2617f4..0000000 --- a/spikes/s2-shell/userland/Cargo.lock +++ /dev/null @@ -1,1505 +0,0 @@ -# This file is automatically @generated by Cargo. -# 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 = "aho-corasick" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" -dependencies = [ - "memchr", -] - -[[package]] -name = "android_system_properties" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" -dependencies = [ - "libc", -] - -[[package]] -name = "ansi-width" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90759a65f5178dbbd1b0eecc97b187996401bced0eb4a943d9ac6d7a6304d111" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "anstream" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" - -[[package]] -name = "anstyle-parse" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" -dependencies = [ - "anstyle", - "once_cell_polyfill", - "windows-sys", -] - -[[package]] -name = "autocfg" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" - -[[package]] -name = "bigdecimal" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fa3f3d8cbf4dffcfe4991de61d012bef509a409ecbe9dd41049bfe32b4d4653" -dependencies = [ - "autocfg", - "libm", - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" - -[[package]] -name = "bstr" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bb31b46c14244e20ee9984b11bf5c992b91fb6939fea616e3512c8baecdbe5f" -dependencies = [ - "memchr", - "serde_core", -] - -[[package]] -name = "bumpalo" -version = "3.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" - -[[package]] -name = "bytecount" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" - -[[package]] -name = "cc" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ff2a8126fff0f8c839080d619675a585e61720bb12d2baceae45769fd66f155" -dependencies = [ - "find-msvc-tools", - "shlex", -] - -[[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 = "chrono" -version = "0.4.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" -dependencies = [ - "iana-time-zone", - "num-traits", - "windows-link", -] - -[[package]] -name = "clap" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" -dependencies = [ - "clap_builder", -] - -[[package]] -name = "clap_builder" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", - "terminal_size", -] - -[[package]] -name = "clap_lex" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" - -[[package]] -name = "colorchoice" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "crc32fast" -version = "1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f97d3416d5337d15c4b0d78c8c91df922ca143f57ec20e2d1c188333047ef04" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "defmt" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a0795ac740cb54d7b3775c9c17345f6aaecf884c01733b39d6017738e0e3e1" -dependencies = [ - "bitflags 1.3.2", - "defmt-macros", -] - -[[package]] -name = "defmt-macros" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "840bb056bd99c495c9188198a258ab787c79f306d864db3e6e8451442d6d8366" -dependencies = [ - "defmt-parser", - "proc-macro2", - "quote", - "syn 3.0.9", -] - -[[package]] -name = "defmt-parser" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71958f69fb2de856c5dd51ac9377e986ca1aa5919f931bf5395a807277f889a0" -dependencies = [ - "thiserror", -] - -[[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.9", -] - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "either" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be" - -[[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 = "find-msvc-tools" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c66915cc5391097de7a2b0b972e8505aa33c0df401fd3a6811dbdb32881ba48" - -[[package]] -name = "flate2" -version = "1.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626d4928326b646e70f65ed36fc7cf9f206bdb68a0019ee7c6b4709da4e084c4" -dependencies = [ - "crc32fast", - "miniz_oxide", - "zlib-rs", -] - -[[package]] -name = "fluent" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8137a6d5a2c50d6b0ebfcb9aaa91a28154e0a70605f112d30cb0cd4a78670477" -dependencies = [ - "fluent-bundle", - "unic-langid", -] - -[[package]] -name = "fluent-bundle" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01203cb8918f5711e73891b347816d932046f95f54207710bda99beaeb423bf4" -dependencies = [ - "fluent-langneg", - "fluent-syntax", - "intl-memoizer", - "intl_pluralrules", - "rustc-hash", - "self_cell", - "smallvec", - "unic-langid", -] - -[[package]] -name = "fluent-langneg" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eebbe59450baee8282d71676f3bfed5689aeab00b27545e83e5f14b1195e8b0" -dependencies = [ - "unic-langid", -] - -[[package]] -name = "fluent-syntax" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54f0d287c53ffd184d04d8677f590f4ac5379785529e5e08b1c8083acdd5c198" -dependencies = [ - "memchr", - "thiserror", -] - -[[package]] -name = "futures-core" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" - -[[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-task", - "pin-project-lite", - "slab", -] - -[[package]] -name = "glob" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hostname" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617aaa3557aef3810a6369d0a99fac8a080891b68bd9f9812a1eeda0c0730cbd" -dependencies = [ - "cfg-if", - "libc", - "windows-link", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu_collator" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24cb0205c419b2036da3f9082964905d6849b3f2130dd4a517940c45899a544b" -dependencies = [ - "icu_collator_data", - "icu_collections", - "icu_locale_core", - "icu_locale_fallback", - "icu_normalizer", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "zerovec", -] - -[[package]] -name = "icu_collator_data" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "183f47e821a327661c1ebe152f61d5b6c2000010d228cadbbf226e0e2b8c2634" - -[[package]] -name = "icu_collections" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe090a42a0d3140fed8c63263ed1fecc02422cb2f4bfe55cd8de2de1b8e105dd" -dependencies = [ - "displaydoc", - "potential_utf", - "utf8_iter", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe8fa57bcddc15cb921582ee5259c5b77da39f946f188ca5213fad24d9241236" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_locale_data", - "icu_locale_fallback", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25d29b57c17c6528d0dc4c2141cfa2d08200465acb537a3909c8b9b8a4a984c0" -dependencies = [ - "displaydoc", - "litemap", - "serde", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locale_data" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64014dac577a11d8d2cee48517c73c1984bd72ab11031e934269bd3cefb2ad9" - -[[package]] -name = "icu_locale_fallback" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406e9ae5b95d8aa37db6293405931b766a6172d1848daee22d70eb44aa78a43c" -dependencies = [ - "icu_locale_core", - "icu_locale_fallback_data", - "icu_provider", - "potential_utf", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locale_fallback_data" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3632ebbd0c5c3637ba1a40bdf8288f2cb9d2268e73441a69d5fc73d7cfbaa87c" - -[[package]] -name = "icu_normalizer" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "404a3b8c486f205c87fe7f23ab6894d84a4ad76d6e4671ae1981ba7def87c599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20f0088bfb7441f7a37fa0c9e20cb1e9cba1cac6b9ce8cd2a6dc44294f8e8cbc" - -[[package]] -name = "icu_properties" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ea83d991c56158f7cf898bf86436c1dfe7c07ee82fe88951f2695c9f37a379f" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98f29af82d02b163fe50161388350e743bb3107cc8e8c2f7314cb505faddfcf" - -[[package]] -name = "icu_provider" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413099315636c588ee8f011190b329b971a09a8fae9d157e01dcae8379468514" -dependencies = [ - "displaydoc", - "icu_locale_core", - "serde", - "stable_deref_trait", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "intl-memoizer" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310da2e345f5eb861e7a07ee182262e94975051db9e4223e909ba90f392f163f" -dependencies = [ - "type-map", - "unic-langid", -] - -[[package]] -name = "intl_pluralrules" -version = "7.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972" -dependencies = [ - "unic-langid", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" - -[[package]] -name = "itertools" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" -dependencies = [ - "either", -] - -[[package]] -name = "jiff" -version = "0.2.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ac703058abac89e5c39b0b879dce2b6b14a4ba36600c7e7e3d0c60a6883ef3c" -dependencies = [ - "defmt", - "jiff-core", - "jiff-static", - "jiff-tzdb-platform", - "log", - "portable-atomic", - "portable-atomic-util", - "serde_core", - "windows-link", -] - -[[package]] -name = "jiff-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aee43309eb53bafb8c36d35d6e444769c8f8e6206a9fbf7546f5db9d7d4a0e93" -dependencies = [ - "defmt", - "log", -] - -[[package]] -name = "jiff-static" -version = "0.2.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dc32470c67eb7d0e9ccb74303fa925313dc04cecb1aa048beaa6f391e36a93d" -dependencies = [ - "jiff-core", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "jiff-tzdb" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa8377070c6bae868759445e5a77f66d84f0b72f3a054bfb00e6d038b8282da7" - -[[package]] -name = "jiff-tzdb-platform" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" -dependencies = [ - "jiff-tzdb", -] - -[[package]] -name = "js-sys" -version = "0.3.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dc09d2154098bbf4ef54eab6b117a3c24cbbffe94046b16ee6d6d4510584d3a" -dependencies = [ - "cfg-if", - "futures-util", - "wasm-bindgen", -] - -[[package]] -name = "libc" -version = "0.2.191" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" - -[[package]] -name = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - -[[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 = "log" -version = "0.4.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d15f86d12da44cd8d4ec3c73984537eb7f4cadcb9776a575a0a8a05ca11005c" - -[[package]] -name = "lscolors" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d60e266dfb1426eb2d24792602e041131fdc0236bb7007abc0e589acafd60929" -dependencies = [ - "aho-corasick", - "nu-ansi-term", -] - -[[package]] -name = "memchr" -version = "2.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" - -[[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 = "nix" -version = "0.31.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" -dependencies = [ - "bitflags 2.13.2", - "cfg-if", - "cfg_aliases", - "libc", -] - -[[package]] -name = "nom" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" -dependencies = [ - "memchr", -] - -[[package]] -name = "nu-ansi-term" -version = "0.50.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" -dependencies = [ - "windows-sys", -] - -[[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-integer" -version = "0.1.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" -dependencies = [ - "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 = "once_cell_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" - -[[package]] -name = "os_display" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad5fd71b79026fb918650dde6d125000a233764f1c2f1659a1c71118e33ea08f" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" - -[[package]] -name = "portable-atomic" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" - -[[package]] -name = "portable-atomic-util" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10ab3eb7f3becc3a1cbc4f2c6f20267996cfc1a6467a873763411b136a122715" -dependencies = [ - "portable-atomic", -] - -[[package]] -name = "potential_utf" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" -dependencies = [ - "serde_core", - "writeable", - "zerovec", -] - -[[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 = "procfs" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25485360a54d6861439d60facef26de713b1e126bf015ec8f98239467a2b82f7" -dependencies = [ - "bitflags 2.13.2", - "chrono", - "flate2", - "procfs-core", - "rustix", -] - -[[package]] -name = "procfs-core" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6401bf7b6af22f78b563665d15a22e9aef27775b79b149a66ca022468a4e405" -dependencies = [ - "bitflags 2.13.2", - "chrono", - "hex", -] - -[[package]] -name = "quote" -version = "1.0.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rustc-hash" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" - -[[package]] -name = "rustix" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5e76742e5294153d4dde1207dbec5bdd81eef6fabdc0d2118babadabfd858aa" -dependencies = [ - "bitflags 2.13.2", - "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 = "s2-userland" -version = "0.1.0" -dependencies = [ - "rustix", - "uu_cat", - "uu_head", - "uu_ls", - "uu_tr", - "uu_wc", - "uu_yes", - "uucore", -] - -[[package]] -name = "self_cell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab42ca02749e120097e328d91d415325bdf43b1c72c4c8badf37375fe40a813" - -[[package]] -name = "serde" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", -] - -[[package]] -name = "shlex" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" - -[[package]] -name = "simd-adler32" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "smallvec" -version = "1.16.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0d5d4b1981b8bbbb7aed204cae5726d683d5d6ac7e74ec54122ea28f315e7c8" - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" -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.9", -] - -[[package]] -name = "terminal_size" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874" -dependencies = [ - "rustix", - "windows-sys", -] - -[[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.9", -] - -[[package]] -name = "tinystr" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abc840c238154d58f9e86b2792261edfde565a17696e1cda1a449de27979801a" -dependencies = [ - "displaydoc", - "serde_core", - "zerovec", -] - -[[package]] -name = "type-map" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90" -dependencies = [ - "rustc-hash", -] - -[[package]] -name = "unic-langid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28ba52c9b05311f4f6e62d5d9d46f094bd6e84cb8df7b3ef952748d752a7d05" -dependencies = [ - "unic-langid-impl", -] - -[[package]] -name = "unic-langid-impl" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce1bf08044d4b7a94028c93786f8566047edc11110595914de93362559bc658" -dependencies = [ - "tinystr", -] - -[[package]] -name = "unicode-ident" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" - -[[package]] -name = "unicode-width" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca718471876992059f251e33aafc334346ada08042b7661dd1fe313a9bced557" - -[[package]] -name = "unit-prefix" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" - -[[package]] -name = "utf16_iter" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7de35d9d8757dbc1f5125dc8b51438c68b4430546a735c3a9b91aaaaf9a18a" -dependencies = [ - "utf_types", -] - -[[package]] -name = "utf8_iter" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af3bd9d3e571c26fcce9d033b87ea5ab061b8d2ffe9b7a5675d810d68f03edf0" -dependencies = [ - "utf_types", -] - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "utf_types" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3b425286980a367278453f3b6d28cdcb134b574e5a35824a6ff5eebad50bb6" - -[[package]] -name = "uu_cat" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75143ac91809c365ca76bb141ea2a7a35ffdf821046f52e14bd83b710bb5ce34" -dependencies = [ - "clap", - "fluent", - "memchr", - "rustix", - "thiserror", - "uucore", - "windows-sys", -] - -[[package]] -name = "uu_head" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d8bd166467c73ad000c303a0d8c3c3fa03160000bb4493cfd40b8f7816fb95" -dependencies = [ - "clap", - "fluent", - "memchr", - "thiserror", - "uucore", -] - -[[package]] -name = "uu_ls" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8f956231b30edd22f1c0ef803d6928da0d7cb5f07add01a4d15e5b2d4a2540" -dependencies = [ - "ansi-width", - "clap", - "fluent", - "glob", - "hostname", - "lscolors", - "rustc-hash", - "terminal_size", - "thiserror", - "uucore", - "uutils_term_grid", -] - -[[package]] -name = "uu_tr" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bc8f860fa347eaf1505a3da8ac292559980c1103b5978ba4f1142aff0755b00" -dependencies = [ - "bytecount", - "clap", - "fluent", - "nom", - "uucore", -] - -[[package]] -name = "uu_wc" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e45457ac8613955d62a62e2cea12aab7023a4d015c24a30b4719ee9138d8598d" -dependencies = [ - "bytecount", - "clap", - "fluent", - "libc", - "rustix", - "thiserror", - "unicode-width", - "uucore", -] - -[[package]] -name = "uu_yes" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a00721c606207353591d7d5a4fe6c89d94073decccd061392f3f0dea1c37af4" -dependencies = [ - "clap", - "fluent", - "itertools", - "rustix", - "uucore", -] - -[[package]] -name = "uucore" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f24a5910ebbf2c0baf486a9125705f8e026a8f7741a3ea8cf5eca3c9257c9bdf" -dependencies = [ - "bigdecimal", - "bstr", - "clap", - "dunce", - "fluent", - "fluent-syntax", - "glob", - "icu_collator", - "icu_locale", - "itertools", - "jiff", - "libc", - "nix", - "num-traits", - "os_display", - "procfs", - "rustc-hash", - "rustix", - "thiserror", - "unic-langid", - "unicode-width", - "unit-prefix", - "uucore_procs", - "wild", - "windows-sys", - "xattr", -] - -[[package]] -name = "uucore_procs" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50aa1f3bba55168888ae6f1f2714ce58897d8020d742d21f474f01e86468fedd" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "uutils_term_grid" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70bdc0434ef5f30856fbe0908a7d96568f8b212a28c20b16d44851f753e465f" -dependencies = [ - "ansi-width", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0181c14ddd6c7b8b0b0132a5f1ea2f32be0d893cd3ea97b6e3b28886b8a3d1c" -dependencies = [ - "cfg-if", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e931a02a39abdbf66966fc35902b5ed58344750a70885bed4ebb3d8eaf28ed9" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca4b54280e455bd831e33a6b8e734baf432fe63fbc35c42ac14ce67a043a53a" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 3.0.9", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b1f9c3798725016c6ee5f2f57869ec0831e8bbc0ab0310a86e787e97f41389e" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wild" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3131afc8c575281e1e80f36ed6a092aa502c08b18ed7524e86fbbb12bb410e1" -dependencies = [ - "glob", -] - -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[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.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" - -[[package]] -name = "xattr" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963d6fab92d5504b971dc8bd90ca743c2575e590bc8071ea5bc571598667ae08" -dependencies = [ - "libc", - "rustix", -] - -[[package]] -name = "yoke" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "417ef3fcf6c300b7dbd25c85531a746931c02ad536f3cf4786ed1e88223340b3" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", - "synstructure", -] - -[[package]] -name = "zerofrom" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", - "synstructure", -] - -[[package]] -name = "zerotrie" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "zerovec" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58a2799cfe9a1670c7ea8edbd52ef8edb93cb37a7f83bf31ba9e35d9dae6a40" -dependencies = [ - "serde", - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3743ddbf47738d929cd1ae2e199d40d0162979dfe31aef8ae646d2bf00bf97a" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", -] - -[[package]] -name = "zlib-rs" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" diff --git a/spikes/s2-shell/userland/Cargo.toml b/spikes/s2-shell/userland/Cargo.toml deleted file mode 100644 index 027a011..0000000 --- a/spikes/s2-shell/userland/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "s2-userland" -version = "0.1.0" -edition = "2024" - -[workspace] - -[dependencies] -# uucore enables rustix without its std adapters. WASI needs those adapters. -rustix = { version = "1.1.6", features = ["std"] } -uucore = "=0.12.0" -uu_cat = "=0.12.0" -uu_tr = "=0.12.0" -uu_ls = "=0.12.0" -uu_wc = "=0.12.0" -uu_yes = "=0.12.0" -uu_head = "=0.12.0" diff --git a/spikes/s2-shell/userland/src/main.rs b/spikes/s2-shell/userland/src/main.rs deleted file mode 100644 index 6eff9d5..0000000 --- a/spikes/s2-shell/userland/src/main.rs +++ /dev/null @@ -1,24 +0,0 @@ -//! Dispatches uutils 0.12 commands after libc adopts the process working directory. -fn main() { - // wasi-libc starts at / and does not consume wasi:cli/environment.initial-cwd. - std::env::set_current_dir(std::env::var("S2_CWD").expect("host supplies cwd")) - .expect("process working directory exists"); - let argv0 = std::env::args().next().expect("host supplies argv0"); - let name = std::path::Path::new(&argv0) - .file_name() - .unwrap() - .to_str() - .unwrap(); - uucore::locale::setup_localization(name).expect("utility supplies localization"); - let args = uucore::args_os(); - let code = match name { - "cat" => uu_cat::uumain(args), - "tr" => uu_tr::uumain(args), - "ls" => uu_ls::uumain(args), - "wc" => uu_wc::uumain(args), - "yes" => uu_yes::uumain(args), - "head" => uu_head::uumain(args), - _ => unreachable!("fixture supplies the six uutils aliases"), - }; - std::process::exit(code); -} diff --git a/spikes/s3-git/0001-wasi-no-syslog-header.patch b/spikes/s3-git/0001-wasi-no-syslog-header.patch deleted file mode 100644 index f55c945..0000000 --- a/spikes/s3-git/0001-wasi-no-syslog-header.patch +++ /dev/null @@ -1,6 +0,0 @@ ---- a/git-compat-util.h -+++ b/git-compat-util.h -@@ -282,1 +282,3 @@ -+#ifndef __wasi__ - #include -+#endif diff --git a/spikes/s3-git/README.md b/spikes/s3-git/README.md deleted file mode 100644 index d33e499..0000000 --- a/spikes/s3-git/README.md +++ /dev/null @@ -1,85 +0,0 @@ -# Upstream Git WASI spike - -Status: the agentOS baseline builds Git 2.55.0 for WASI. Diagnostic preload tests fail during startup. -The binary is `/tmp/s3-git/agentos/toolchain/c/build/git` (3,987,814 bytes). -See `.board/T3.report.md` for all 87 imports and the measured operation results. - -## Rework 1: unchanged agentOS baseline - -`baseline.nu` invokes the pinned agentOS sysroot script through `bash`, then invokes its Git Makefile target. -The clone lives at `/tmp/s3-git/agentos`, commit `605f76de28366118c84e92ca6fd4938c1c501025`. -The launcher expects `/tmp/s3-git/tools/nproc` to print `2` to limit compiler jobs. - -Rework 2 added Python3 as an upstream build dependency. The unchanged build then succeeded. - -```sh -nix shell nixpkgs#gnumake nixpkgs#cmake nixpkgs#ninja nixpkgs#gcc nixpkgs#patch nixpkgs#perl nixpkgs#python3 -c nu spikes/s3-git/baseline.nu -nix develop -c nu spikes/s3-git/stubs.nu /tmp/s3-git/agentos/toolchain/c/build/git /tmp/s3-git/stubs -mkdir -p /tmp/s3-git/dev -touch /tmp/s3-git/dev/null -nix develop -c nu spikes/s3-git/test.nu /tmp/s3-git/agentos/toolchain/c/build/git --stubs /tmp/s3-git/stubs -nix develop -c nu spikes/s3-git/probe.nu /tmp/s3-git/agentos/toolchain/c/build/git /tmp/s3-git/stubs -``` - -`stubs.nu` extracts imports and generates the five WAT preload modules. -The repository also contains those concrete WAT files. -`test.nu` fails at the first unsuccessful operation. -`probe.nu` records every operation independently. Native Git creates its fixtures. -All WASI probes fail at Git's startup open of `/dev/null` with the diagnostic stubs. -An exit code of zero from `probe.nu` means that it recorded results, not that Git passed. - -## Original stock-SDK attempt - -The brief defines the intended local operations. `test.nu` exercises those operations through Wasmtime. -The script needs a successful build before it can verify behavior. - -## Reproduce the build failure - -The experiment uses Git 2.49.0, zlib 1.3.1, and WASI SDK 34.0 for Linux ARM64. -Run these commands from the repository root. Keep the extracted sources under `/tmp/s3-git`. - -```sh -mkdir -p /tmp/s3-git -curl -fL https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-34/wasi-sdk-34.0-arm64-linux.tar.gz -o /tmp/s3-git/sdk.tar.gz -tar -xf /tmp/s3-git/sdk.tar.gz -C /tmp/s3-git -curl -fL https://www.kernel.org/pub/software/scm/git/git-2.49.0.tar.xz -o /tmp/s3-git/git.tar.xz -tar -xf /tmp/s3-git/git.tar.xz -C /tmp/s3-git -curl -fL https://zlib.net/fossils/zlib-1.3.1.tar.gz -o /tmp/s3-git/zlib.tar.gz -tar -xf /tmp/s3-git/zlib.tar.gz -C /tmp/s3-git -nix build nixpkgs#ncurses --no-link -``` - -Set `LD_LIBRARY_PATH` to the SDK's `lib` directory and `$(nix eval --raw nixpkgs#ncurses.outPath)/lib`. -In `/tmp/s3-git/zlib-1.3.1`, run: - -```sh -CC=/tmp/s3-git/wasi-sdk-34.0-arm64-linux/bin/clang AR=/tmp/s3-git/wasi-sdk-34.0-arm64-linux/bin/llvm-ar RANLIB=/tmp/s3-git/wasi-sdk-34.0-arm64-linux/bin/llvm-ranlib ./configure --static -nix shell nixpkgs#gnumake -c make -j2 libz.a -``` - -Apply `0001-wasi-no-syslog-header.patch` with `patch -p1` in the Git source directory. -From the repository root, run: - -```sh -nix shell nixpkgs#gnumake -c nu spikes/s3-git/build.nu -``` - -This fails because the stock sysroot lacks `sys/wait.h`. -The patch only suppresses an unavailable header. It does not implement syslog or process support. - -## Required verification after a successful build - -```sh -nix develop -c nu spikes/s3-git/test.nu /tmp/s3-git/git-2.49.0/git -``` - -Run the same script with the adapted component path after `wasm-tools component new --adapt`. -Neither execution passed in this spike. - -## Source checksums - -```text -f7e243dff54d60bcc576e94d6166b69f410f2500ae4a9ceef34315be10e77971 sdk.tar.gz -618190cf590b7e9f6c11f91f23b1d267cd98c3ab33b850416d8758f8b5a85628 git.tar.xz -9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23 zlib.tar.gz -``` diff --git a/spikes/s3-git/baseline.nu b/spikes/s3-git/baseline.nu deleted file mode 100644 index 9b551f0..0000000 --- a/spikes/s3-git/baseline.nu +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env nu -# Invoke agentOS's unchanged recipe and sysroot build with two compiler jobs. -def main [] { - $env.PATH = ($env.PATH | prepend /tmp/s3-git/tools) - $env.LD_LIBRARY_PATH = $'((nix eval --raw nixpkgs#ncurses.outPath))/lib' - $env.TMPDIR = '/tmp/s3-git' - $env.MAKE_JOBS = '2' - cd /tmp/s3-git/agentos - ^bash toolchain/scripts/patch-wasi-libc.sh - ^make -C toolchain/c build/git -} diff --git a/spikes/s3-git/build.nu b/spikes/s3-git/build.nu deleted file mode 100644 index 65a822e..0000000 --- a/spikes/s3-git/build.nu +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env nu -# Build upstream Git's local CLI with the stock WASI SDK. Sources live in /tmp/s3-git. -def main [] { - let sdk = '/tmp/s3-git/wasi-sdk-34.0-arm64-linux' - let ncurses = (nix eval --raw nixpkgs#ncurses.outPath) - $env.LD_LIBRARY_PATH = $'($sdk)/lib:($ncurses)/lib' - cd /tmp/s3-git/git-2.49.0 - ^make -j2 uname_S=WASI $'CC=($sdk)/bin/clang' $'AR=($sdk)/bin/llvm-ar' $'RANLIB=($sdk)/bin/llvm-ranlib' 'CFLAGS=-O2 -I/tmp/s3-git/zlib-1.3.1 -D_WASI_EMULATED_PROCESS_CLOCKS -D_WASI_EMULATED_MMAN -D_WASI_EMULATED_SIGNAL' 'LDFLAGS=-L/tmp/s3-git/zlib-1.3.1 -lwasi-emulated-process-clocks -lwasi-emulated-mman -lwasi-emulated-signal -Wl,-z,stack-size=8388608 -Wl,--stack-first' CSPRNG_METHOD=getentropy HAVE_CLOCK_GETTIME=YesPlease HAVE_GETDELIM=YesPlease NO_OPENSSL=1 NO_CURL=1 NO_EXPAT=1 NO_GETTEXT=1 NO_TCLTK=1 NO_PERL=1 NO_PYTHON=1 NO_REGEX=NeedsStartEnd NO_ICONV=1 NO_PTHREADS=1 NO_MMAP=1 NO_SYS_POLL_H=1 NO_NSEC=1 git - if $env.LAST_EXIT_CODE != 0 { error make {msg: 'Git build failed'} } -} diff --git a/spikes/s3-git/host_fs.wat b/spikes/s3-git/host_fs.wat deleted file mode 100644 index e0a0745..0000000 --- a/spikes/s3-git/host_fs.wat +++ /dev/null @@ -1,16 +0,0 @@ -(module - (func (export "fd_mode") (param i32) (result i32) i32.const 420) - (func (export "fd_size") (param i32) (result i64) i64.const -1) - (func (export "fd_blocks") (param i32) (result i64) i64.const -1) - (func (export "fd_owner") (param i32 i32 i32) (result i32) i32.const 52) - (func (export "ftruncate") (param i32 i64) (result i32) i32.const 52) - (func (export "open_tmpfile") (param i32 i32 i32 i32 i32 i32) (result i32) i32.const 52) - (func (export "set_open_direct") (param i32) (result i32) i32.const 52) - (func (export "set_open_mode") (param i32) (result i32) i32.const 0) - (func (export "path_access") (param i32 i32 i32 i32 i32) (result i32) i32.const 52) - (func (export "path_mode") (param i32 i32 i32 i32) (result i32) i32.const 420) - (func (export "path_size") (param i32 i32 i32 i32) (result i64) i64.const -1) - (func (export "path_blocks") (param i32 i32 i32 i32) (result i64) i64.const -1) - (func (export "path_owner") (param i32 i32 i32 i32 i32 i32) (result i32) i32.const 52) - (func (export "chmod") (param i32 i32 i32 i32) (result i32) i32.const 52) -) \ No newline at end of file diff --git a/spikes/s3-git/host_net.wat b/spikes/s3-git/host_net.wat deleted file mode 100644 index 6b136a6..0000000 --- a/spikes/s3-git/host_net.wat +++ /dev/null @@ -1,15 +0,0 @@ -(module - (func (export "net_recv") (param i32 i32 i32 i32 i32) (result i32) i32.const 52) - (func (export "net_send") (param i32 i32 i32 i32 i32) (result i32) i32.const 52) - (func (export "net_socket") (param i32 i32 i32 i32) (result i32) i32.const 52) - (func (export "net_validate_socket") (param i32) (result i32) i32.const 52) - (func (export "net_connect") (param i32 i32 i32) (result i32) i32.const 52) - (func (export "net_bind") (param i32 i32 i32) (result i32) i32.const 52) - (func (export "net_listen") (param i32 i32) (result i32) i32.const 52) - (func (export "net_validate_accept") (param i32) (result i32) i32.const 52) - (func (export "net_accept") (param i32 i32 i32 i32) (result i32) i32.const 52) - (func (export "net_setsockopt") (param i32 i32 i32 i32 i32) (result i32) i32.const 52) - (func (export "net_getaddrinfo") (param i32 i32 i32 i32 i32 i32 i32) (result i32) i32.const 52) - (func (export "net_poll") (param i32 i32 i32 i32) (result i32) i32.const 52) - (func (export "net_dns_query_rr_v1") (param i32 i32 i32 i32 i32 i32 i32 i32) (result i32) i32.const 52) -) \ No newline at end of file diff --git a/spikes/s3-git/host_process.wat b/spikes/s3-git/host_process.wat deleted file mode 100644 index bf7c77f..0000000 --- a/spikes/s3-git/host_process.wat +++ /dev/null @@ -1,21 +0,0 @@ -(module - (func (export "proc_getpid") (param i32) (result i32) i32.const 52) - (func (export "proc_getppid") (param i32) (result i32) i32.const 52) - (func (export "proc_kill") (param i32 i32) (result i32) i32.const 52) - (func (export "fd_pipe") (param i32 i32) (result i32) i32.const 52) - (func (export "fd_dup") (param i32 i32) (result i32) i32.const 52) - (func (export "fd_dup2") (param i32 i32) (result i32) i32.const 52) - (func (export "proc_getrlimit") (param i32 i32 i32) (result i32) i32.const 52) - (func (export "proc_sigaction") (param i32 i32 i32 i32 i32) (result i32) i32.const 52) - (func (export "proc_signal_mask_v2") (param i32 i32 i32 i32 i32) (result i32) i32.const 52) - (func (export "proc_spawn_v4") (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) (result i32) i32.const 52) - (func (export "proc_waitpid_v3") (param i32 i32 i32 i32) (result i32) i32.const 52) - (func (export "fd_setfd") (param i32 i32) (result i32) i32.const 0) - (func (export "fd_dup_min") (param i32 i32 i32) (result i32) i32.const 52) - (func (export "fd_getfd") (param i32 i32) (result i32) i32.const 0) - (func (export "fd_record_lock") (param i32 i32 i32 i64 i64 i32 i32 i32 i32) (result i32) i32.const 52) - (func (export "proc_itimer_real") (param i32 i64 i64 i32 i32) (result i32) i32.const 52) - (func (export "proc_getpgid") (param i32 i32) (result i32) i32.const 52) - (func (export "proc_exec") (param i32 i32 i32 i32 i32 i32 i32 i32) (result i32) i32.const 52) - (func (export "proc_umask") (param i32 i32) (result i32) i32.const 52) -) \ No newline at end of file diff --git a/spikes/s3-git/host_tty.wat b/spikes/s3-git/host_tty.wat deleted file mode 100644 index f3b6465..0000000 --- a/spikes/s3-git/host_tty.wat +++ /dev/null @@ -1,4 +0,0 @@ -(module - (func (export "isatty") (param i32) (result i32) i32.const 52) - (func (export "set_raw_mode") (param i32) (result i32) i32.const 52) -) \ No newline at end of file diff --git a/spikes/s3-git/host_user.wat b/spikes/s3-git/host_user.wat deleted file mode 100644 index d9fa468..0000000 --- a/spikes/s3-git/host_user.wat +++ /dev/null @@ -1,7 +0,0 @@ -(module - (func (export "getpwnam") (param i32 i32 i32 i32 i32) (result i32) i32.const 52) - (func (export "getpwuid") (param i32 i32 i32 i32) (result i32) i32.const 52) - (func (export "getuid") (param i32) (result i32) i32.const 52) - (func (export "geteuid") (param i32) (result i32) i32.const 52) - (func (export "isatty") (param i32 i32) (result i32) i32.const 52) -) \ No newline at end of file diff --git a/spikes/s3-git/probe.nu b/spikes/s3-git/probe.nu deleted file mode 100644 index d722385..0000000 --- a/spikes/s3-git/probe.nu +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env nu -# Probe each WASI operation separately. Native Git creates only the test fixtures. -def main [binary: path, stubs: path] { - let binary = ($binary | path expand) - let preloads = (glob ($stubs | path join '*.wasm') | each {|p| ['--preload' $'($p | path parse | get stem)=($p)'] } | flatten) - let root = (^mktemp -d /tmp/s3-git/probe.XXXXXX | str trim) - let repo = ($root | path join repo) - mkdir $repo - $env.GIT_CONFIG_NOSYSTEM = '1' - $env.GIT_AUTHOR_NAME = 'Spike' - $env.GIT_AUTHOR_EMAIL = 'spike@example.invalid' - $env.GIT_COMMITTER_NAME = 'Spike' - $env.GIT_COMMITTER_EMAIL = 'spike@example.invalid' - def --wrapped native [...args: string] { ^git -C $repo -c commit.gpgsign=false ...$args } - def probe [label: string, args: list] { - let r = (^wasmtime run ...$preloads --dir /tmp/s3-git/dev::/dev --dir $'($root)::/repo' --env GIT_PAGER=cat --env GIT_EDITOR=true --env GIT_AUTHOR_NAME=Spike --env GIT_AUTHOR_EMAIL=spike@example.invalid --env GIT_COMMITTER_NAME=Spike --env GIT_COMMITTER_EMAIL=spike@example.invalid --env GIT_CONFIG_NOSYSTEM=1 --env HOME=/repo -- $binary -C /repo/repo -c core.pager=cat -c maintenance.auto=false ...$args | complete) - print $'=== ($label): exit ($r.exit_code) ===' - print $r.stdout - print --stderr $r.stderr - } - probe version ['--version'] - probe init ['init' '-b' 'main'] - native init -b main - 'base' | save ($repo | path join base) - probe add ['add' 'base'] - native add base - probe commit ['commit' '-m' 'base'] - native commit -m base - probe status ['status' '--short'] - probe log ['log' '--oneline'] - probe branch ['branch' 'wasi-branch'] - native branch feature - probe switch ['switch' 'feature'] - 'changed' | save --force ($repo | path join base) - probe diff ['diff'] - native reset --hard - native switch feature - 'feature' | save ($repo | path join feature) - native add feature - native commit -m feature - native switch main - probe fast-forward ['merge' '--ff-only' 'feature'] - native merge --ff-only feature - native branch side - 'main' | save ($repo | path join main) - native add main - native commit -m main - native switch side - 'side' | save ($repo | path join side) - native add side - native commit -m side - native switch main - probe three-way ['merge' '--no-edit' 'side'] - probe worktree ['worktree' 'add' '-b' 'linked' '/repo/linked'] - print $'Fixtures: ($root)' -} diff --git a/spikes/s3-git/stubs.nu b/spikes/s3-git/stubs.nu deleted file mode 100644 index 34ca0f6..0000000 --- a/spikes/s3-git/stubs.nu +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env nu -# Extract the complete import table and generate explicit unsupported host modules. -def main [binary: path, output: path] { - mkdir $output - let wat = (^wasm-tools print $binary) - $wat | save --force ($output | path join git.wat) - let types = ($wat | lines | parse -r '^ \(type \(;(?P\d+);\) \(func(?P.*)\)\)$') - let imports = ($wat | lines | parse -r '^ \(import "(?P[^"]+)" "(?P[^"]+)" \(func .*\(type (?P\d+)\).*\)\)$' | each {|i| - let sig = ($types | where id == $i.id | first | get sig) - {module: $i.module, name: $i.name, signature: ($sig | str trim)} - }) - $imports | to json | save --force ($output | path join imports.json) - for module in ($imports | get module | uniq | where {|m| $m | str starts-with 'host_' }) { - let functions = ($imports | where module == $module | each {|i| - let result = ($i.signature | parse -r '\(result (?P\w+)\)' | get ty | first) - let value = if $i.name in ['fd_mode' 'path_mode'] { '420' } else if $i.name =~ '(size|blocks)$' { '-1' } else if $i.name in ['fd_getfd' 'fd_setfd' 'set_open_mode'] { '0' } else { '52' } - ' (func (export "' + $i.name + '") ' + $i.signature + ' ' + $result + '.const ' + $value + ')' - } | str join (char nl)) - let file = ($output | path join $'($module).wat') - ('(module' + (char nl) + $functions + (char nl) + ')') | save --force $file - ^wasm-tools parse $file -o ($output | path join $'($module).wasm') - } -} diff --git a/spikes/s3-git/test.nu b/spikes/s3-git/test.nu deleted file mode 100644 index 3d4e4b9..0000000 --- a/spikes/s3-git/test.nu +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env nu -# Exercise local Git operations in a fresh directory through Wasmtime. -def main [binary: path, --stubs: path] { - let binary = ($binary | path expand) - let preloads = if $stubs == null { [] } else { - glob ($stubs | path join '*.wasm') | each {|p| ['--preload' $'($p | path parse | get stem)=($p)'] } | flatten - } - let root = (^mktemp -d /tmp/s3-git/local.XXXXXX | str trim) - let repo = ($root | path join repo) - mkdir $repo - def --wrapped g [...args: string] { - print $'git ($args | str join " ")' - ^wasmtime run ...$preloads --dir /tmp/s3-git/dev::/dev --dir $'($root)::/repo' --env GIT_PAGER=cat --env GIT_EDITOR=true --env GIT_AUTHOR_NAME=Spike --env GIT_AUTHOR_EMAIL=spike@example.invalid --env GIT_COMMITTER_NAME=Spike --env GIT_COMMITTER_EMAIL=spike@example.invalid --env GIT_CONFIG_NOSYSTEM=1 --env HOME=/repo -- $binary -C /repo/repo -c core.pager=cat -c maintenance.auto=false -c commit.gpgsign=false ...$args - if $env.LAST_EXIT_CODE != 0 { error make {msg: $'Git failed: ($args | str join " ")'} } - } - g init -b main - 'base' | save ($repo | path join base) - g add base - g commit -m base - g status --short - g log --oneline - g branch feature - g switch feature - 'feature' | save ($repo | path join feature) - g add feature - g commit -m feature - g switch main - g merge --ff-only feature - g branch side - 'main' | save ($repo | path join main) - g add main - g commit -m main - g switch side - 'side' | save ($repo | path join side) - g add side - g commit -m side - g switch main - g merge --no-edit side - 'changed' | save --force ($repo | path join base) - g diff - g worktree add -b linked /repo/linked - if not ($root | path join linked side | path exists) { error make {msg: 'Missing worktree file'} } - print $'PASS: local operations in ($root)' -} diff --git a/spikes/s4-builder/Cargo.lock b/spikes/s4-builder/Cargo.lock deleted file mode 100644 index 3c6a682..0000000 --- a/spikes/s4-builder/Cargo.lock +++ /dev/null @@ -1,7 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "builder" -version = "0.1.0" diff --git a/spikes/s4-builder/Cargo.toml b/spikes/s4-builder/Cargo.toml deleted file mode 100644 index 5276df3..0000000 --- a/spikes/s4-builder/Cargo.toml +++ /dev/null @@ -1,6 +0,0 @@ -[package] -name = "builder" -version = "0.1.0" -edition = "2024" - -[workspace] diff --git a/spikes/s4-builder/fixture/Cargo.lock b/spikes/s4-builder/fixture/Cargo.lock deleted file mode 100644 index 7fddc65..0000000 --- a/spikes/s4-builder/fixture/Cargo.lock +++ /dev/null @@ -1,75 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "namespace-probe" -version = "0.1.0" -dependencies = [ - "serde", -] - -[[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 = "serde" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "syn" -version = "3.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "unicode-ident" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" diff --git a/spikes/s4-builder/fixture/Cargo.toml b/spikes/s4-builder/fixture/Cargo.toml deleted file mode 100644 index ac55ae5..0000000 --- a/spikes/s4-builder/fixture/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "namespace-probe" -version = "0.1.0" -edition = "2024" - -[workspace] - -[dependencies] -serde = { version = "1", features = ["derive"] } diff --git a/spikes/s4-builder/fixture/build.rs b/spikes/s4-builder/fixture/build.rs deleted file mode 100644 index f966667..0000000 --- a/spikes/s4-builder/fixture/build.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! Asserts that native build scripts cannot access host files or the network. -use std::{ - env, fs, - net::{SocketAddr, TcpStream}, - time::Duration, -}; - -fn main() { - let home = env::var("HOME").unwrap(); - assert!(fs::read_dir(format!("{home}/.ssh")).is_err()); - assert!(fs::read_dir("/home/surma/.ssh").is_err()); - assert!(fs::write("/outside-target-probe", "escape").is_err()); - let address: SocketAddr = "1.1.1.1:443".parse().unwrap(); - assert!(TcpStream::connect_timeout(&address, Duration::from_secs(1)).is_err()); - println!("cargo:warning=PASS: HOME/.ssh hidden, outside write denied, network denied"); - println!("cargo:rerun-if-changed=build.rs"); -} diff --git a/spikes/s4-builder/fixture/src/main.rs b/spikes/s4-builder/fixture/src/main.rs deleted file mode 100644 index 762856f..0000000 --- a/spikes/s4-builder/fixture/src/main.rs +++ /dev/null @@ -1,16 +0,0 @@ -//! Exercises a native serde proc macro and a WASI test executable. -#[derive(serde::Serialize, serde::Deserialize)] -struct Message { - value: u32, -} - -fn main() { - println!("serde derive works: {}", Message { value: 42 }.value); -} - -#[test] -fn serde_derive_works() { - fn assert_serde serde::Deserialize<'a>>() {} - assert_serde::(); - assert_eq!(Message { value: 42 }.value, 42); -} diff --git a/spikes/s4-builder/src/main.rs b/spikes/s4-builder/src/main.rs deleted file mode 100644 index 7192e7f..0000000 --- a/spikes/s4-builder/src/main.rs +++ /dev/null @@ -1,133 +0,0 @@ -//! Copies sources, fetches dependencies, and builds WASI artifacts in Linux namespaces. -use std::{env, error::Error, fs, path::Path, process::Command}; - -type Result = std::result::Result>; -const BASE: &str = "/tmp/s4-builder"; -const KACHE: &str = "/nix/store/s4zxxn1y3kzvi33yl0gny5y30ri14h4a-kache-1.2.2/bin/kache"; - -fn run(command: &mut Command) -> Result<()> { - let status = command.status()?; - if !status.success() { - return Err(format!("{command:?}: {status}").into()); - } - Ok(()) -} - -fn copy_tree(source: &Path, dest: &Path) -> Result<()> { - fs::create_dir_all(dest)?; - for entry in fs::read_dir(source)? { - let entry = entry?; - if ["target", ".git"].contains(&entry.file_name().to_str().unwrap_or("")) { - continue; - } - let path = dest.join(entry.file_name()); - if entry.file_type()?.is_dir() { - copy_tree(&entry.path(), &path)?; - } else if entry.file_type()?.is_file() { - fs::copy(entry.path(), path)?; - } else { - return Err("source symlinks are not supported by this spike".into()); - } - } - Ok(()) -} - -fn artifacts(source: &Path, out: &Path) -> Result<()> { - for entry in fs::read_dir(source)? { - let path = entry?.path(); - if path.is_dir() { - artifacts(&path, out)?; - } else if path.extension().is_some_and(|ext| ext == "wasm") { - fs::copy(&path, out.join(path.file_name().unwrap()))?; - println!("artifact: {}", path.display()); - } - } - Ok(()) -} - -fn main() -> Result<()> { - let args: Vec<_> = env::args().collect(); - if args.len() != 4 || args[1] != "build" { - return Err("usage: builder build ".into()); - } - let base = Path::new(BASE); - let source = base.join("source"); - let target = base.join("target"); - let registry = base.join("cargo-home"); - let cache = base.join("kache"); - for dir in [&target, ®istry, &cache, &target.join("tmp")] { - fs::create_dir_all(dir)?; - } - if source.exists() { - fs::remove_dir_all(&source)?; - } - copy_tree(Path::new(&args[2]), &source)?; - run(Command::new("cargo") - .arg("fetch") - .current_dir(&source) - .env("CARGO_HOME", ®istry))?; - - // A private PID namespace also removes the on-demand kache daemon after cargo exits. - // It must never reuse a daemon outside the mount/network namespaces. - for action in ["build", "test"] { - let mut command = Command::new("bwrap"); - command - .args([ - "--unshare-user", - "--unshare-pid", - "--unshare-net", - "--die-with-parent", - ]) - .args(["--ro-bind", "/nix/store", "/nix/store"]) - .arg("--bind") - .arg(target.join("tmp")) - .arg("/tmp") - .arg("--bind") - .arg(&source) - .arg(&source) - .arg("--bind") - .arg(&target) - .arg(&target) - .arg("--bind") - .arg(&cache) - .arg(&cache) - .arg("--ro-bind") - .arg(®istry) - .arg(®istry) - .args([ - "--proc", - "/proc", - "--dev", - "/dev", - "--remount-ro", - "/", - "--chdir", - ]) - .arg(&source) - .args(["--clearenv", "--setenv", "PATH"]) - .arg(env::var("PATH")?) - .args(["--setenv", "HOME", "/nonexistent"]) - .args(["--setenv", "CARGO_HOME"]) - .arg(®istry) - .args(["--setenv", "CARGO_TARGET_DIR"]) - .arg(&target) - .args(["--setenv", "RUSTC_WRAPPER", KACHE]) - .args(["--setenv", "KACHE_CACHE_DIR"]) - .arg(&cache) - .args(["--setenv", "CARGO_BUILD_JOBS", "2"]) - .args([ - "cargo", - action, - "--release", - "--offline", - "--target", - "wasm32-wasip2", - ]); - if action == "test" { - command.arg("--no-run"); - } - run(&mut command)?; - } - fs::create_dir_all(&args[3])?; - artifacts(&target.join("wasm32-wasip2/release"), Path::new(&args[3])) -} diff --git a/spikes/s5-http/Cargo.lock b/spikes/s5-http/Cargo.lock deleted file mode 100644 index f9720a2..0000000 --- a/spikes/s5-http/Cargo.lock +++ /dev/null @@ -1,2746 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "addr2line" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59317f77929f0e679d39364702289274de2f0f0b22cbf50b2b8cff2169a0b27a" -dependencies = [ - "gimli", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "ambient-authority" -version = "0.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" - -[[package]] -name = "anyhow" -version = "1.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" - -[[package]] -name = "arbitrary" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bc62ac97cc33321f50863d514c3bc38a453947a8f9e781137e47c7401020aed" - -[[package]] -name = "async-trait" -version = "0.1.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bitflags" -version = "2.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bumpalo" -version = "3.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" -dependencies = [ - "allocator-api2", -] - -[[package]] -name = "bytes" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" - -[[package]] -name = "cap-primitives" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b5f74729fd2f44701d1a8eb47e906cdb3ccd9ec0f02baad85a744b791940b18" -dependencies = [ - "ambient-authority", - "fs-set-times", - "io-extras", - "io-lifetimes 3.0.1", - "ipnet", - "maybe-owned", - "rustix", - "rustix-linux-procfs", - "windows-sys 0.61.2", - "winx", -] - -[[package]] -name = "cc" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ff2a8126fff0f8c839080d619675a585e61720bb12d2baceae45769fd66f155" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" - -[[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", -] - -[[package]] -name = "cobs" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" -dependencies = [ - "thiserror 2.0.21", -] - -[[package]] -name = "core_detect" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f8f80099a98041a3d1622845c271458a2d73e688351bf3cb999266764b81d48" - -[[package]] -name = "cpp_demangle" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0667304c32ea56cb4cd6d2d7c0cfe9a2f8041229db8c033af7f8d69492429def" -dependencies = [ - "cfg-if", -] - -[[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 = "cranelift-assembler-x64" -version = "0.136.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "249a61efca6a54425e027f5704a6f68a0232b4df527e05a3ef947d89dbdcb078" -dependencies = [ - "cranelift-assembler-x64-meta", -] - -[[package]] -name = "cranelift-assembler-x64-meta" -version = "0.136.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5336a46e05db2d515440b1ce8a9363e7bc04b608c0f66cc98dddc5492a66fbf" -dependencies = [ - "cranelift-srcgen", -] - -[[package]] -name = "cranelift-bforest" -version = "0.136.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "894b984f82c5a36f05fdd4973fbf4d37d69cd5cdf8c16e8ffe3af4a9cdfe193c" -dependencies = [ - "cranelift-entity", - "wasmtime-internal-core", -] - -[[package]] -name = "cranelift-bitset" -version = "0.136.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1e4c34abe94193ada09f821f474be87ac8a1fbbacd87058571ef04c1bf4009" -dependencies = [ - "serde", - "serde_derive", - "wasmtime-internal-core", -] - -[[package]] -name = "cranelift-codegen" -version = "0.136.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63826cef0bf70e61d56cc930aa4ee423638f66dc3cfc10d683e73138a6d177b8" -dependencies = [ - "bumpalo", - "cranelift-assembler-x64", - "cranelift-bforest", - "cranelift-bitset", - "cranelift-codegen-meta", - "cranelift-codegen-shared", - "cranelift-control", - "cranelift-entity", - "cranelift-isle", - "gimli", - "hashbrown 0.17.1", - "libm", - "log", - "postcard", - "pulley-interpreter", - "regalloc2", - "rustc-hash", - "serde", - "serde_derive", - "sha2", - "smallvec", - "target-lexicon", - "wasmtime-internal-core", -] - -[[package]] -name = "cranelift-codegen-meta" -version = "0.136.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26de7849112293681a19f7525c689e1d73dc6eb2687355170fb7458c4da8d353" -dependencies = [ - "cranelift-assembler-x64-meta", - "cranelift-codegen-shared", - "cranelift-srcgen", - "heck", - "pulley-interpreter", -] - -[[package]] -name = "cranelift-codegen-shared" -version = "0.136.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1260aa93b0bd48e8e55c1c7fd9ff6a260f1a1bc46e1f0151a5055b124e5b15d" - -[[package]] -name = "cranelift-control" -version = "0.136.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c179632a09850f81f1a1e9116cb09330c734a86689f3ee4c3f4ec81543acbd" -dependencies = [ - "arbitrary", -] - -[[package]] -name = "cranelift-entity" -version = "0.136.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6158b1ac381792ad11e670abbcd15db8b1737e84bfa8a7f2bd7eb41388a92530" -dependencies = [ - "cranelift-bitset", - "serde", - "serde_derive", - "wasmtime-internal-core", -] - -[[package]] -name = "cranelift-frontend" -version = "0.136.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099361a0919067086dcde624a281ce719834cebf8544d6c24646f5e924107234" -dependencies = [ - "cranelift-codegen", - "hashbrown 0.17.1", - "log", - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cranelift-isle" -version = "0.136.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2f30ea3fd5a11f7d3473976d3b62b5b3f2b62fa943c85e0331d88bf505082c" - -[[package]] -name = "cranelift-native" -version = "0.136.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397508a8d817dc74019603ac5a4c4e40b4df627e5aed4f2f8088345d4c01d401" -dependencies = [ - "cranelift-codegen", - "libc", - "target-lexicon", -] - -[[package]] -name = "cranelift-srcgen" -version = "0.136.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f016b9994e39cad68107f33fa5b8dcee8fb7e38332bde3f97690e5e8abe1b10" - -[[package]] -name = "crc32fast" -version = "1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f97d3416d5337d15c4b0d78c8c91df922ca143f57ec20e2d1c188333047ef04" -dependencies = [ - "cfg-if", -] - -[[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 = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "debugid" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" -dependencies = [ - "uuid", -] - -[[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 = "directories-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[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.9", -] - -[[package]] -name = "either" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be" - -[[package]] -name = "embedded-io" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" - -[[package]] -name = "embedded-io" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" - -[[package]] -name = "encoding_rs" -version = "0.8.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89253175e704ab869b04f9db224d38630e0211a53841a79181deae0889e169f5" -dependencies = [ - "cfg-if", - "core_detect", - "multiversion_no_op", - "rustversion", - "scopeguard", - "simdutf8", -] - -[[package]] -name = "equivalent" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826" - -[[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 = "fastrand" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" - -[[package]] -name = "find-msvc-tools" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c66915cc5391097de7a2b0b972e8505aa33c0df401fd3a6811dbdb32881ba48" - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[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 = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fs-set-times" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a" -dependencies = [ - "io-lifetimes 2.0.4", - "rustix", - "windows-sys 0.59.0", -] - -[[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-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-io" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" - -[[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-sink", - "futures-task", - "memchr", - "pin-project-lite", - "slab", -] - -[[package]] -name = "fxprof-processed-profile" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25234f20a3ec0a962a61770cfe39ecf03cb529a6e474ad8cff025ed497eda557" -dependencies = [ - "bitflags", - "debugid", - "rustc-hash", - "serde", - "serde_derive", - "serde_json", -] - -[[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 = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[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", - "rand_core", -] - -[[package]] -name = "gimli" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf7f043f89559805f8c7cacc432749b2fa0d0a0a9ee46ce47164ed5ba7f126c" -dependencies = [ - "fnv", - "hashbrown 0.16.1", - "indexmap", - "stable_deref_trait", -] - -[[package]] -name = "h2" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d29020232d6aa3fb1daca64c1127cf662cf97f254ae16c18c05b8ab635fc118" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" - -[[package]] -name = "hashbrown" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" -dependencies = [ - "foldhash", - "serde", - "serde_core", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[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.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3e324da4c95177d6291d4c8730197c0d1822f8a9766814a4a44fa5ab797c9c" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-util" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc03d96684f9226b8a787cdb71488417b53ab5ea8fdb1dac946cb9431cc8bff" -dependencies = [ - "bytes", - "http", - "http-body", - "hyper", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "icu_collections" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe090a42a0d3140fed8c63263ed1fecc02422cb2f4bfe55cd8de2de1b8e105dd" -dependencies = [ - "displaydoc", - "potential_utf", - "utf8_iter", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25d29b57c17c6528d0dc4c2141cfa2d08200465acb537a3909c8b9b8a4a984c0" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "404a3b8c486f205c87fe7f23ab6894d84a4ad76d6e4671ae1981ba7def87c599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20f0088bfb7441f7a37fa0c9e20cb1e9cba1cac6b9ce8cd2a6dc44294f8e8cbc" - -[[package]] -name = "icu_properties" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ea83d991c56158f7cf898bf86436c1dfe7c07ee82fe88951f2695c9f37a379f" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98f29af82d02b163fe50161388350e743bb3107cc8e8c2f7314cb505faddfcf" - -[[package]] -name = "icu_provider" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413099315636c588ee8f011190b329b971a09a8fae9d157e01dcae8379468514" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - -[[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 = "indexmap" -version = "2.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" -dependencies = [ - "equivalent", - "hashbrown 0.17.1", - "serde", - "serde_core", -] - -[[package]] -name = "io-extras" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20fd6de4ccfcc187e38bc21cfa543cb5a302cb86a8b114eb7f0bf0dc9f8ac00f" -dependencies = [ - "io-lifetimes 3.0.1", - "windows-sys 0.60.2", -] - -[[package]] -name = "io-lifetimes" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06432fb54d3be7964ecd3649233cddf80db2832f47fec34c01f65b3d9d774983" - -[[package]] -name = "io-lifetimes" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0fb0570afe1fed943c5c3d4102d5358592d8625fda6a0007fdbe65a92fba96" - -[[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 = "ittapi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b996fe614c41395cdaedf3cf408a9534851090959d90d54a535f675550b64b1" -dependencies = [ - "anyhow", - "ittapi-sys", - "log", -] - -[[package]] -name = "ittapi-sys" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f5385394064fa2c886205dba02598013ce83d3e92d33dbdc0c52fe0e7bf4fc" -dependencies = [ - "cc", -] - -[[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.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dc09d2154098bbf4ef54eab6b117a3c24cbbffe94046b16ee6d6d4510584d3a" -dependencies = [ - "cfg-if", - "futures-util", - "wasm-bindgen", -] - -[[package]] -name = "leb128" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c83bff1d572d6b9aeef67ddfc8448e4a3737909cb28e81f97c791b9018703e52" - -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - -[[package]] -name = "libc" -version = "0.2.191" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" - -[[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 = "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 = "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.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d15f86d12da44cd8d4ec3c73984537eb7f4cadcb9776a575a0a8a05ca11005c" - -[[package]] -name = "mach2" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dae608c151f68243f2b000364e1f7b186d9c29845f7d2d85bd31b9ad77ad552b" - -[[package]] -name = "maybe-owned" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" - -[[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 = "mio" -version = "1.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.61.2", -] - -[[package]] -name = "multiversion_no_op" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743fb55ba31b18fb1ecef6bdc9aa2743314978ac084044301a7eee33fb99a20d" - -[[package]] -name = "object" -version = "0.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd229a0361b9d0d4396176e02d65897f487eebeab7caa6d443855ee152ca0b9c" -dependencies = [ - "crc32fast", - "hashbrown 0.17.1", - "indexmap", - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" - -[[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 = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap", -] - -[[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 = "postcard" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" -dependencies = [ - "cobs", - "embedded-io 0.4.0", - "embedded-io 0.6.1", - "serde", -] - -[[package]] -name = "potential_utf" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" -dependencies = [ - "zerovec", -] - -[[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 = "pulley-interpreter" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b66b7448cb92d709f2924de98b5ba5b5ce4ea08e6d6b9c3b403fcd88d122ca2" -dependencies = [ - "cranelift-bitset", - "log", - "pulley-macros", - "wasmtime-internal-core", -] - -[[package]] -name = "pulley-macros" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185b9b4cd91f85110f48f8c0314757dfb2bb48c40f5d91055ea666cbbcbf317b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[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 = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" - -[[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", -] - -[[package]] -name = "rand_core" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" - -[[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 = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 1.0.69", -] - -[[package]] -name = "regalloc2" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757712e8e61590d6d4f5d563483755538b5aa13467837a3b41cd9832509a7f85" -dependencies = [ - "allocator-api2", - "bumpalo", - "hashbrown 0.17.1", - "log", - "rustc-hash", - "serde", - "smallvec", -] - -[[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-demangle" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b74b56ffa8bb2830709a538c2cbcae9aa062db0d2a42563bfb09bdaae44020eb" - -[[package]] -name = "rustc-hash" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" - -[[package]] -name = "rustix" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5e76742e5294153d4dde1207dbec5bdd81eef6fabdc0d2118babadabfd858aa" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustix-linux-procfs" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fc84bf7e9aa16c4f2c758f27412dc9841341e16aa682d9c7ac308fe3ee12056" -dependencies = [ - "once_cell", - "rustix", -] - -[[package]] -name = "rustls" -version = "0.23.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e13bd8c0e9365c43cfa5c9e8f9ad49d3c8444926c9aac819e0e4dc503c8fdf" -dependencies = [ - "log", - "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 = [ - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443b1b6d39d7c663139942cc4558262562d2c84123bb6282ef177009ca8b281" -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 = "s5-http" -version = "0.1.0" -dependencies = [ - "anyhow", - "bytes", - "http", - "http-body-util", - "hyper", - "hyper-util", - "tokio", - "wasmtime", - "wasmtime-wasi", - "wasmtime-wasi-http", -] - -[[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" -dependencies = [ - "serde", - "serde_core", -] - -[[package]] -name = "serde" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", -] - -[[package]] -name = "serde_json" -version = "1.0.154" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" -dependencies = [ - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "serde_spanned" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7523beb55eece201a2356bee0bbca0d1ab466c14c07703b2e0ee6d42cb0c2c" -dependencies = [ - "serde_core", -] - -[[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-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "smallvec" -version = "1.16.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0d5d4b1981b8bbbb7aed204cae5726d683d5d6ac7e74ec54122ea28f315e7c8" -dependencies = [ - "serde", -] - -[[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 = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" -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.9", -] - -[[package]] -name = "target-lexicon" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" - -[[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 = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[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.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" -dependencies = [ - "thiserror-impl 2.0.21", -] - -[[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.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", -] - -[[package]] -name = "tinystr" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abc840c238154d58f9e86b2792261edfde565a17696e1cda1a449de27979801a" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tokio" -version = "1.54.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b52fd3255258d26fac7264ab5a76b53c13367136dc011d3d6ad4f8ed070396a3" -dependencies = [ - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "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.9", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9cc2678c2cdd569ef8215e2afd7954ada2ae20b4fdd2c5fe6139a3b02d105db" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e464cf451ba96ebfc6f9b6542f17ee8b8956e33f1e40d9690624e59d7a7f8a4b" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "libc", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "1.2.0+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5ffcdf8f50436dbbfd675c1fe1b8e0854f42b7defea8584bdebe1aee900e561" -dependencies = [ - "indexmap", - "serde_core", - "serde_spanned", - "toml_datetime", - "toml_parser", - "toml_writer", - "winnow", -] - -[[package]] -name = "toml_datetime" -version = "1.1.2+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b86d767906c6c42421dcba507eb9d203e779497710a47782a224bb871653053" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_parser" -version = "1.1.5+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baa693a8032d7e1cada7d0041e96126df243179ff061456783ac7f12bda4744c" -dependencies = [ - "winnow", -] - -[[package]] -name = "toml_writer" -version = "1.2.0+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "009dbb7700f11c55ef83aebbe4c0e9cf1f1ac0844bd8d6f00dc38f302026e13a" - -[[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 = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[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.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" - -[[package]] -name = "unicode-width" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca718471876992059f251e33aafc334346ada08042b7661dd1fe313a9bced557" - -[[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 = "utf8_iter" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af3bd9d3e571c26fcce9d033b87ea5ab061b8d2ffe9b7a5675d810d68f03edf0" -dependencies = [ - "utf_types", -] - -[[package]] -name = "utf_types" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3b425286980a367278453f3b6d28cdcb134b574e5a35824a6ff5eebad50bb6" - -[[package]] -name = "uuid" -version = "1.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0e2d11620c50695fe12bbbfde96b3477fe606e7284c22d505c12ce51214514" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "want" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec4cdd0dd910afe868b7ef477227d8d538b46b3075031afee8a9f2acb0a2ed0b" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasm-bindgen" -version = "0.2.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0181c14ddd6c7b8b0b0132a5f1ea2f32be0d893cd3ea97b6e3b28886b8a3d1c" -dependencies = [ - "cfg-if", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e931a02a39abdbf66966fc35902b5ed58344750a70885bed4ebb3d8eaf28ed9" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca4b54280e455bd831e33a6b8e734baf432fe63fbc35c42ac14ce67a043a53a" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 3.0.9", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b1f9c3798725016c6ee5f2f57869ec0831e8bbc0ab0310a86e787e97f41389e" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-compose" -version = "0.258.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27dc71f96d21a8b9153da9005c603f4f20d5781b7e6d2675ea0ca5def8713b75" -dependencies = [ - "anyhow", - "heck", - "indexmap", - "log", - "petgraph", - "smallvec", - "wasm-encoder 0.258.3", - "wasmparser 0.258.3", - "wat", -] - -[[package]] -name = "wasm-encoder" -version = "0.258.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64765e43c000fae008a48db8b288e175e237fc9ce20a26586836878c1bee89f" -dependencies = [ - "leb128fmt", - "wasmparser 0.258.3", -] - -[[package]] -name = "wasm-encoder" -version = "0.263.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b883a26aea02eaabe2d2c3fba7eb039ef5cdcb5d5201ae5551e73d5e251a81f" -dependencies = [ - "leb128fmt", - "wasmparser 0.263.0", -] - -[[package]] -name = "wasm-metadata" -version = "0.258.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e10808eb27efde692f1b1706089fe19296728bf872291f5b4e0d50fba88f2f" -dependencies = [ - "anyhow", - "indexmap", - "wasm-encoder 0.258.3", - "wasmparser 0.258.3", -] - -[[package]] -name = "wasmparser" -version = "0.258.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9269dd817e0e7021bf534ccd9761bc2d64778b6708e41228b8439d75eaa0b1" -dependencies = [ - "bitflags", - "hashbrown 0.17.1", - "indexmap", - "semver", - "serde", -] - -[[package]] -name = "wasmparser" -version = "0.263.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fa0a054ae153606df820eb0a84213e28cda41bbe04ba2628e71b6ba100fcb" -dependencies = [ - "bitflags", - "indexmap", - "semver", -] - -[[package]] -name = "wasmprinter" -version = "0.258.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14a457ba8670a3db3d357c1aeac3ed4fe378a76054a221789f0df0ea507e292b" -dependencies = [ - "anyhow", - "termcolor", - "wasmparser 0.258.3", -] - -[[package]] -name = "wasmtime" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1801b9c9f91e16e352ed77656824e7c4556a7538dbfc1a50b37243f0e12ea045" -dependencies = [ - "addr2line", - "async-trait", - "bitflags", - "bumpalo", - "bytes", - "cc", - "encoding_rs", - "futures", - "fxprof-processed-profile", - "gimli", - "ittapi", - "libc", - "log", - "mach2", - "memfd", - "object", - "once_cell", - "postcard", - "pulley-interpreter", - "rayon", - "rustix", - "semver", - "serde", - "serde_derive", - "serde_json", - "smallvec", - "target-lexicon", - "tempfile", - "wasm-compose", - "wasm-encoder 0.258.3", - "wasmparser 0.258.3", - "wasmtime-environ", - "wasmtime-internal-cache", - "wasmtime-internal-component-macro", - "wasmtime-internal-component-util", - "wasmtime-internal-core", - "wasmtime-internal-cranelift", - "wasmtime-internal-fiber", - "wasmtime-internal-jit-debug", - "wasmtime-internal-jit-icache-coherence", - "wasmtime-internal-unwinder", - "wasmtime-internal-versioned-export-macros", - "wat", - "windows-sys 0.61.2", - "wit-parser", -] - -[[package]] -name = "wasmtime-environ" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f397969b8daf208e45120036be74956e99364ce916d5b5d67f9e9f0fe40e5477" -dependencies = [ - "anyhow", - "cpp_demangle", - "cranelift-bforest", - "cranelift-bitset", - "cranelift-entity", - "gimli", - "hashbrown 0.17.1", - "indexmap", - "log", - "object", - "postcard", - "rustc-demangle", - "semver", - "serde", - "serde_derive", - "sha2", - "smallvec", - "target-lexicon", - "wasm-encoder 0.258.3", - "wasmparser 0.258.3", - "wasmprinter", - "wasmtime-internal-component-util", - "wasmtime-internal-core", -] - -[[package]] -name = "wasmtime-internal-cache" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdf564a08f96acec55a335e3185d1df98ba3feee47e178f5bc2429e723d30d0f" -dependencies = [ - "base64", - "directories-next", - "log", - "postcard", - "rustix", - "serde", - "serde_derive", - "sha2", - "toml", - "wasmtime-environ", - "windows-sys 0.61.2", - "zstd", -] - -[[package]] -name = "wasmtime-internal-component-macro" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f47c428b868b59d51a9f77e24bff02cc321f8ec0faeba5c40f7e4c1cddd43a64" -dependencies = [ - "anyhow", - "proc-macro2", - "quote", - "syn 2.0.119", - "wasmtime-internal-component-util", - "wasmtime-internal-wit-bindgen", - "wit-parser", -] - -[[package]] -name = "wasmtime-internal-component-util" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fe14bd5ea6444a09f6baa3865559c93c91158930e7fe6d127429a9372f6165" - -[[package]] -name = "wasmtime-internal-core" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2053fd1d90080e502ca4ea39d86c3528587a40220b9572a874c8b742c219a00c" -dependencies = [ - "anyhow", - "hashbrown 0.17.1", - "libm", - "serde", -] - -[[package]] -name = "wasmtime-internal-cranelift" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e96d6c55401e68e40e3f74078ec96f92fe9b8a7e90e885fb87265e69eea559" -dependencies = [ - "cranelift-codegen", - "cranelift-control", - "cranelift-entity", - "cranelift-frontend", - "cranelift-native", - "gimli", - "itertools", - "log", - "object", - "pulley-interpreter", - "smallvec", - "target-lexicon", - "thiserror 2.0.21", - "wasmparser 0.258.3", - "wasmtime-environ", - "wasmtime-internal-core", - "wasmtime-internal-unwinder", - "wasmtime-internal-versioned-export-macros", -] - -[[package]] -name = "wasmtime-internal-fiber" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b913875bab1b78fada489e55d5e0a10b53286fb4bb09f5657212f549c9af36c" -dependencies = [ - "cc", - "libc", - "rustix", - "wasmtime-environ", - "wasmtime-internal-versioned-export-macros", - "windows-sys 0.61.2", -] - -[[package]] -name = "wasmtime-internal-jit-debug" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0356a1a09dee1239904e09e962456d9f6edfa5da61c5e3e1b0e4669710f48fba" -dependencies = [ - "cc", - "object", - "rustix", - "wasmtime-internal-versioned-export-macros", -] - -[[package]] -name = "wasmtime-internal-jit-icache-coherence" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dead9a2d7b5d835698a2e1a32006e7d0b5711f4697b24bab1564bb2488e3d7a" -dependencies = [ - "libc", - "wasmtime-internal-core", - "windows-sys 0.61.2", -] - -[[package]] -name = "wasmtime-internal-unwinder" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69ffac8fc893de2958b263d9d7274cf4c531ba9ff582558348d4e28d97b8a0f2" -dependencies = [ - "cranelift-codegen", - "log", - "object", - "wasmtime-environ", -] - -[[package]] -name = "wasmtime-internal-versioned-export-macros" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a20f0dcb6c6a006363d3f85b5c633675730487b0dc23726b2d40495872407fb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "wasmtime-internal-wit-bindgen" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80758f73f5f5daacd8a6d1a8513336a4f9a58d26c4f1c73eb80502cb143e2626" -dependencies = [ - "anyhow", - "bitflags", - "heck", - "indexmap", - "wit-component", - "wit-parser", -] - -[[package]] -name = "wasmtime-wasi" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bac947c8478d8ea84ef4120d04f984012a514e493fe16fa5bb72906d7e55addb" -dependencies = [ - "async-trait", - "bitflags", - "bytes", - "cap-primitives", - "futures", - "rand", - "rustix", - "rustix-linux-procfs", - "thiserror 2.0.21", - "tokio", - "tracing", - "url", - "wasmtime", - "wasmtime-wasi-io", - "wiggle", - "windows-sys 0.61.2", - "winx", -] - -[[package]] -name = "wasmtime-wasi-http" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4cd327c70de1309b0c04d49df3633a2ffeae9b29b526d421320b565e198175" -dependencies = [ - "async-trait", - "bytes", - "futures", - "http", - "http-body", - "http-body-util", - "hyper", - "pin-project-lite", - "rustls", - "tokio", - "tokio-rustls", - "tokio-util", - "tracing", - "wasmtime", - "wasmtime-wasi", - "wasmtime-wasi-io", - "webpki-roots", -] - -[[package]] -name = "wasmtime-wasi-io" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e65d70efbe70631acbb4c6cf46eea543c75908f01e2fd09550e5a89631693304" -dependencies = [ - "async-trait", - "bytes", - "futures", - "tracing", - "wasmtime", -] - -[[package]] -name = "wast" -version = "35.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ef140f1b49946586078353a453a1d28ba90adfc54dde75710bc1931de204d68" -dependencies = [ - "leb128", -] - -[[package]] -name = "wast" -version = "263.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d90bcf581b501aa1c358bc5dc0faa979cd375796908860ebcb6d1d70b907c7" -dependencies = [ - "bumpalo", - "leb128fmt", - "memchr", - "unicode-width", - "wasm-encoder 0.263.0", -] - -[[package]] -name = "wat" -version = "1.263.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbc9c5aca783b3f1838be89f3f9937c528b90ec5faa6fb62d809726c16a7d8f7" -dependencies = [ - "wast 263.0.0", -] - -[[package]] -name = "webpki-roots" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5f280bbb2b287bc8e7de7e3852945a0ff50d1bbcb5ed42b6c7a568c546df171" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "wiggle" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7c3a2e8ec4789bb82e4bf04b0dba44b02ce05beba6cbc6eb992b8f0b93c9cd" -dependencies = [ - "bitflags", - "thiserror 2.0.21", - "tracing", - "wasmtime", - "wasmtime-environ", - "wiggle-macro", -] - -[[package]] -name = "wiggle-generate" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "761bf518bf5972dd0ddb8c3c693b6a52ed826e25d10bfae89b1368327c86030d" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.119", - "wasmtime-environ", - "witx", -] - -[[package]] -name = "wiggle-macro" -version = "49.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bdaa435787bc4bb662020aea37538745fc60b4629d7f37864a09195cec0e1eb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", - "wiggle-generate", -] - -[[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-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[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", -] - -[[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", - "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_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.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.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winnow" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3b93199df0ab874cdf0c6a94f0a0dc3423fe41f1cafb62b8bd7b1deb277aef" - -[[package]] -name = "winx" -version = "0.36.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f3fd376f71958b862e7afb20cfe5a22830e1963462f3a17f49d82a6c1d1f42d" -dependencies = [ - "bitflags", - "windows-sys 0.59.0", -] - -[[package]] -name = "wit-component" -version = "0.258.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0fca88950af0c1f42bc77e17315e48798b8d68340171b6d204f62bc19a878a6" -dependencies = [ - "anyhow", - "bitflags", - "indexmap", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder 0.258.3", - "wasm-metadata", - "wasmparser 0.258.3", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.258.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2127663dcf3ee16614fb0e3c33d5c6c66fec9dad317a8b0fdd3869487a533" -dependencies = [ - "anyhow", - "hashbrown 0.17.1", - "id-arena", - "indexmap", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-ident", - "wasmparser 0.258.3", -] - -[[package]] -name = "witx" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e366f27a5cabcddb2706a78296a40b8fcc451e1a6aba2fc1d94b4a01bdaaef4b" -dependencies = [ - "anyhow", - "log", - "thiserror 1.0.69", - "wast 35.0.2", -] - -[[package]] -name = "writeable" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" - -[[package]] -name = "yoke" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "417ef3fcf6c300b7dbd25c85531a746931c02ad536f3cf4786ed1e88223340b3" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", - "synstructure", -] - -[[package]] -name = "zerofrom" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13084392c5e4bc371903e2935a5eaeed24905a7511356b883835e18a78f6879" - -[[package]] -name = "zerotrie" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58a2799cfe9a1670c7ea8edbd52ef8edb93cb37a7f83bf31ba9e35d9dae6a40" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3743ddbf47738d929cd1ae2e199d40d0162979dfe31aef8ae646d2bf00bf97a" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", -] - -[[package]] -name = "zmij" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" - -[[package]] -name = "zstd" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb02c3132d251ab1606e9fc913a7da6c6ed08cc263df15edf082e1dc497d157" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c8ea04668f5de8d8d51051714ba560c9536519cadcdb8829bba4fe2ad159b03" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.1.2+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "481ada9c543b2323cbb7bbdbb5249177fbf0188ed959ed2c15e4b22421c84ed3" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/spikes/s5-http/Cargo.toml b/spikes/s5-http/Cargo.toml deleted file mode 100644 index cb92ce1..0000000 --- a/spikes/s5-http/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "s5-http" -version = "0.1.0" -edition = "2024" - -[workspace] - -[dependencies] -anyhow = "1" -bytes = "1" -http = "1" -http-body-util = "0.1" -hyper = { version = "1.12.0", features = ["server", "http1"] } -hyper-util = { version = "0.1.21", features = ["tokio"] } -tokio = { version = "1", features = ["full"] } -wasmtime = "=49.0.2" -wasmtime-wasi = "=49.0.2" -wasmtime-wasi-http = "=49.0.2" diff --git a/spikes/s5-http/README.md b/spikes/s5-http/README.md deleted file mode 100644 index 84de8a8..0000000 --- a/spikes/s5-http/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# S5: HTTP hook proof - -The brief in `.board/T5.brief.md` defines this spike's contract. - -The host assigns an identity to each WASI store. Its HTTP hook answers -`http://host.sausage/whoami` directly. This path never calls the network transport. - -Items match a scheme, exact hosts or `*.suffix` hosts, path prefixes, and optional -methods. One match requires a grant or free use. The host then injects an -Authorization header through a Rust closure. No match preserves the request. -No grant returns a 403 that names the item. Multiple matches return an HTTP error. -The hook consumes the outgoing body before it returns an in-process response or error. -It also collects forwarded bodies before transport, with their data and trailers intact. -This prevents Hyper from closing an unknown-length GET body before the guest finishes its WASI stream. -The spike buffers forwarded bodies. It does not prove streaming forwarding. - -The test server consumes the complete HTTP request body before it answers and closes the connection. -It validates the token but returns only its presence and correctness. -The guest prints its environment, files, request headers, and response. -The host checks that none contain its fresh token. - -Run all cases from the repository root: - -```sh -nu spikes/s5-http/verify.nu -``` - -Repeat the direct host run 20 times: - -```sh -nu spikes/s5-http/repeat.nu after-body -``` - -The loop preserves each run's stdout and stderr separately under `/tmp/s5-http/`. - -The spike does not implement durable approval requests, conversation ancestry, -JavaScript transforms, or a real credentials vault. Grants are a per-store boolean. -The filesystem contains one public fixture. The token remains in host memory. diff --git a/spikes/s5-http/guest/Cargo.lock b/spikes/s5-http/guest/Cargo.lock deleted file mode 100644 index 5dec932..0000000 --- a/spikes/s5-http/guest/Cargo.lock +++ /dev/null @@ -1,299 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "anyhow" -version = "1.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" - -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - -[[package]] -name = "bitflags" -version = "2.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" - -[[package]] -name = "bytes" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" - -[[package]] -name = "cfg-if" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "futures-core" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" - -[[package]] -name = "futures-io" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" - -[[package]] -name = "futures-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - -[[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 = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "itoa" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" - -[[package]] -name = "memchr" -version = "2.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[package]] -name = "pin-project-lite" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" - -[[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 = "s5-curl" -version = "0.1.0" -dependencies = [ - "anyhow", - "wstd", -] - -[[package]] -name = "serde" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" -dependencies = [ - "serde_core", -] - -[[package]] -name = "serde_core" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.9", -] - -[[package]] -name = "serde_json" -version = "1.0.154" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" -dependencies = [ - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "unicode-ident" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" - -[[package]] -name = "waker-fn" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" - -[[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 = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" -dependencies = [ - "bitflags", -] - -[[package]] -name = "wstd" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29b52936db10a79bb724dadd1c2c3aac958e8229dcb1f1c7f2b7044ca9fc6a3a" -dependencies = [ - "anyhow", - "async-task", - "bytes", - "futures-lite", - "http", - "http-body", - "http-body-util", - "itoa", - "pin-project-lite", - "serde", - "serde_json", - "slab", - "wasip2", - "wstd-macro", -] - -[[package]] -name = "wstd-macro" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "153db9b65508bf6c2efe26617169840c03671ba5719a35868db7682a5261f7d4" -dependencies = [ - "quote", - "syn 2.0.119", -] - -[[package]] -name = "zmij" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/spikes/s5-http/guest/Cargo.toml b/spikes/s5-http/guest/Cargo.toml deleted file mode 100644 index 18b7017..0000000 --- a/spikes/s5-http/guest/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "s5-curl" -version = "0.1.0" -edition = "2024" - -[workspace] - -[dependencies] -wstd = "=0.6.8" -anyhow = "1" diff --git a/spikes/s5-http/guest/src/main.rs b/spikes/s5-http/guest/src/main.rs deleted file mode 100644 index 2e7965e..0000000 --- a/spikes/s5-http/guest/src/main.rs +++ /dev/null @@ -1,31 +0,0 @@ -//! A curl-like WASI guest that prints its visible inputs and HTTP result. -use wstd::http::{Body, BodyExt, Client, Request}; - -#[wstd::main] -async fn main() -> anyhow::Result<()> { - let args: Vec<_> = std::env::args().collect(); - println!("environment={:?}", std::env::vars().collect::>()); - println!( - "files={:?}", - std::fs::read_dir("/")? - .map(|e| e.unwrap().file_name()) - .collect::>() - ); - println!("file={}", std::fs::read_to_string("/public.txt")?); - let request = Request::builder() - .uri(&args[1]) - .method(args[2].as_str()) - .header("x-guest", "unchanged") - .body(Body::empty())?; - println!("request-headers={:?}", request.headers()); - match Client::new().send(request).await { - Ok(response) => { - println!("status={}", response.status().as_u16()); - println!("response-headers={:?}", response.headers()); - let body = response.into_body().into_boxed_body().collect().await?; - println!("body={}", String::from_utf8_lossy(&body.to_bytes())); - } - Err(error) => println!("error={error}"), - } - Ok(()) -} diff --git a/spikes/s5-http/repeat.nu b/spikes/s5-http/repeat.nu deleted file mode 100644 index 0db89c8..0000000 --- a/spikes/s5-http/repeat.nu +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env nu -# Preserve each direct run so intermittent failures retain their full evidence. -def main [label: string] { - mkdir /tmp/s5-http - mut passed = 0 - for n in 1..20 { - let result = (do { - ^./spikes/s5-http/target/debug/s5-http spikes/s5-http/guest/target/wasm32-wasip2/debug/s5-curl.wasm - } | complete) - $result.stdout | save -f $"/tmp/s5-http/($label)-($n).out" - $result.stderr | save -f $"/tmp/s5-http/($label)-($n).err" - if $result.exit_code == 0 { - $passed = $passed + 1 - print $"RUN ($n): PASS" - } else { - print $"RUN ($n): FAIL exit=($result.exit_code)" - print -e $result.stderr - } - } - print $"RESULT ($label): ($passed)/20 passed" - if $passed != 20 { error make {msg: "direct runs failed"} } -} diff --git a/spikes/s5-http/src/main.rs b/spikes/s5-http/src/main.rs deleted file mode 100644 index f5a5f3c..0000000 --- a/spikes/s5-http/src/main.rs +++ /dev/null @@ -1,387 +0,0 @@ -//! Runs the HTTP hook and verifies real WASI guests against a local test server. -use anyhow::Result; -use bytes::Bytes; -use http_body_util::{BodyExt, Full}; -use hyper::{server::conn::http1, service::service_fn}; -use hyper_util::rt::TokioIo; -use std::sync::{ - Arc, - atomic::{AtomicUsize, Ordering}, -}; -use wasmtime::component::{Component, Linker, ResourceTable}; -use wasmtime::{Engine, Store}; -use wasmtime_wasi::{WasiCtx, WasiCtxView, WasiView}; -use wasmtime_wasi_http::{WasiBody, WasiHttpCtx, WasiHttpCtxView, WasiHttpHooks, WasiHttpView}; - -type Io = Box> + Send>; -struct Item { - name: &'static str, - scheme: &'static str, - hosts: Vec<&'static str>, - prefixes: Vec<&'static str>, - methods: Option>, - free: bool, -} -impl Item { - fn matches(&self, request: &http::Request) -> bool { - let uri = request.uri(); - uri.scheme_str() == Some(self.scheme) - && self - .hosts - .iter() - .any(|pattern| host_matches(pattern, uri.host().unwrap_or(""))) - && self.prefixes.iter().any(|p| uri.path().starts_with(p)) - && self - .methods - .as_ref() - .is_none_or(|m| m.contains(request.method())) - } -} -fn host_matches(pattern: &str, host: &str) -> bool { - match pattern.strip_prefix("*.") { - Some(suffix) => host - .strip_suffix(suffix) - .is_some_and(|p| p.ends_with('.') && p.len() > 1), - None => pattern == host, - } -} -struct Hooks { - id: String, - grant: bool, - token: Arc, - items: Arc>, - outgoing: Arc, -} -fn response( - status: u16, - text: String, -) -> wasmtime_wasi_http::Result<(http::Response, Io)> { - let body = Full::new(Bytes::from(text)) - .map_err(|never| match never {}) - .boxed_unsync(); - Ok(( - http::Response::builder().status(status).body(body).unwrap(), - Box::new(async { Ok(()) }), - )) -} -impl WasiHttpHooks for Hooks { - fn send_request( - &mut self, - mut request: http::Request, - options: Option, - fut: Io, - ) -> Box, Io)>> + Send> - { - drop(fut); - if request.uri().host() == Some("host.sausage") { - let result = response(200, format!("caller={}", self.id)); - return Box::new(async move { - request.into_body().collect().await?; - result - }); - } - let matches: Vec<_> = self.items.iter().filter(|i| i.matches(&request)).collect(); - if matches.len() > 1 { - return Box::new(async move { - request.into_body().collect().await?; - Err(wasmtime_wasi_http::Error::InternalError(Some( - "two credential items match".into(), - ))) - }); - } - if let Some(item) = matches.first() { - if !self.grant && !item.free { - let result = response(403, format!("grant required: {}", item.name)); - return Box::new(async move { - request.into_body().collect().await?; - result - }); - } - // Stand-in for the isolated JavaScript transform. Only the host owns the token. - let transform = |r: &mut http::Request| { - r.headers_mut().insert( - http::header::AUTHORIZATION, - format!("Bearer {}", self.token).parse().unwrap(), - ); - }; - transform(&mut request); - } - self.outgoing.fetch_add(1, Ordering::SeqCst); - Box::new(async move { - // Hyper drops unknown-length GET bodies before the guest can finish its WASI stream. - // Complete the body first. Collected preserves its data and trailers. - let (parts, body) = request.into_parts(); - let body = body.collect().await?.map_err(|never| match never {}); - let request = http::Request::from_parts(parts, body); - let (res, io) = wasmtime_wasi_http::default_send_request(request, options).await?; - Ok((res.map(BodyExt::boxed_unsync), Box::new(io) as Io)) - }) - } -} -struct State { - ctx: WasiCtx, - table: ResourceTable, - http: WasiHttpCtx, - hooks: Hooks, -} -impl WasiView for State { - fn ctx(&mut self) -> WasiCtxView<'_> { - WasiCtxView { - ctx: &mut self.ctx, - table: &mut self.table, - } - } -} -impl WasiHttpView for State { - fn http(&mut self) -> WasiHttpCtxView<'_> { - WasiHttpCtxView { - ctx: &mut self.http, - table: &mut self.table, - hooks: &mut self.hooks, - } - } -} - -#[tokio::main] -async fn main() -> Result<()> { - let component_path = std::env::args().nth(1).expect("guest component path"); - std::fs::create_dir_all("/tmp/s5-http/world")?; - std::fs::write("/tmp/s5-http/world/public.txt", "public fixture")?; - // A fresh host-only token is absent from guest source, argv, env, and preopened files. - let token = Arc::new(format!( - "s5-secret-{}", - std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH)? - .as_nanos() - )); - let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await?; - let port = listener.local_addr()?.port(); - let received = Arc::new(AtomicUsize::new(0)); - let count = received.clone(); - let server_token = token.clone(); - let server = tokio::spawn(async move { - loop { - let (socket, _) = listener.accept().await.unwrap(); - let count = count.clone(); - let token = server_token.clone(); - let service = service_fn(move |request: hyper::Request| { - let count = count.clone(); - let token = token.clone(); - async move { - let (parts, body) = request.into_parts(); - // Read through the terminal chunk before answering and closing the connection. - body.collect().await.unwrap(); - assert_eq!(parts.headers["x-guest"], "unchanged"); - let text = match parts.headers.get(http::header::AUTHORIZATION) { - Some(value) => { - assert_eq!(value.to_str().unwrap(), format!("Bearer {}", token)); - "authorization=present; token=correct; x-guest=unchanged" - } - None => "authorization=absent; x-guest=unchanged", - }; - count.fetch_add(1, Ordering::SeqCst); - Ok::<_, std::convert::Infallible>(http::Response::new(Full::new( - Bytes::from_static(text.as_bytes()), - ))) - } - }); - http1::Builder::new() - .keep_alive(false) - .serve_connection(TokioIo::new(socket), service) - .await - .unwrap(); - } - }); - let items = Arc::new(vec![ - Item { - name: "test-token", - scheme: "http", - hosts: vec!["127.0.0.1"], - prefixes: vec!["/private"], - methods: Some(vec![http::Method::GET]), - free: false, - }, - Item { - name: "collision", - scheme: "http", - hosts: vec!["127.0.0.1"], - prefixes: vec!["/private/overlap"], - methods: None, - free: false, - }, - Item { - name: "free-token", - scheme: "http", - hosts: vec!["127.0.0.1"], - prefixes: vec!["/free"], - methods: None, - free: true, - }, - ]); - let engine = Engine::default(); - let component = Component::from_file(&engine, component_path)?; - let mut linker = Linker::::new(&engine); - wasmtime_wasi::p2::add_to_linker_async(&mut linker)?; - wasmtime_wasi_http::p2::add_only_http_to_linker_async(&mut linker)?; - let outgoing = Arc::new(AtomicUsize::new(0)); - let cases = [ - ( - "identity-a", - "http://host.sausage/whoami".to_string(), - "GET", - false, - "caller=instance-1", - 0, - ), - ( - "identity-b", - "http://host.sausage/whoami".to_string(), - "GET", - false, - "caller=instance-2", - 0, - ), - ( - "granted", - format!("http://127.0.0.1:{port}/private"), - "GET", - true, - "authorization=present; token=correct", - 1, - ), - ( - "unmatched", - format!("http://127.0.0.1:{port}/public"), - "GET", - false, - "authorization=absent", - 1, - ), - ( - "denied", - format!("http://127.0.0.1:{port}/private"), - "GET", - false, - "status=403\nresponse-headers={}\nbody=grant required: test-token", - 0, - ), - ( - "ambiguous", - format!("http://127.0.0.1:{port}/private/overlap"), - "GET", - true, - "two credential items match", - 0, - ), - ( - "method-mismatch", - format!("http://127.0.0.1:{port}/private"), - "POST", - false, - "authorization=absent", - 1, - ), - ( - "free-use", - format!("http://127.0.0.1:{port}/free"), - "POST", - false, - "authorization=present; token=correct", - 1, - ), - ]; - for (index, (name, url, method, grant, expected, sockets)) in cases.into_iter().enumerate() { - let before = outgoing.load(Ordering::SeqCst); - let stdout = wasmtime_wasi::p2::pipe::MemoryOutputPipe::new(16384); - let stderr = wasmtime_wasi::p2::pipe::MemoryOutputPipe::new(16384); - let mut ctx = WasiCtx::builder(); - ctx.args(&["s5-curl", &url, method]) - .env("PUBLIC", "visible") - .stdout(stdout.clone()) - .stderr(stderr.clone()); - ctx.preopened_dir("/tmp/s5-http/world", "/", wasmtime_wasi::FsPerms::ReadOnly)?; - let state = State { - ctx: ctx.build(), - table: ResourceTable::new(), - http: WasiHttpCtx::new(), - hooks: Hooks { - id: format!("instance-{}", index + 1), - grant, - token: token.clone(), - items: items.clone(), - outgoing: outgoing.clone(), - }, - }; - let mut store = Store::new(&engine, state); - let command = wasmtime_wasi::p2::bindings::Command::instantiate_async( - &mut store, &component, &linker, - ) - .await?; - assert!(command.wasi_cli_run().call_run(&mut store).await?.is_ok()); - let out = String::from_utf8(stdout.contents().to_vec())?; - let err = String::from_utf8(stderr.contents().to_vec())?; - assert!( - !out.contains(token.as_str()) && !err.contains(token.as_str()), - "secret leaked" - ); - assert!( - out.contains("environment=[(\"PUBLIC\", \"visible\")]"), - "{out}" - ); - assert!(out.contains("files=[\"public.txt\"]"), "{out}"); - assert!(out.contains("file=public fixture"), "{out}"); - assert!( - out.contains("request-headers={\"x-guest\": \"unchanged\"}"), - "{out}" - ); - assert!(out.contains(expected), "{name}: {out}\n{err}"); - assert_eq!(outgoing.load(Ordering::SeqCst) - before, sockets, "{name}"); - println!("PASS {name}: {expected}; transport calls={sockets}; guest secret absent"); - } - assert_eq!(received.load(Ordering::SeqCst), 4); - server.abort(); - println!("PASS all 8 guest cases; local server received exactly 4 requests"); - Ok(()) -} - -#[cfg(test)] -mod tests { - use super::*; - #[test] - fn rule_dimensions() { - let item = Item { - name: "test", - scheme: "http", - hosts: vec!["*.example.test"], - prefixes: vec!["/api"], - methods: Some(vec![http::Method::GET]), - free: false, - }; - for (url, method, expected) in [ - ("http://api.example.test/api/v1", "GET", true), - ("https://api.example.test/api/v1", "GET", false), - ("http://example.test/api/v1", "GET", false), - ("http://api.example.test/public", "GET", false), - ("http://api.example.test/api/v1", "POST", false), - ] { - let body = Full::new(Bytes::new()) - .map_err(|n| match n {}) - .boxed_unsync(); - let request = http::Request::builder() - .uri(url) - .method(method) - .body(body) - .unwrap(); - assert_eq!(item.matches(&request), expected, "{url} {method}"); - } - } - #[test] - fn host_patterns() { - assert!(host_matches("*.example.test", "api.example.test")); - assert!(host_matches("*.example.test", "a.b.example.test")); - assert!(!host_matches("*.example.test", "example.test")); - assert!(!host_matches("*.example.test", "badexample.test")); - assert!(host_matches("example.test", "example.test")); - assert!(!host_matches("example.test", "api.example.test")); - } -} diff --git a/spikes/s5-http/verify.nu b/spikes/s5-http/verify.nu deleted file mode 100644 index fe1d8d9..0000000 --- a/spikes/s5-http/verify.nu +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env nu -# Verify the guest, rule dimensions, and all end-to-end HTTP cases. -def main [] { - ^nix develop -c cargo build --manifest-path spikes/s5-http/guest/Cargo.toml --target wasm32-wasip2 -j 2 - if $env.LAST_EXIT_CODE != 0 { error make {msg: "guest build failed"} } - ^nix develop -c cargo test --manifest-path spikes/s5-http/Cargo.toml -j 2 - if $env.LAST_EXIT_CODE != 0 { error make {msg: "rule tests failed"} } - ^nix develop -c cargo run --manifest-path spikes/s5-http/Cargo.toml -j 2 -- spikes/s5-http/guest/target/wasm32-wasip2/debug/s5-curl.wasm - if $env.LAST_EXIT_CODE != 0 { error make {msg: "guest cases failed"} } -} diff --git a/spikes/s6-esbuild/README.md b/spikes/s6-esbuild/README.md deleted file mode 100644 index d8b0e6a..0000000 --- a/spikes/s6-esbuild/README.md +++ /dev/null @@ -1,61 +0,0 @@ -# S6: esbuild in WASI - -This spike builds unpatched esbuild v0.27.7 for `wasip1/wasm`. -Status: BLOCKED. The module bundles and renders, but both tested adapters trap. -The test requires a bundle through both the module and the adapted component. -Node executes each minified bundle with LinkeDOM and checks the rendered elements. -The test also requires byte-identical output from native esbuild. - -From the repository root: - -```sh -nix develop -c nu spikes/s6-esbuild/build.nu -nix develop -c nu spikes/s6-esbuild/test.nu -``` - -Requirements: Go, Node, npm, Nushell, Git, curl, wasm-tools, and Wasmtime 49.0.2. -The repository devshell supplies wasm-tools and Wasmtime. -The recipe downloads the command adapter from the Wasmtime v49.0.2 release. -Both the shared adapter and the v49.0.2 adapter fail with this Go build. -The recipe stores sources, dependencies, binaries, and bundles in `/tmp/s6-esbuild/`. -It fetches npm dependencies natively, not inside WASI. - -The benchmark reports process wall times, not internal compiler times. -It measures a first invocation and five repetitions with precompiled artifacts. -The first invocation can use Wasmtime's existing compilation cache. -The precompiled measurements exclude Cranelift compilation but include process startup and guest initialization. -Only use the locally generated `.cwasm` files with `--allow-precompiled`. - -The WASI preopen maps the fixture to `/` with `--dir .::/`. -A relative guest preopen (`--dir .`) fails with Go's path resolution. - -After the component blocker is resolved, probe optional CLI modes after the test: - -```sh -nix develop -c nu spikes/s6-esbuild/limitations.nu -``` - -This fixture verifies a single entry point and no custom plugins. -It does not verify a browser, the Sausage VFS, dependency installation in WASI, or TypeScript type checks. -See `.board/T6.report.md` for measured limitations and results. - -## Rework 1 - -The clock probe succeeds with clock IDs 0 and 1 at precision 0. -The Go probe also succeeds, even with additional initialization and allocation. -Run both probes with: - -```sh -nix develop -c nu spikes/s6-esbuild/diagnose.nu -``` - -The adapter assertion checks a state-memory sentinel, not clock support. -An unstripped esbuild build also fails that assertion through `fd_write`. -This evidence suggests memory corruption rather than an unsupported clock ID. -It does not identify the writer. - -`eager-state.experimental.patch` records an unverified adapter experiment. -The patch reserves adapter state before the guest starts. -Two attempts to build the adapter failed because of the local Rust target setup. -The recipe does not apply this patch. -The component bundle test and the precompiled benchmark remain blocked. diff --git a/spikes/s6-esbuild/app.tsx b/spikes/s6-esbuild/app.tsx deleted file mode 100644 index 1d75aa5..0000000 --- a/spikes/s6-esbuild/app.tsx +++ /dev/null @@ -1,8 +0,0 @@ -// This fixture checks TSX, package resolution, and browser rendering. -import { render } from 'preact'; - -const message: string = 'Hello from WASI'; -function App() { - return

{message}

Preact + TypeScript

; -} -render(, document.getElementById('app')!); diff --git a/spikes/s6-esbuild/build.nu b/spikes/s6-esbuild/build.nu deleted file mode 100644 index 020d463..0000000 --- a/spikes/s6-esbuild/build.nu +++ /dev/null @@ -1,29 +0,0 @@ -# Build unpatched esbuild v0.27.7 and adapt it into a WASI component. -def main [] { - let root = '/tmp/s6-esbuild' - let fixture = $env.FILE_PWD - mkdir $root - if not ($root | path join esbuild | path exists) { - ^git clone --depth 1 --branch v0.27.7 https://github.com/evanw/esbuild.git ($root | path join esbuild) - if $env.LAST_EXIT_CODE != 0 { error make {msg: 'clone failed'} } - } - cd ($root | path join esbuild) - with-env {GOOS: wasip1, GOARCH: wasm} { - ^go build -p 2 -trimpath '-ldflags=-s -w' -o ($root | path join esbuild.wasm) ./cmd/esbuild - if $env.LAST_EXIT_CODE != 0 { error make {msg: 'WASI build failed'} } - } - ^go build -p 2 -trimpath '-ldflags=-s -w' -o ($root | path join esbuild-native) ./cmd/esbuild - if $env.LAST_EXIT_CODE != 0 { error make {msg: 'native build failed'} } - let adapter = ($root | path join adapter-v49.wasm) - if not ($adapter | path exists) { - ^curl -fL https://github.com/bytecodealliance/wasmtime/releases/download/v49.0.2/wasi_snapshot_preview1.command.wasm -o $adapter - if $env.LAST_EXIT_CODE != 0 { error make {msg: 'adapter download failed'} } - } - ^wasm-tools component new ($root | path join esbuild.wasm) --adapt $'wasi_snapshot_preview1=($adapter)' -o ($root | path join esbuild.component.wasm) - if $env.LAST_EXIT_CODE != 0 { error make {msg: 'component adaptation failed'} } - mkdir ($root | path join app) - cp ($fixture | path join app.tsx) ($fixture | path join check.mjs) ($fixture | path join package.json) ($fixture | path join package-lock.json) ($root | path join app) - cd ($root | path join app) - ^npm ci --ignore-scripts --no-audit --no-fund - if $env.LAST_EXIT_CODE != 0 { error make {msg: 'npm ci failed'} } -} diff --git a/spikes/s6-esbuild/check.mjs b/spikes/s6-esbuild/check.mjs deleted file mode 100644 index dc255f0..0000000 --- a/spikes/s6-esbuild/check.mjs +++ /dev/null @@ -1,12 +0,0 @@ -// Execute the actual browser bundle against a small DOM implementation. -import assert from 'node:assert/strict'; -import { readFileSync } from 'node:fs'; -import vm from 'node:vm'; -import { parseHTML } from 'linkedom'; - -const { window, document } = parseHTML('
'); -vm.runInNewContext(readFileSync(process.argv[2], 'utf8'), { window, document, console, setTimeout }); -assert.equal(document.querySelector('h1')?.textContent, 'Hello from WASI'); -assert.equal(document.querySelector('p')?.textContent, 'Preact + TypeScript'); -assert.equal(document.querySelectorAll('main').length, 1); -console.log(`PASS render ${process.argv[2]}: ${document.getElementById('app').innerHTML}`); diff --git a/spikes/s6-esbuild/clocks.wat b/spikes/s6-esbuild/clocks.wat deleted file mode 100644 index de45860..0000000 --- a/spikes/s6-esbuild/clocks.wat +++ /dev/null @@ -1,10 +0,0 @@ -;; Test the Go runtime's exact clock IDs and precision without a Go allocator. -(module - (import "wasi_snapshot_preview1" "clock_time_get" - (func $clock (param i32 i64 i32) (result i32))) - (memory (export "memory") 1) - (func (export "_start") - i32.const 0 i64.const 0 i32.const 0 call $clock - if unreachable end - i32.const 1 i64.const 0 i32.const 8 call $clock - if unreachable end)) diff --git a/spikes/s6-esbuild/diagnose.nu b/spikes/s6-esbuild/diagnose.nu deleted file mode 100644 index b564db4..0000000 --- a/spikes/s6-esbuild/diagnose.nu +++ /dev/null @@ -1,19 +0,0 @@ -# Compare Go initialization and exact runtime clock calls with the stock adapter. -def main [] { - let fixture = $env.FILE_PWD - let root = '/tmp/s6-esbuild' - with-env {GOOS: wasip1, GOARCH: wasm} { - ^go build -o $'($root)/hello-http.wasm' ($fixture | path join hello.go) - if $env.LAST_EXIT_CODE != 0 { error make {msg: 'Go probe build failed'} } - } - for probe in [ - {input: $'($root)/hello-http.wasm', output: hello-http}, - {input: ($fixture | path join clocks.wat), output: clocks} - ] { - ^wasm-tools component new $probe.input --adapt $'wasi_snapshot_preview1=($root)/adapter-v49.wasm' -o $'($root)/($probe.output).component.wasm' - if $env.LAST_EXIT_CODE != 0 { error make {msg: 'probe adaptation failed'} } - ^wasmtime run $'($root)/($probe.output).component.wasm' - if $env.LAST_EXIT_CODE != 0 { error make {msg: 'probe execution failed'} } - print $'PASS stock adapter: ($probe.output)' - } -} diff --git a/spikes/s6-esbuild/eager-state.experimental.patch b/spikes/s6-esbuild/eager-state.experimental.patch deleted file mode 100644 index 40b63b5..0000000 --- a/spikes/s6-esbuild/eager-state.experimental.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff --git a/crates/wasi-preview1-component-adapter/src/lib.rs b/crates/wasi-preview1-component-adapter/src/lib.rs -index 7ce52c6..55a8480 100644 ---- a/crates/wasi-preview1-component-adapter/src/lib.rs -+++ b/crates/wasi-preview1-component-adapter/src/lib.rs -@@ -129,6 +129,9 @@ pub extern "C" fn run() -> u32 { - unsafe extern "C" { - safe fn _start(); - } -+ // Reserve adapter state before Go snapshots the linear-memory heap extent. -+ // Lazy memory.grow allocations otherwise overlap Go's sbrk allocator. -+ State::ptr(); - _start(); - 0 - } diff --git a/spikes/s6-esbuild/hello.go b/spikes/s6-esbuild/hello.go deleted file mode 100644 index 00a7972..0000000 --- a/spikes/s6-esbuild/hello.go +++ /dev/null @@ -1,27 +0,0 @@ -// Minimal Go runtime initialization and clock probe for the adapter. -package main - -import ( - "fmt" - _ "net/http" - "time" -) - -var blob [20 << 20]byte -var allocations [][]byte - -func init() { - for i := 0; i < 20000; i++ { - allocations = append(allocations, make([]byte, 1024)) - } -} - -func main() { - blob[0] = 1 - fmt.Println("Go WASI clock before allocation:", time.Now().UnixNano(), blob[0]) - data := make([]byte, 32<<20) - for i := range data { - data[i] = 1 - } - fmt.Println("Go WASI clock after allocation:", time.Now().UnixNano(), data[len(data)-1]) -} diff --git a/spikes/s6-esbuild/limitations.nu b/spikes/s6-esbuild/limitations.nu deleted file mode 100644 index 9bc6647..0000000 --- a/spikes/s6-esbuild/limitations.nu +++ /dev/null @@ -1,15 +0,0 @@ -# Probe optional CLI modes after test.nu creates the precompiled component. -def main [] { - cd /tmp/s6-esbuild/app - for flags in [ - ['--serve=127.0.0.1:8000'], - ['--watch=forever'], - ['--plugins=example'] - ] { - print $'PROBE ($flags | str join " ")' - let result = (^wasmtime run -W timeout=2s --allow-precompiled --dir .::/ /tmp/s6-esbuild/component.cwasm app.tsx --bundle --jsx=automatic --jsx-import-source=preact --outfile=probe.js ...$flags | complete) - print $'exit=($result.exit_code)' - print $result.stdout - print $result.stderr - } -} diff --git a/spikes/s6-esbuild/package-lock.json b/spikes/s6-esbuild/package-lock.json deleted file mode 100644 index a25435d..0000000 --- a/spikes/s6-esbuild/package-lock.json +++ /dev/null @@ -1,210 +0,0 @@ -{ - "name": "s6-esbuild-fixture", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "s6-esbuild-fixture", - "dependencies": { - "linkedom": "0.18.12", - "preact": "10.27.2" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "license": "MIT" - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/html-escaper": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", - "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", - "license": "MIT" - }, - "node_modules/htmlparser2": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", - "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "entities": "^7.0.1" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/linkedom": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/linkedom/-/linkedom-0.18.12.tgz", - "integrity": "sha512-jalJsOwIKuQJSeTvsgzPe9iJzyfVaEJiEXl+25EkKevsULHvMJzpNqwvj1jOESWdmgKDiXObyjOYwlUqG7wo1Q==", - "license": "ISC", - "dependencies": { - "css-select": "^5.1.0", - "cssom": "^0.5.0", - "html-escaper": "^3.0.3", - "htmlparser2": "^10.0.0", - "uhyphen": "^0.2.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "canvas": ">= 2" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/preact": { - "version": "10.27.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz", - "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/uhyphen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/uhyphen/-/uhyphen-0.2.0.tgz", - "integrity": "sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==", - "license": "ISC" - } - } -} diff --git a/spikes/s6-esbuild/package.json b/spikes/s6-esbuild/package.json deleted file mode 100644 index 983e56a..0000000 --- a/spikes/s6-esbuild/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "s6-esbuild-fixture", - "private": true, - "type": "module", - "dependencies": { - "preact": "10.27.2", - "linkedom": "0.18.12" - } -} diff --git a/spikes/s6-esbuild/test.nu b/spikes/s6-esbuild/test.nu deleted file mode 100644 index 6f16e96..0000000 --- a/spikes/s6-esbuild/test.nu +++ /dev/null @@ -1,58 +0,0 @@ -# Verify both WASI forms, render their bundles, and compare process wall times. -use std/assert -def checked [program: string, args: list] { - let start = date now - let result = (run-external $program ...$args | complete) - let ms = ((date now) - $start) / 1ms - if $result.exit_code != 0 { - print $result.stdout - print --stderr $result.stderr - error make {msg: $'Failed: ($program) ($args | str join " ")'} - } - {ms: $ms, stdout: ($result.stdout | str trim)} -} - -def main [] { - let root = '/tmp/s6-esbuild' - cd ($root | path join app) - ^go version - ^wasmtime --version - let flags = ['app.tsx' '--bundle' '--minify' '--format=iife' '--platform=browser' '--jsx=automatic' '--jsx-import-source=preact' '--legal-comments=none' '--log-level=error'] - let variants = [ - {name: native, program: $'($root)/esbuild-native', prefix: []}, - {name: module, program: wasmtime, prefix: [run --dir .::/ $'($root)/esbuild.wasm']}, - {name: component, program: wasmtime, prefix: [run --dir .::/ $'($root)/esbuild.component.wasm']} - ] - for variant in $variants { - let version = checked $variant.program ($variant.prefix | append '--version') - assert equal $version.stdout '0.27.7' - print $'PASS ($variant.name) version=($version.stdout) first_startup_ms=($version.ms)' - let result = checked $variant.program ($variant.prefix | append $flags | append $'--outfile=($variant.name).js') - print $'PASS ($variant.name) first_bundle_ms=($result.ms)' - let render = checked node [check.mjs $'($variant.name).js'] - print $render.stdout - } - assert equal (open --raw native.js) (open --raw module.js) - assert equal (open --raw native.js) (open --raw component.js) - print $'PASS byte-identical native/module/component bundles: ((ls component.js).size.0)' - for name in [esbuild-native esbuild.wasm esbuild.component.wasm] { - let size = (ls ($root | path join $name)).size.0 - print $'SIZE ($name): ($size | into int) bytes' - } - # Precompiled artifacts model the host cache without including Cranelift compilation. - for name in [module component] { - let input = if $name == module { 'esbuild.wasm' } else { 'esbuild.component.wasm' } - let compile = checked wasmtime [compile $'($root)/($input)' -o $'($root)/($name).cwasm'] - print $'COMPILE ($name): ($compile.ms) ms' - } - for variant in [ - {name: native, program: $'($root)/esbuild-native', prefix: []}, - {name: module-precompiled, program: wasmtime, prefix: [run --allow-precompiled --dir .::/ $'($root)/module.cwasm']}, - {name: component-precompiled, program: wasmtime, prefix: [run --allow-precompiled --dir .::/ $'($root)/component.cwasm']} - ] { - let startup = (1..5 | each { (checked $variant.program ($variant.prefix | append '--version')).ms }) - let bundle = (1..5 | each { (checked $variant.program ($variant.prefix | append $flags | append '--outfile=bench.js')).ms }) - print $'BENCH ($variant.name) median_ms n=5: startup=($startup | math median) bundle=($bundle | math median)' - } - print 'PASS all acceptance checks' -} diff --git a/spikes/s7-preview1-adapter/README.md b/spikes/s7-preview1-adapter/README.md deleted file mode 100644 index c147450..0000000 --- a/spikes/s7-preview1-adapter/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# Preview1 command adapter experiment - -This directory tests D39 with Go esbuild, uutils, and QuickJS. -The patch reserves the adapter state before the guest calls `_start`. -It retains both state sentinels and all WASI semantics. - -## Build - -From the repository root: - -```sh -nix develop -c nu spikes/s7-preview1-adapter/build.nu -nix develop -c nu spikes/s7-preview1-adapter/test.nu -``` - -The build pins Wasmtime v49.0.2 to commit -`3c8a3e79aa3188a1a12b3aebbaa097abccceac92` and uses its Cargo.lock with `--locked`. -The repository flake pins the Rust toolchain through flake.lock. -The build requires the `wasm32-unknown-unknown` standard library. -T11 removed this target from the production flake after T7 disproved the patch. -To repeat this historical experiment, supply that target in a separate Rust toolchain. -It places sources, a persistent target directory, and the adapter under `/tmp/p1-adapter/`. - -The test uses the S6 esbuild v0.27.7 module at `/tmp/s6-esbuild/esbuild.wasm`. -The S6 build recipe can create this input. -The test copies the S6 fixture into its own scratch directory and installs its locked dependencies. -It compares module and component bundles byte-for-byte and checks rendered elements with LinkeDOM. -It also adapts the lab's preview1 uutils and QuickJS modules. -These smoke tests check command arguments and stdout. -They do not check every utility or JavaScript feature. - -The test requires these existing lab inputs: - -- `/tmp/wasi-userland-lab/uu/coreutils-0.12.0-wasm32-wasip1/coreutils.wasm` -- `/tmp/wasi-userland-lab/qjs-wasi.wasm` - -## Result - -The eager-state patch does not fix esbuild. -The component traps during `--version` after Go overwrites the adapter state sentinels. -The uutils and QuickJS smoke tests pass. -The task report records the sentinel addresses and values. - -`diagnostic.patch` is an alternative patch against the same pristine Wasmtime revision. -It includes the eager-state change and prints state sentinels before `_start` and upon corruption. -It does not disable assertions. -Do not apply both patches to one source tree. -The diagnostic build uses the same Cargo command as the normal build. -Use `wasm-tools component new` with its resulting adapter to reproduce the trace. - -The eager-state change does not reserve its memory from Go's allocator. -Go starts its allocation cursor at the end of its static data, not at the current memory size. -The host-side adapter is the next planned approach under D39. diff --git a/spikes/s7-preview1-adapter/build.nu b/spikes/s7-preview1-adapter/build.nu deleted file mode 100644 index ddcac45..0000000 --- a/spikes/s7-preview1-adapter/build.nu +++ /dev/null @@ -1,29 +0,0 @@ -# Build the command adapter from pinned Wasmtime sources and a local patch. -def main [] { - let root = '/tmp/p1-adapter' - let source = $root | path join wasmtime - let revision = '3c8a3e79aa3188a1a12b3aebbaa097abccceac92' - mkdir $root - if not ($source | path exists) { - ^git clone --depth 1 --branch v49.0.2 https://github.com/bytecodealliance/wasmtime.git $source - if $env.LAST_EXIT_CODE != 0 { error make {msg: 'clone failed'} } - } - if ((^git -C $source rev-parse HEAD | str trim) != $revision) { - error make {msg: 'unexpected Wasmtime revision'} - } - let patch = $env.FILE_PWD | path join eager-state.patch - let applied = (^git -C $source apply --reverse --check $patch | complete) - if $applied.exit_code != 0 { - ^git -C $source apply $patch - if $env.LAST_EXIT_CODE != 0 { error make {msg: 'patch failed'} } - } - cd $source - with-env {CARGO_TARGET_DIR: '/tmp/p1-adapter/target', CARGO_BUILD_JOBS: '2'} { - ^cargo build --locked -p wasi-preview1-component-adapter --target wasm32-unknown-unknown --release --features command --no-default-features - if $env.LAST_EXIT_CODE != 0 { error make {msg: 'adapter build failed'} } - } - cp ($root | path join target wasm32-unknown-unknown release wasi_snapshot_preview1.wasm) ($root | path join adapter-command.wasm) - ^wasm-tools validate ($root | path join adapter-command.wasm) - if $env.LAST_EXIT_CODE != 0 { error make {msg: 'adapter validation failed'} } - print 'PASS patched command adapter build' -} diff --git a/spikes/s7-preview1-adapter/diagnostic.patch b/spikes/s7-preview1-adapter/diagnostic.patch deleted file mode 100644 index de090f0..0000000 --- a/spikes/s7-preview1-adapter/diagnostic.patch +++ /dev/null @@ -1,54 +0,0 @@ -diff --git a/crates/wasi-preview1-component-adapter/src/lib.rs b/crates/wasi-preview1-component-adapter/src/lib.rs -index 7ce52c6..ed23010 100644 ---- a/crates/wasi-preview1-component-adapter/src/lib.rs -+++ b/crates/wasi-preview1-component-adapter/src/lib.rs -@@ -129,6 +129,11 @@ pub extern "C" fn run() -> u32 { - unsafe extern "C" { - safe fn _start(); - } -+ // Reserve adapter state before Go snapshots the linear-memory heap extent. -+ // Lazy memory.grow allocations otherwise overlap Go's sbrk allocator. -+ let state = State::ptr(); -+ eprint!("before _start: "); -+ state.trace(); - _start(); - 0 - } -@@ -2852,8 +2857,24 @@ unsafe extern "C" { - } - - impl State { -+ fn trace(&self) { -+ eprint!("ptr="); -+ crate::macros::eprint_u32(self as *const Self as u32); -+ eprint!(" magic1="); -+ crate::macros::eprint_u32(self.magic1); -+ eprint!(" magic2="); -+ crate::macros::eprint_u32(self.magic2); -+ eprint!(" memory_pages="); -+ crate::macros::eprint_u32(core::arch::wasm32::memory_size::<0>() as u32); -+ eprintln!(""); -+ } -+ - fn with(f: impl FnOnce(&State) -> Result<(), Errno>) -> Errno { - let state_ref = State::ptr(); -+ if state_ref.magic1 != MAGIC || state_ref.magic2 != MAGIC { -+ eprint!("corrupt state: "); -+ state_ref.trace(); -+ } - assert_eq!(state_ref.magic1, MAGIC); - assert_eq!(state_ref.magic2, MAGIC); - let ret = f(state_ref); -diff --git a/crates/wasi-preview1-component-adapter/src/macros.rs b/crates/wasi-preview1-component-adapter/src/macros.rs -index d5649f4..3b5adf4 100644 ---- a/crates/wasi-preview1-component-adapter/src/macros.rs -+++ b/crates/wasi-preview1-component-adapter/src/macros.rs -@@ -40,7 +40,7 @@ pub fn eprint_unreachable(line: u32) { - crate::macros::eprint_u32(line); - } - --fn eprint_u32(x: u32) { -+pub(crate) fn eprint_u32(x: u32) { - if x == 0 { - eprint!("0"); - } else { diff --git a/spikes/s7-preview1-adapter/eager-state.patch b/spikes/s7-preview1-adapter/eager-state.patch deleted file mode 100644 index 40b63b5..0000000 --- a/spikes/s7-preview1-adapter/eager-state.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff --git a/crates/wasi-preview1-component-adapter/src/lib.rs b/crates/wasi-preview1-component-adapter/src/lib.rs -index 7ce52c6..55a8480 100644 ---- a/crates/wasi-preview1-component-adapter/src/lib.rs -+++ b/crates/wasi-preview1-component-adapter/src/lib.rs -@@ -129,6 +129,9 @@ pub extern "C" fn run() -> u32 { - unsafe extern "C" { - safe fn _start(); - } -+ // Reserve adapter state before Go snapshots the linear-memory heap extent. -+ // Lazy memory.grow allocations otherwise overlap Go's sbrk allocator. -+ State::ptr(); - _start(); - 0 - } diff --git a/spikes/s7-preview1-adapter/test.nu b/spikes/s7-preview1-adapter/test.nu deleted file mode 100644 index 9d0f083..0000000 --- a/spikes/s7-preview1-adapter/test.nu +++ /dev/null @@ -1,43 +0,0 @@ -# Compare esbuild bundles and test preview1 uutils and QuickJS with this adapter. -use std/assert -def checked [program: string, args: list] { - let result = (run-external $program ...$args | complete) - if $result.exit_code != 0 { - print $result.stdout - print --stderr $result.stderr - error make {msg: $'Failed: ($program) ($args | str join " ")'} - } - $result.stdout | str trim -} -def main [] { - let root = '/tmp/p1-adapter' - let adapter = $root | path join adapter-command.wasm - for guest in [ - {name: coreutils, path: '/tmp/wasi-userland-lab/uu/coreutils-0.12.0-wasm32-wasip1/coreutils.wasm', args: [echo adapter-ok], expected: adapter-ok}, - {name: QuickJS, path: '/tmp/wasi-userland-lab/qjs-wasi.wasm', args: [-e 'console.log(6 * 7)'], expected: '42'} - ] { - let binary = $root | path join $'($guest.name).wasm' - checked wasm-tools [component new $guest.path --adapt $'wasi_snapshot_preview1=($adapter)' -o $binary] | ignore - assert equal (checked wasmtime ([run $binary] | append $guest.args)) $guest.expected - print $'PASS ($guest.name): ($guest.expected)' - } - let fixture = $env.FILE_PWD | path join ../s6-esbuild | path expand - let app = $root | path join app - mkdir $app - cp ($fixture | path join app.tsx) ($fixture | path join check.mjs) ($fixture | path join package.json) ($fixture | path join package-lock.json) $app - cd $app - print (checked npm [ci --ignore-scripts --no-audit --no-fund]) - let flags = [app.tsx --bundle --minify --format=iife --platform=browser --jsx=automatic --jsx-import-source=preact --legal-comments=none --log-level=error] - for variant in [module component] { - let binary = if $variant == module { '/tmp/s6-esbuild/esbuild.wasm' } else { $root | path join esbuild.component.wasm } - if $variant == component { - checked wasm-tools [component new /tmp/s6-esbuild/esbuild.wasm --adapt $'wasi_snapshot_preview1=($adapter)' -o $binary] | ignore - } - assert equal (checked wasmtime [run --dir .::/ $binary --version]) '0.27.7' - checked wasmtime ([run --dir .::/ $binary] | append $flags | append $'--outfile=($variant).js') | ignore - print (checked node [check.mjs $'($variant).js']) - } - assert equal (open --raw module.js) (open --raw component.js) - print 'PASS byte-identical module/component bundles' - print 'PASS all adapter checks' -} diff --git a/userland/box/Cargo.toml b/userland/box/Cargo.toml deleted file mode 100644 index 7085b30..0000000 --- a/userland/box/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "box-cli" -version = "0.1.0" -edition = "2024" - -[[bin]] -name = "box" -path = "src/main.rs" - -[dependencies] -clap = { version = "4", features = ["derive"] } -serde = { version = "1", features = ["derive"] } -serde_json = "1" -wasi = "0.14" -url = "2" -tar = { version = "0.4", default-features = false } diff --git a/userland/box/README.md b/userland/box/README.md deleted file mode 100644 index b139104..0000000 --- a/userland/box/README.md +++ /dev/null @@ -1,118 +0,0 @@ -# box - -`box` runs builds and tests in disposable containers through the containers service at `citadel.vpn.surma.technology:8093`. -All network operations use standard `wasi:http`. The component has no Sausage host imports. - -## Commands - -```sh -box create [--flake reference] [--ttl seconds] -box exec ID [--timeout seconds] [--inline-bytes bytes] -- COMMAND ARGUMENTS... -box put ID WORLD_PATH BOX_PATH -box get ID BOX_PATH WORLD_PATH -box logs ID -box ls -box rm ID -``` - -Every command accepts `--host hostname[:port]`. The default port is 8093. -Create remembers the host in `/var/lib/box/hosts/`. Separate files prevent unrelated creates from replacing each other’s mappings. -Other commands use the remembered host unless `--host` overrides it. Unknown IDs use the default service. -Host mappings remain after deletion for diagnostics. They contain no credentials. - -Create prints the ID and waits up to 240 seconds for readiness. -Without a flake, it uses v2’s Node/NixOS configuration with Node, npm, Git, Chromium, fonts, and tar. -A flake selects a service-side configuration, for example `github:OWNER/REPO#container`. -TTL is positive seconds from creation. The service defaults to 3600 seconds. -A failed or timed-out create reports its accepted ID. Do not repeat create blindly. Inspect logs and remove that ID. - -Exec runs as root. It passes an argv array without shell interpolation. -For shell syntax, use `-- sh -c 'COMMAND'`. The timeout defaults to 60 seconds and accepts 1 through 1800 seconds. -Exec prints stdout and stderr separately and returns the command’s exit code. -It does not consume local stdin. Use put for inputs. - -Put detects a local directory. Get detects a remote directory. -File transfers support binary bytes and a 64 MiB limit. Downloads replace a destination file only after complete validation. -Tree transfers use an uncompressed tar with a 64 MiB limit. Put merges into a box directory. -Get requires a new world directory and publishes it only after complete extraction. -The port preserves v2’s portable file modes and hardlink materialization. -Get rejects symlinks because the world VFS cannot create them. Export a dereferenced tree when necessary. -Special files and paths outside the destination fail explicitly. -Temporary tar files disappear after a transfer, including failures where cleanup remains possible. - -## Build a pnpm project in a box - -```sh -id=$(box create --ttl 1800) -box put "$id" /repos/project /work -box exec "$id" --timeout 600 -- sh -c 'cd /work && npm install --global pnpm && pnpm install --frozen-lockfile && pnpm test && pnpm build' -box get "$id" /work/dist /repos/project-dist -box logs "$id" -box rm "$id" -``` - -Use the same ID to inspect failed builds. Always remove disposable boxes when the work ends. -Boxes have open network access. The world’s host credential boundary remains unchanged. - -## Output retention - -The CLI preserves v2’s full output archives independently of presentation. -It downloads both raw streams for new-service executions, including small and binary output. -Files live under `/logs/box/YYYY-MM-DD/-.stdout` and `.stderr`. -Collision snapshots receive unique suffixes. Existing archives never change. -Result JSON retains original service excerpts before the CLI bounds presentation. -The CLI prints archive paths and availability notices on stderr. - -Each displayed stream defaults to a 16 KiB UTF-8 head and tail budget. -The omission marker is outside that budget. `--inline-bytes 0` prints only the marker for nonempty output. -A larger budget reads archives, not an already-truncated service excerpt. UTF-8 replacement remains bounded. -Full archives have no retention cap. Transfer limits do not cap execution archives. - -Downloads request 1 MiB ranges and validate every Content-Range page and exact byte total. -They also accept a complete 200 response from a server that ignores Range. -A shared deadline allows 60 seconds plus one second per 256 KiB of combined output, capped at 30 minutes. -Unknown totals receive five minutes. Only immutable archive GETs retry. Exec POSTs never retry. -Incomplete archives retain `.partial` names. Only complete, flushed downloads receive published paths. - -Build logs try `/log/full`. Only 404 or 405 triggers `/log` fallback. -The CLI retains all available raw build bytes and displays at most their last 16 KiB. -A fallback warning states that earlier bytes may be unavailable. -Failed creates archive build diagnostics. Explicit removal attempts a build snapshot but proceeds if that snapshot fails. - -Old services expose only JSON stream text. The CLI saves all available text before presentation limits. -It warns when upstream truncation discarded bytes. Those missing bytes cannot be restored. -Archive failures return the completed command and an availability notice. Never replay a command to repair its archive. - -## Build and validation - -Build the shared startup object from the repository root: - -```sh -nix develop -c nu --no-config-file userland/cwd-init/build.nu -``` - -Run the following commands from `userland/` so Cargo loads the shared startup and numeric exit support: - -```sh -df -h / -export CARGO_TARGET_DIR=/home/surma/src/gitea.surma.technology/surma/sausage/target/p1-tools -nix develop -c cargo build -p box-cli --target wasm32-wasip2 --release --locked -nix develop -c kache stats -nix develop -c nu box/test.nu -``` - -The existing `userland/bundle.nu` discovers the workspace member and copies its `box` binary into `/bin`. -It applies the same cwd initializer as other bundled programs. - -Keep the same target directory for tests. Do not override `CARGO_HOME` or `RUSTC_WRAPPER`. -Stop before a build if disk use exceeds 85%. -Run pure unit tests with the native target from `rustc -vV`, for example: - -```sh -nix develop -c cargo test -p box-cli --target aarch64-unknown-linux-gnu --locked -``` - -The real-service script tests every required command and removes every created box, including after an assertion failure. -It round-trips files and nested trees, runs a tiny Node project through npm test, and retrieves its result. -It also verifies large binary archive retention and WASI-only component imports. -The script preserves its temporary world and archives as evidence. diff --git a/userland/box/src/archive.rs b/userland/box/src/archive.rs deleted file mode 100644 index 6e560b6..0000000 --- a/userland/box/src/archive.rs +++ /dev/null @@ -1,237 +0,0 @@ -//! Raw archive downloads. Range pages are validated before advancing; no byte caps. -use crate::{Result, error, http, retention}; -use std::io::{Read, Seek, SeekFrom, Write}; -use wasi::http::types::Method; - -pub struct Download { - pub path: String, - pub bytes: u64, -} - -// Only immutable archive GETs are retried, never the command POST. Divide the -// remaining total budget so a stalled first attempt cannot consume every retry. -// Failed partial files remain explicitly partial; only verified downloads publish. -pub fn exec_download( - h: &str, - url: &str, - name: &str, - extension: &str, - deadline: u64, - expected: Option, -) -> Result { - let mut last = error("exec archive deadline exceeded"); - for remaining in (1..=3).rev() { - let now = http::now(); - if now >= deadline { - break; - } - let attempt_deadline = now.saturating_add((deadline - now) / remaining); - match download_verified(h, url, name, extension, attempt_deadline, false, expected) { - Ok(Some(saved)) => return Ok(saved), - Ok(None) => return Err(error("missing exec archive")), - Err(e) => { - // Validation/local storage errors are not transient network failures. - let retry = [ - "HTTP failed:", - "HTTP start:", - "archive download failed:", - "deadline exceeded", - "incomplete archive page", - "HTTP 500", - "HTTP 502", - "HTTP 503", - "HTTP 504", - ] - .iter() - .any(|message| e.message.contains(message)); - if !retry { - return Err(e); - } - eprintln!( - "box archive GET attempt {} failed: {}", - 4 - remaining, - e.message - ); - last = e; - } - } - } - Err(last) -} - -pub fn download( - h: &str, - url: &str, - name: &str, - extension: &str, - deadline: u64, - missing: bool, -) -> Result> { - download_verified(h, url, name, extension, deadline, missing, None) -} - -pub fn download_verified( - h: &str, - url: &str, - name: &str, - extension: &str, - deadline: u64, - missing: bool, - expected: Option, -) -> Result> { - let mut offset = 0u64; - let mut total = None; - let mut output = None; - let result = (|| { - loop { - let range = format!("bytes={offset}-{}", offset.saturating_add(1024 * 1024 - 1)); - let mut response = http::request_options( - h, - Method::Get, - url, - None, - 30, - Some(deadline), - Some(&range), - missing && offset == 0, - )?; - if matches!(response.status, 404 | 405) { - return Ok(None); - } - let page = if response.status == 206 { - let (start, end, size) = - parse_range(response.content_range.as_deref().unwrap_or(""))?; - if start != offset || total.is_some_and(|t| t != size) { - return Err(error("inconsistent archive range")); - } - total = Some(size); - Some(end - start + 1) - } else if response.status == 200 && offset == 0 { - None - } else { - return Err(error("unexpected archive response status")); - }; - if output.is_none() { - output = Some(retention::create(name, &format!("{extension}.partial"))?); - } - let (path, file) = output - .as_mut() - .ok_or_else(|| error("archive file unavailable"))?; - let count = std::io::copy(&mut response, file).map_err(|e| { - error(format!( - "archive download failed: {e}; partial file: {path}" - )) - })?; - if page.is_some_and(|n| n != count) { - return Err(error(format!( - "incomplete archive page; partial file: {path}" - ))); - } - offset = offset - .checked_add(count) - .ok_or_else(|| error("archive size overflow"))?; - if page.is_none() || total == Some(offset) { - if expected.is_some_and(|n| n != offset) { - return Err(error("archive byte total mismatch")); - } - file.flush()?; - // Reserve a collision-safe final name; replace only our own empty reservation. - let (complete, reservation) = retention::create(name, extension)?; - drop(reservation); - if let Err(e) = std::fs::rename(&*path, &complete) { - let _ = std::fs::remove_file(&complete); - return Err(e.into()); - } - return Ok(Some(Download { - path: complete, - bytes: offset, - })); - } - } - })(); - result.map_err(|mut e: crate::Error| { - if let Some((path, _)) = output { - e.message.push_str(&format!("; incomplete archive: {path}")); - } - e - }) -} -fn parse_range(value: &str) -> Result<(u64, u64, u64)> { - let parsed = (|| { - let (span, size) = value.strip_prefix("bytes ")?.split_once('/')?; - let (start, end) = span.split_once('-')?; - Some(( - start.parse::().ok()?, - end.parse::().ok()?, - size.parse::().ok()?, - )) - })(); - match parsed { - Some((s, e, n)) if s <= e && e < n => Ok((s, e, n)), - _ => Err(error("invalid archive Content-Range")), - } -} - -// Presentation limit only: the complete raw response is always retained on disk. -pub const BUILD_EXCERPT_BYTES: u64 = 16 * 1024; -fn build_result(full: Download, service_truncated: bool) -> Result { - let mut file = std::fs::File::open(&full.path)?; - let start = full.bytes.saturating_sub(BUILD_EXCERPT_BYTES); - file.seek(SeekFrom::Start(start))?; - let mut bytes = Vec::new(); - file.take(BUILD_EXCERPT_BYTES).read_to_end(&mut bytes)?; - let mut notices = Vec::new(); - if service_truncated { - notices.push("Full build-log endpoint unavailable (unsupported service or missing archive); legacy endpoint may return only the last 64 KiB, so earlier bytes may be unavailable.".to_owned()); - } - if start > 0 { - notices.push(format!("Inline tail shows raw byte range {start}..{} (end exclusive); full {} bytes retained at {}.", full.bytes, full.bytes, full.path)); - } - Ok(crate::Log { - text: String::from_utf8_lossy(&bytes).into_owned(), - path: full.path, - bytes: full.bytes, - service_truncated, - notice: if notices.is_empty() { - None - } else { - Some(notices.join(" ")) - }, - }) -} - -pub fn build(h: &str, id: &str, deadline: u64) -> Result { - let base = crate::base(id)?; - let name = format!("{id}-build"); - if let Some(full) = download(h, &format!("{base}/log/full"), &name, "log", deadline, true)? { - return build_result(full, false); - } - let legacy = download(h, &format!("{base}/log"), &name, "log", deadline, false)? - .ok_or_else(|| error("missing legacy build log"))?; - build_result(legacy, true) -} - -#[cfg(test)] -mod tests { - use super::*; - #[test] - fn range_pages_require_valid_totals() { - assert_eq!( - parse_range("bytes 0-1048575/1200003").unwrap(), - (0, 1048575, 1200003) - ); - assert_eq!( - parse_range("bytes 1048576-1200002/1200003").unwrap(), - (1048576, 1200002, 1200003) - ); - for invalid in [ - "", - "bytes 1-0/2", - "bytes 0-2/2", - "bytes 0-0/0", - "bytes 0-1/*", - ] { - assert!(parse_range(invalid).is_err()); - } - } -} diff --git a/userland/box/src/cli.rs b/userland/box/src/cli.rs deleted file mode 100644 index f10685d..0000000 --- a/userland/box/src/cli.rs +++ /dev/null @@ -1,264 +0,0 @@ -//! Command arguments and presentation. Raw execution archives never depend on the inline budget. -use crate::*; -use clap::{Parser, Subcommand}; -#[derive(Parser, Debug)] -#[command(name = "box", about = "Disposable build and test boxes")] -pub struct Args { - #[arg(long, global = true, help = "Containers service hostname[:port]")] - pub host: Option, - #[command(subcommand)] - pub command: Operation, -} -#[derive(Subcommand, Debug)] -pub enum Operation { - Create { - #[arg(long)] - flake: Option, - #[arg(long, value_parser = clap::value_parser!(u32).range(1..))] - ttl: Option, - }, - Exec { - id: String, - #[arg(long, default_value_t = 60, value_parser = clap::value_parser!(u32).range(1..=1800))] - timeout: u32, - #[arg(long, default_value_t = excerpt::DEFAULT_BYTES)] - inline_bytes: u32, - #[arg(last = true, required = true)] - cmd: Vec, - }, - Put { - id: String, - world_path: String, - box_path: String, - }, - Get { - id: String, - box_path: String, - world_path: String, - }, - Logs { - id: String, - }, - Ls, - Rm { - id: String, - }, -} -fn notices(result: &Executed) { - for (name, path) in [ - ("stdout", &result.stdout_path), - ("stderr", &result.stderr_path), - ("result", &result.output_log), - ] { - if let Some(path) = path { - eprintln!("box {name} archive: {path}"); - } - } - if let Some(notice) = &result.output_notice { - eprintln!("box: {notice}"); - } - if result.timed_out { - eprintln!("box: command timed out"); - } -} -pub fn run(args: Args) -> Result { - let h = args.host; - let service = BoxPlugin; - match args.command { - Operation::Create { flake, ttl } => { - let config = Config { - nixos: flake.is_none().then(|| Nixos::Text(NODE_MODULE.into())), - flake, - system: None, - }; - let c = service.create(Create { - config, - ttl_secs: ttl, - owner: Some("box CLI".into()), - host: h, - })?; - println!("{}", c.id); - if c.state != "running" { - if let Some(tail) = c.build_log_tail { - eprintln!("{tail}"); - } - if let Some(path) = c.build_log_path { - eprintln!("box build archive: {path}"); - } - return Err(error(format!( - "box {} failed: {}; remove with box rm", - c.id, - c.error.unwrap_or_default() - ))); - } - } - Operation::Exec { - id, - timeout, - inline_bytes, - cmd, - } => { - let result = service.exec(Exec { - id, - cmd: Command::Argv(cmd), - stdin: None, - timeout_secs: Some(timeout), - inline_bytes: Some(inline_bytes), - host: h, - })?; - std::io::stdout().write_all(result.stdout.as_bytes())?; - std::io::stderr().write_all(result.stderr.as_bytes())?; - notices(&result); - return Ok(result.exit); - } - Operation::Put { - id, - world_path, - box_path, - } => { - if Path::new(&world_path).is_dir() { - service.put_tree(PutTree { - id, - from_vfs_dir: world_path, - to_dir: box_path, - host: h, - })?; - } else { - service.put_file(PutFile { - id, - path: box_path, - text: None, - from_vfs: Some(world_path), - host: h, - })?; - } - } - Operation::Get { - id, - box_path, - world_path, - } => { - let host = resolve(&id, h.as_deref())?; - let kind = checked( - &host, - &id, - json!([ - "sh", - "-c", - "if [ -d \"$1\" ]; then printf directory; elif [ -f \"$1\" ]; then printf file; else exit 1; fi", - "sh", - box_path - ]), - )?; - if kind == "directory" { - service.get_tree(GetTree { - id, - from_dir: box_path, - to_vfs_dir: world_path, - host: h, - })?; - } else { - service.get_file(GetFile { - id, - path: box_path, - to_vfs: Some(world_path), - host: h, - })?; - } - } - Operation::Logs { id } => { - let log = service.log(Id { id, host: h })?; - print!("{}", log.text); - eprintln!("box build archive: {} ({} bytes)", log.path, log.bytes); - if let Some(notice) = log.notice { - eprintln!("box: {notice}"); - } - } - Operation::Ls => { - let list = service.list(List { host: h })?; - for c in list.containers { - println!("{}\t{}\t{}", c.id, c.state, c.expires_at); - } - } - Operation::Rm { id } => { - service.delete(Id { id, host: h })?; - } - } - Ok(0) -} -#[cfg(test)] -mod tests { - use super::*; - #[test] - fn argument_forms_and_validation() { - for args in [ - vec!["box", "create"], - vec![ - "box", - "create", - "--flake", - "github:example/project#container", - "--ttl", - "600", - ], - vec![ - "box", - "exec", - "tc-abc123", - "--timeout", - "5", - "--", - "sh", - "-c", - "exit 7", - ], - vec!["box", "put", "tc-abc123", "dir", "/work"], - vec!["box", "get", "tc-abc123", "/work", "out"], - vec!["box", "logs", "tc-abc123"], - vec!["box", "ls"], - vec!["box", "rm", "tc-abc123"], - vec!["box", "--host", "localhost:8093", "ls"], - ] { - assert!(Args::try_parse_from(args).is_ok()); - } - for args in [ - vec!["box", "create", "--ttl", "0"], - vec!["box", "exec", "tc-abc123", "--"], - vec![ - "box", - "exec", - "tc-abc123", - "--timeout", - "1801", - "--", - "true", - ], - vec!["box", "exec", "tc-abc123", "true"], - vec!["box", "put", "tc-abc123", "a"], - vec!["box", "unknown"], - ] { - assert!(Args::try_parse_from(args).is_err()); - } - let args = Args::try_parse_from([ - "box", - "exec", - "tc-abc123", - "--inline-bytes", - "0", - "--", - "echo", - "--flag", - "space here", - ]) - .unwrap(); - match args.command { - Operation::Exec { - cmd, inline_bytes, .. - } => { - assert_eq!(cmd, ["echo", "--flag", "space here"]); - assert_eq!(inline_bytes, 0); - } - _ => panic!("wrong operation"), - } - } -} diff --git a/userland/box/src/excerpt.rs b/userland/box/src/excerpt.rs deleted file mode 100644 index 66fbf1b..0000000 --- a/userland/box/src/excerpt.rs +++ /dev/null @@ -1,108 +0,0 @@ -//! Presentation only. Never rewrite archives or change internal command output. -use crate::{Executed, Result}; -use std::io::{Read, Seek, SeekFrom}; - -pub const DEFAULT_BYTES: u32 = 16 * 1024; -const MARKER: &str = - "\n... [inline output omitted; see stream archive path for full available output] ...\n"; - -fn head(text: &str, bytes: usize) -> &str { - let mut end = bytes.min(text.len()); - while !text.is_char_boundary(end) { - end -= 1; - } - &text[..end] -} -fn tail(text: &str, bytes: usize) -> &str { - let mut start = text.len().saturating_sub(bytes); - while !text.is_char_boundary(start) { - start += 1; - } - &text[start..] -} -fn bounded(text: &str, budget: usize) -> (String, bool) { - if text.len() <= budget { - return (text.to_owned(), false); - } - let first = budget.div_ceil(2); - ( - format!( - "{}{MARKER}{}", - head(text, first), - tail(text, budget - first) - ), - true, - ) -} -fn from_file(path: &str, budget: usize) -> Result<(String, bool)> { - let mut file = std::fs::File::open(path)?; - let size = file.metadata()?.len(); - if size <= budget as u64 { - let mut bytes = Vec::new(); - file.take(budget as u64).read_to_end(&mut bytes)?; - return Ok(bounded(&String::from_utf8_lossy(&bytes), budget)); - } - let first = budget.div_ceil(2); - let last = budget - first; - let mut begin = Vec::new(); - (&mut file).take(first as u64).read_to_end(&mut begin)?; - file.seek(SeekFrom::Start(size - last as u64))?; - let mut end = Vec::new(); - file.take(last as u64).read_to_end(&mut end)?; - // UTF-8 replacement can expand binary input; bound displayed UTF-8 too. - Ok(( - format!( - "{}{MARKER}{}", - head(&String::from_utf8_lossy(&begin), first), - tail(&String::from_utf8_lossy(&end), last) - ), - true, - )) -} -pub fn apply(result: &mut Executed, budget: u32) { - let service_cut = result.truncated; - result.truncated = result.service_truncated; - for (stream, text, path) in [ - ("stdout", &mut result.stdout, &result.stdout_path), - ("stderr", &mut result.stderr, &result.stderr_path), - ] { - let excerpt = path.as_deref().map(|p| from_file(p, budget as usize)); - let (display, cut) = match excerpt { - Some(Ok(value)) => value, - Some(Err(e)) => { - result - .output_notice - .get_or_insert_with(String::new) - .push_str(&format!( - "{stream} excerpt could not read archive: {}; showing service excerpt. ", - e.message - )); - let (display, cut) = bounded(text, budget as usize); - (display, cut || service_cut) - } - None => { - let (display, cut) = bounded(text, budget as usize); - (display, cut || service_cut) - } - }; - *text = display; - result.truncated |= cut; - } -} - -#[cfg(test)] -mod tests { - use super::*; - #[test] - fn utf8_and_tiny_budgets_are_bounded() { - for budget in 0..40 { - let text = "🦀é".repeat(20); - let (value, cut) = bounded(&text, budget); - assert!(cut); - assert!(value.len() <= budget + MARKER.len()); - assert!(value.contains(MARKER)); - } - assert_eq!(bounded("", 0), (String::new(), false)); - assert_eq!(bounded("small", 5), ("small".into(), false)); - } -} diff --git a/userland/box/src/http.rs b/userland/box/src/http.rs deleted file mode 100644 index d383c1c..0000000 --- a/userland/box/src/http.rs +++ /dev/null @@ -1,265 +0,0 @@ -//! Small synchronous wasi:http adapter, following git's stream lifecycle. -use crate::{Result, error}; -use std::io::{self, Read}; -use wasi::http::{outgoing_handler, types::*}; - -#[cfg(test)] -thread_local! { pub static SERVER: std::cell::RefCell>> = Default::default(); } - -// A call shares one monotonic deadline across response headers/body. -pub fn now() -> u64 { - wasi::clocks::monotonic_clock::now() -} -fn wait(ready: &wasi::io::poll::Pollable, deadline: Option) -> io::Result<()> { - if let Some(deadline) = deadline { - if now() >= deadline { - return Err(io::Error::new( - io::ErrorKind::TimedOut, - "box HTTP deadline exceeded", - )); - } - let timer = wasi::clocks::monotonic_clock::subscribe_instant(deadline); - wasi::io::poll::poll(&[ready, &timer]); - if now() >= deadline { - return Err(io::Error::new( - io::ErrorKind::TimedOut, - "box HTTP deadline exceeded", - )); - } - } else { - ready.block(); - } - Ok(()) -} -pub struct Incoming { - pub status: u16, - pub content_range: Option, - stream: Option, - body: Option, - deadline: Option, -} -impl Read for Incoming { - fn read(&mut self, buf: &mut [u8]) -> io::Result { - if buf.is_empty() { - return Ok(0); - } - let Some(stream) = self.stream.as_ref() else { - return Ok(0); - }; - loop { - wait(&stream.subscribe(), self.deadline)?; - match stream.read(buf.len().min(65536) as u64) { - Ok(b) if b.is_empty() => continue, - Ok(b) => { - buf[..b.len()].copy_from_slice(&b); - return Ok(b.len()); - } - Err(wasi::io::streams::StreamError::Closed) => { - self.stream.take(); - if let Some(body) = self.body.take() { - let trailers = IncomingBody::finish(body); - wait(&trailers.subscribe(), self.deadline)?; - if !matches!(trailers.get(), Some(Ok(Ok(_)))) { - return Err(io::Error::other("HTTP response body failed")); - } - } - return Ok(0); - } - Err(_) => return Err(io::Error::other("HTTP read failed or timed out")), - } - } - } -} -impl Drop for Incoming { - fn drop(&mut self) { - self.stream.take(); - self.body.take(); - } -} - -pub fn request( - host: &str, - method: Method, - path: &str, - input: Option<(&mut dyn Read, u64)>, - secs: u32, -) -> Result { - request_until(host, method, path, input, secs, None) -} -pub fn request_until( - host: &str, - method: Method, - path: &str, - input: Option<(&mut dyn Read, u64)>, - secs: u32, - deadline: Option, -) -> Result { - request_options(host, method, path, input, secs, deadline, None, false) -} -// Keep the wire options explicit, as in the v2 adapter. -#[allow(clippy::too_many_arguments)] -pub fn request_options( - host: &str, - method: Method, - path: &str, - mut input: Option<(&mut dyn Read, u64)>, - secs: u32, - deadline: Option, - range: Option<&str>, - allow_missing: bool, -) -> Result { - let fields = Fields::new(); - if let Some(range) = range { - fields - .append("range", range.as_bytes()) - .map_err(|_| error("invalid range"))?; - } - fields - .append( - "content-length", - &input - .as_ref() - .map_or(0, |(_, len)| *len) - .to_string() - .into_bytes(), - ) - .map_err(|_| error("invalid length"))?; - if input.is_some() { - fields - .append("content-type", b"application/json") - .map_err(|_| error("invalid content type"))?; - } - let req = OutgoingRequest::new(fields); - req.set_method(&method) - .map_err(|_| error("invalid method"))?; - req.set_scheme(Some(&Scheme::Http)) - .map_err(|_| error("invalid scheme"))?; - req.set_authority(Some(host)) - .map_err(|_| error("invalid host"))?; - req.set_path_with_query(Some(path)) - .map_err(|_| error("invalid path"))?; - let body = req - .body() - .map_err(|_| error("HTTP request body unavailable"))?; - let options = RequestOptions::new(); - options - .set_connect_timeout(Some(5_000_000_000)) - .map_err(|_| error("connect timeout unsupported"))?; - options - .set_first_byte_timeout(Some((secs as u64 + 30) * 1_000_000_000)) - .map_err(|_| error("timeout unsupported"))?; - options - .set_between_bytes_timeout(Some(30_000_000_000)) - .map_err(|_| error("timeout unsupported"))?; - let future = outgoing_handler::handle(req, Some(options)) - .map_err(|e| error(format!("HTTP start: {e:?}")))?; - if let Some((reader, _)) = input.as_mut() { - let stream = body.write().map_err(|_| error("HTTP body not writable"))?; - let mut buf = [0; 4096]; - loop { - let n = reader.read(&mut buf)?; - if n == 0 { - break; - } - { - let mut offset = 0; - while offset < n { - wait(&stream.subscribe(), deadline)?; - let available = stream - .check_write() - .map_err(|_| error("HTTP write failed"))? - as usize; - let count = available.min(n - offset); - if count > 0 { - stream - .write(&buf[offset..offset + count]) - .map_err(|_| error("HTTP write failed"))?; - offset += count; - } - } - } - } - drop(stream); - } - OutgoingBody::finish(body, None).map_err(|_| error("HTTP finish failed"))?; - #[cfg(test)] - SERVER.with(|s| { - if let Some(f) = s.borrow_mut().as_mut() { - f(); - } - }); - wait(&future.subscribe(), deadline)?; - let response = future - .get() - .ok_or_else(|| error("HTTP not ready"))? - .map_err(|_| error("HTTP already consumed"))? - .map_err(|e| error(format!("HTTP failed: {e:?}")))?; - let status = response.status(); - let content_range = response - .headers() - .get("content-range") - .first() - .map(|v| String::from_utf8_lossy(v).into_owned()); - let body = response - .consume() - .map_err(|_| error("HTTP body unavailable"))?; - let stream = body - .stream() - .map_err(|_| error("HTTP stream unavailable"))?; - let mut incoming = Incoming { - status, - content_range, - stream: Some(stream), - body: Some(body), - deadline, - }; - if !(200..300).contains(&status) && !(allow_missing && matches!(status, 404 | 405)) { - let mut bytes = Vec::new(); - incoming.read_to_end(&mut bytes)?; - return match crate::retention::save("box", "http-error", &bytes) { - Ok(path) => { - let reason = if bytes.len() <= 1024 { - format!("; {}", String::from_utf8_lossy(&bytes)) - } else { - String::new() - }; - Err(error(format!( - "box service {host}: HTTP {status}{reason}; {} bytes; full response: {path}", - bytes.len() - ))) - } - Err(e) => Err(error(format!( - "box service {host}: HTTP {status}; archive failed: {e}; full response: {}", - String::from_utf8_lossy(&bytes) - ))), - }; - } - Ok(incoming) -} - -pub fn json( - host: &str, - method: Method, - path: &str, - value: Option, - secs: u32, -) -> Result { - json_until(host, method, path, value, secs, None) -} -pub fn json_until( - host: &str, - method: Method, - path: &str, - value: Option, - secs: u32, - deadline: Option, -) -> Result { - let data = value.map(|v| serde_json::to_vec(&v)).transpose()?; - let mut cursor = std::io::Cursor::new(data.as_deref().unwrap_or_default()); - let body = data - .as_ref() - .map(|d| (&mut cursor as &mut dyn Read, d.len() as u64)); - Ok(serde_json::from_reader(request_until( - host, method, path, body, secs, deadline, - )?)?) -} diff --git a/userland/box/src/lib.rs b/userland/box/src/lib.rs deleted file mode 100644 index a995a53..0000000 --- a/userland/box/src/lib.rs +++ /dev/null @@ -1,746 +0,0 @@ -//! Containers API, raw output archives, and bounded world transfers. -pub mod cli; -#[derive(Debug)] -pub struct Error { - pub message: String, - pub data: Option, -} -impl std::fmt::Display for Error { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.write_str(&self.message) - } -} -impl std::error::Error for Error {} -impl From for Error { - fn from(e: std::io::Error) -> Self { - error(e.to_string()) - } -} -impl From for Error { - fn from(e: serde_json::Error) -> Self { - error(e.to_string()) - } -} -pub type Result = std::result::Result; -fn error(s: impl Into) -> Error { - Error { - message: s.into(), - data: None, - } -} -fn pid() -> String { - std::env::var("SAUSAGE_PID").unwrap_or_else(|_| { - std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .unwrap_or_default() - .as_nanos() - .to_string() - }) -} -use serde_json::{Value, json}; -use std::{ - fs::File, - io::{Read, Write}, - path::Path, -}; -use wasi::http::types::Method; -mod archive; -mod excerpt; -mod http; -mod retention; -mod transfer; - -const DEFAULT_HOST: &str = "citadel.vpn.surma.technology:8093"; -const MAX_FILE: u64 = 64 << 20; -pub const NODE_MODULE: &str = r#"{ pkgs, ... }: { - environment.systemPackages = with pkgs; [ nodejs git chromium fontconfig gnutar ]; - fonts.packages = [ pkgs.dejavu_fonts ]; - environment.variables = { - PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD = "1"; - PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH = "${pkgs.chromium}/bin/chromium"; - FONTCONFIG_FILE = "${pkgs.fontconfig.out}/etc/fonts/fonts.conf"; - FONTCONFIG_PATH = "${pkgs.fontconfig.out}/etc/fonts"; - }; -}"#; - -// The service has two genuine JSON unions. Keep these wire types separate from -// #[derive(serde::Serialize, serde::Deserialize)] structs; the SDK subset cannot express unions. No arbitrary result JSON. -#[derive(serde::Serialize, serde::Deserialize)] -#[serde(untagged)] -pub enum Command { - Shell(String), - Argv(Vec), -} - -#[derive(serde::Serialize, serde::Deserialize)] -#[serde(untagged)] -pub enum Nixos { - Text(String), - Options(std::collections::BTreeMap), -} - -/// Exactly one Nix configuration source. -#[derive(serde::Serialize, serde::Deserialize)] -pub struct Config { - /// Flake reference, optionally #configuration (default container). - flake: Option, - /// NixOS module text or JSON option object. - nixos: Option, - /// Already built /nix/store system path on the service host. - system: Option, -} -/// Create a disposable container and wait for readiness. -#[derive(serde::Serialize, serde::Deserialize)] -pub struct Create { - /// Exactly one of flake, nixos, system. - config: Config, - /// Lifetime from creation, service default 3600 seconds. - ttl_secs: Option, - /// Informational owner label. - owner: Option, - /// Service hostname or hostname:port, default citadel:8093. - host: Option, -} -/// Select a service for listing boxes. -#[derive(serde::Serialize, serde::Deserialize)] -pub struct List { - /// Hostname or hostname:port; default citadel:8093. - host: Option, -} -/// Select a box; remembered host from create is used by default. -#[derive(serde::Serialize, serde::Deserialize)] -pub struct Id { - /// Service-issued tc-xxxxxx ID. - id: String, - /// Override remembered host; default citadel:8093 for unknown IDs. - host: Option, -} -/// Service metadata, with build-log tail attached to failed creates. -#[derive(serde::Serialize, serde::Deserialize)] -pub struct Container { - /// Container ID. - id: String, - /// creating, running, updating or failed. - state: String, - /// Private container IP, accessible from service host. - address: String, - /// UTC creation timestamp. - created_at: String, - /// UTC expiry timestamp. - expires_at: String, - /// Informational owner. - owner: String, - /// Configuration used to create this container. - config: Config, - /// Service failure message. - error: Option, - /// Bounded build-log tail when creation fails; full available bytes are at build_log_path. - #[serde(default)] - build_log_tail: Option, - /// Permanent archive of the build diagnostic returned by the service. - #[serde(default)] - build_log_path: Option, - /// Exact archived byte count, not a total for old-service tails. - #[serde(default)] - build_log_bytes: Option, - /// True when the legacy endpoint was used and may have returned only a tail. - #[serde(default)] - build_log_service_truncated: Option, - /// Inline-tail byte range or compatibility warning, if applicable. - #[serde(default)] - build_log_notice: Option, -} -/// Service inventory. -#[derive(serde::Serialize, serde::Deserialize)] -pub struct Containers { - /// Containers currently known to this host. - containers: Vec, -} -/// Extend expiry to now plus ttl_secs (not additive). -#[derive(serde::Serialize, serde::Deserialize)] -pub struct Extend { - /// Container ID. - id: String, - /// Positive remaining lifetime. - ttl_secs: u32, - /// Override remembered host. - host: Option, -} -/// Execute as root inside a running box. -#[derive(serde::Serialize, serde::Deserialize)] -pub struct Exec { - /// Container ID. - id: String, - /// Shell string (sh -c) or nonempty argv array. - cmd: Command, - /// UTF-8 standard input. - stdin: Option, - /// Default 60, maximum 1800 seconds. - timeout_secs: Option, - /// Inline UTF-8 byte budget per stream (default 16384), excluding the omission marker. Zero omits stream text. Full archives are unaffected. - inline_bytes: Option, - /// Override remembered host. - host: Option, -} -/// Command completion, including timeout/output-limit status. -#[derive(serde::Serialize, serde::Deserialize)] -pub struct Executed { - /// Process exit code. - exit: i32, - /// Bounded stdout head and tail; full available bytes are in stdout_path. - stdout: String, - /// Bounded stderr head and tail; full available bytes are in stderr_path. - stderr: String, - /// Service killed the command after its timeout. - timed_out: bool, - /// Inline output was cut by the service or plugin; service_truncated distinguishes upstream loss. - truncated: bool, - /// Permanent archive of service result metadata and inline excerpts. - #[serde(default)] - output_log: Option, - /// Service execution identifier (new services only). - #[serde(default)] - exec_id: Option, - /// Exact raw stdout total on new services; available UTF-8 bytes on old services (which may have lost output). - #[serde(default)] - stdout_bytes: Option, - /// Exact raw stderr total on new services; available UTF-8 bytes on old services (which may have lost output). - #[serde(default)] - stderr_bytes: Option, - /// Service download reference when stdout exceeded the inline limit. - #[serde(default)] - stdout_url: Option, - /// Service download reference when stderr exceeded the inline limit. - #[serde(default)] - stderr_url: Option, - /// Permanent full raw stdout archive (available UTF-8 text on old services). - #[serde(default)] - stdout_path: Option, - /// Permanent full raw stderr archive (available UTF-8 text on old services). - #[serde(default)] - stderr_path: Option, - /// True if the old service discarded output beyond its cap. - #[serde(default)] - service_truncated: bool, - /// Output availability or archival failure; execution already completed, do not replay. - #[serde(default)] - output_notice: Option, -} -/// A successful mutation. -#[derive(serde::Serialize, serde::Deserialize)] -pub struct OkResult { - /// True on success. - ok: bool, -} -/// Build log response. -#[derive(serde::Serialize, serde::Deserialize)] -pub struct Log { - /// At most the last 16 KiB of raw build bytes, displayed with UTF-8 replacement; full bytes are at path. - text: String, - /// Permanent world archive path. - path: String, - /// Exact byte count in the archived file. - #[serde(default)] - bytes: u64, - /// Legacy endpoint used; the full build log may be unavailable. - #[serde(default)] - service_truncated: bool, - /// Inline-tail byte range or compatibility warning, if applicable. - #[serde(default)] - notice: Option, -} -/// Upload UTF-8 text or stream a VFS file. -#[derive(serde::Serialize, serde::Deserialize)] -pub struct PutFile { - /// Container ID. - id: String, - /// Absolute path inside the box. - path: String, - /// Inline text; exactly one of text and from_vfs is required. - text: Option, - /// World file to stream, including binary data, at most 64 MiB. - from_vfs: Option, - /// Override remembered host. - host: Option, -} -/// Download a file, optionally streaming to the world. -#[derive(serde::Serialize, serde::Deserialize)] -pub struct GetFile { - /// Container ID. - id: String, - /// Absolute file path inside the box (not a directory). - path: String, - /// World destination; atomically replaced only on successful complete download. - to_vfs: Option, - /// Override remembered host. - host: Option, -} -/// File transfer result; payload omitted for VFS transfers. -#[derive(serde::Serialize, serde::Deserialize)] -pub struct FileResult { - /// Bytes transferred. - bytes: u64, - /// UTF-8 contents for inline downloads, capped at 64 KiB. - text: Option, - /// Destination world path, if any. - to_vfs: Option, -} -/// Copy a world directory into the box using an uncompressed tar. -#[derive(serde::Serialize, serde::Deserialize)] -pub struct PutTree { - /// Container ID. - id: String, - /// World source directory. - from_vfs_dir: String, - /// Absolute destination inside the box. Existing files may be overwritten. - to_dir: String, - /// Override remembered host. - host: Option, -} -/// Copy a box directory into a new world directory using tar. -#[derive(serde::Serialize, serde::Deserialize)] -pub struct GetTree { - /// Container ID. - id: String, - /// Absolute source directory inside the box. - from_dir: String, - /// New world destination directory; must not already exist. - to_vfs_dir: String, - /// Override remembered host. - host: Option, -} -/// Ready-to-use JavaScript and Chromium container. -#[derive(serde::Serialize, serde::Deserialize)] -pub struct NodeBox { - /// Lifetime in seconds; service default 3600. - ttl_secs: Option, -} -/// Disposable build/test boxes. No background workers or startup side effects. -pub struct BoxPlugin; - -fn host(input: Option<&str>) -> Result { - let h = input.unwrap_or(DEFAULT_HOST); - let h = if h.contains(':') { - h.to_owned() - } else { - format!("{h}:8093") - }; - let u = - url::Url::parse(&format!("http://{h}")).map_err(|e| error(format!("invalid host: {e}")))?; - if u.host_str().is_none() || u.path() != "/" || u.query().is_some() || u.fragment().is_some() { - return Err(error("host must be hostname or hostname:port")); - } - Ok(h) -} -fn base(id: &str) -> Result { - if id.len() != 9 - || !id.starts_with("tc-") - || !id[3..] - .bytes() - .all(|b| b.is_ascii_lowercase() || b.is_ascii_digit()) - { - return Err(error("invalid box ID; expected tc-xxxxxx")); - } - Ok(format!("/containers/{id}")) -} -const HOSTS: &str = "/var/lib/box/hosts"; -fn remember(id: &str, h: &str) -> Result<()> { - base(id)?; - std::fs::create_dir_all(HOSTS)?; - let path = Path::new(HOSTS).join(id); - if let Ok(old) = std::fs::read_to_string(&path) { - if old != h { - return Err(error(format!( - "box ID collision for {id}; specify --host explicitly" - ))); - } - return Ok(()); - } - let temp = path.with_extension(pid()); - std::fs::write(&temp, h)?; - std::fs::rename(temp, path)?; - Ok(()) -} -fn resolve(id: &str, h: Option<&str>) -> Result { - base(id)?; - if let Some(h) = h { - return host(Some(h)); - } - match std::fs::read_to_string(Path::new(HOSTS).join(id)) { - Ok(h) => Ok(h), - Err(e) if e.kind() == std::io::ErrorKind::NotFound => Ok(DEFAULT_HOST.into()), - Err(e) => Err(e.into()), - } -} -fn get(h: &str, id: &str) -> Result { - http::json(h, Method::Get, &base(id)?, None, 30) -} -fn log(h: &str, id: &str) -> Result { - archive::build(h, id, http::now().saturating_add(60_000_000_000)) -} -// Shared stdout/stderr budget: 60 s overhead plus 1 s per 256 KiB, capped at -// 30 min. Unknown totals get 5 min. HTTP idle timeouts still catch stalled peers. -fn archive_budget_ns(stdout: Option, stderr: Option) -> u64 { - let seconds = match (stdout, stderr) { - (Some(out), Some(err)) => { - 60u64.saturating_add(out.saturating_add(err).div_ceil(256 * 1024)) - } - _ => 300, - }; - seconds.min(1800) * 1_000_000_000 -} -fn execute(h: &str, id: &str, cmd: Value, stdin: Option, secs: u32) -> Result { - let mut result: Executed = http::json( - h, - Method::Post, - &format!("{}/exec", base(id)?), - Some( - json!({"cmd":cmd,"stdin":stdin.unwrap_or_default(),"timeout_secs":secs.clamp(1,1800)}), - ), - secs.clamp(1, 1800), - )?; - result.service_truncated = result.truncated && result.exec_id.is_none(); - if result.service_truncated { - result.output_notice = Some("Old service cut output at its stream cap; bytes beyond the inline output are unavailable.".into()); - } - // Fetch raw streams, never concatenate JSON excerpts (which can replace binary/UTF-8 bytes). - if let Some(exec_id) = result.exec_id.as_deref() { - let deadline = - http::now().saturating_add(archive_budget_ns(result.stdout_bytes, result.stderr_bytes)); - for (stream, url, count, path) in [ - ( - "stdout", - &result.stdout_url, - &mut result.stdout_bytes, - &mut result.stdout_path, - ), - ( - "stderr", - &result.stderr_url, - &mut result.stderr_bytes, - &mut result.stderr_path, - ), - ] { - // Known-empty streams need no network roundtrip (even if a URL was supplied). - // Keep the usual on-disk contract for callers reading stdout_path. - let name = format!("{id}-{exec_id}"); - let saved = if *count == Some(0) { - retention::create(&name, stream) - .map(|(path, _)| archive::Download { path, bytes: 0 }) - .map_err(Into::into) - } else { - // Small nonempty streams still need raw bytes: JSON may replace invalid UTF-8. - let endpoint = url - .clone() - .unwrap_or_else(|| format!("/containers/{id}/exec/{exec_id}/{stream}")); - archive::exec_download(h, &endpoint, &name, stream, deadline, *count) - }; - match saved { - Ok(d) => { - *path = Some(d.path); - *count = Some(d.bytes); - } - Err(e) => { - eprintln!( - "box {id} {stream} archive failed: {e}; command completed, do not replay" - ); - let notice = result.output_notice.get_or_insert_with(String::new); - notice.push_str(&format!( - "{stream} archive unavailable: {}; command completed, do not replay. ", - e.message - )); - } - } - } - } - if result.exec_id.is_none() { - // Legacy services expose only JSON text. Preserve all available text before - // bounding presentation, without claiming bytes discarded upstream exist. - for (stream, text, path, count) in [ - ( - "stdout", - &result.stdout, - &mut result.stdout_path, - &mut result.stdout_bytes, - ), - ( - "stderr", - &result.stderr, - &mut result.stderr_path, - &mut result.stderr_bytes, - ), - ] { - *count = Some(text.len() as u64); - match retention::save("box", &format!("{id}-{stream}"), text.as_bytes()) { - Ok(saved) => *path = Some(saved), - Err(e) => { - let notice = result.output_notice.get_or_insert_with(String::new); - notice.push_str(&format!( - "{stream} archive unavailable: {e}; command completed, do not replay. " - )); - } - } - } - } - let bytes = serde_json::to_vec_pretty(&result)?; - match retention::save("box", id, &bytes) { - Ok(path) => result.output_log = Some(path), - Err(e) => eprintln!( - "box {id} output archive failed: {e}; command completed, full result returned; do not replay" - ), - } - Ok(result) -} -fn checked(h: &str, id: &str, cmd: Value) -> Result { - let r = execute(h, id, cmd, None, 300)?; - if r.exit != 0 || r.timed_out || r.service_truncated { - return Err(error(format!( - "box command failed (exit {}, timeout {}, truncated {}): {}; {}", - r.exit, - r.timed_out, - r.truncated, - r.stderr, - r.output_notice.as_deref().unwrap_or("") - ))); - } - if let Some(path) = r.stdout_path { - return Ok(std::fs::read_to_string(path)?); - } - // Archival failure is not execution failure. Helpers can use complete inline - // text (especially empty mutation output); never parse a cut/binary excerpt. - if r.exec_id.is_some() - && (r.stdout_bytes != Some(r.stdout.len() as u64) || r.stdout.contains('\u{fffd}')) - { - return Err(error(format!( - "command completed; required stdout unavailable; {}; do not replay", - r.output_notice - .as_deref() - .unwrap_or("incomplete inline stdout") - ))); - } - Ok(r.stdout) -} -// The person explicitly approved bounded polling within create/node_box because -// this service has no readiness events. No worker or polling survives the RPC. -#[derive(Clone, Copy)] -pub struct Readiness { - timeout_ns: u64, - step_ns: u64, - max_sleep_ns: u64, -} -const READINESS: Readiness = Readiness { - timeout_ns: 240_000_000_000, - step_ns: 1_000_000_000, - max_sleep_ns: 3_000_000_000, -}; -fn accepted_error(mut e: Error, id: &str, h: &str) -> Error { - e.message = format!( - "box {id} on {h}: {}; continue with box.get, do not retry create", - e.message - ); - e.data = Some(json!({"id":id,"host":h})); - e -} -fn wait_ready(h: &str, mut c: Container, timing: Readiness, deadline: u64) -> Result { - let mut sleep_ns = timing.step_ns; - loop { - match c.state.as_str() { - "running" => return Ok(c), - "failed" => { - // Preserve terminal metadata even if the log endpoint is unavailable. - let tail = archive::build(h, &c.id, deadline); - match tail { - Ok(log) => { - c.build_log_tail = Some(log.text); - c.build_log_path = Some(log.path); - c.build_log_bytes = Some(log.bytes); - c.build_log_service_truncated = Some(log.service_truncated); - c.build_log_notice = log.notice; - } - Err(e) => { - c.build_log_tail = Some(format!("build log unavailable: {}", e.message)) - } - } - return Ok(c); - } - _ => {} - } - let now = http::now(); - if now >= deadline { - return Err(error("readiness timed out after 240 s")); - } - wasi::clocks::monotonic_clock::subscribe_instant( - now.saturating_add(sleep_ns).min(deadline), - ) - .block(); - if http::now() >= deadline { - return Err(error("readiness timed out after 240 s")); - } - c = http::json_until(h, Method::Get, &base(&c.id)?, None, 30, Some(deadline))?; - sleep_ns = sleep_ns - .saturating_add(timing.step_ns) - .min(timing.max_sleep_ns); - } -} -impl BoxPlugin { - pub fn create_box(&self, p: Create) -> Result { - self.create_box_with_wait(p, READINESS) - } - fn create_box_with_wait(&self, p: Create, timing: Readiness) -> Result { - let n = usize::from(p.config.flake.is_some()) - + usize::from(p.config.nixos.is_some()) - + usize::from(p.config.system.is_some()); - if n != 1 || p.ttl_secs == Some(0) { - return Err(error( - "provide exactly one config source and a positive TTL", - )); - } - let h = host(p.host.as_deref())?; - let deadline = http::now().saturating_add(timing.timeout_ns); - let c: Container = http::json_until( - &h, - Method::Post, - "/containers", - Some( - json!({"config":p.config,"ttl_secs":p.ttl_secs,"owner":p.owner.unwrap_or_default()}), - ), - 30, - Some(deadline), - )?; - let id = c.id.clone(); - remember(&id, &h).map_err(|e| accepted_error(e, &id, &h))?; - eprintln!("box {id} accepted on {h}; waiting up to 240 s for readiness"); - wait_ready(&h, c, timing, deadline).map_err(|e| accepted_error(e, &id, &h)) - } -} - -impl BoxPlugin { - /// Create a box and wait up to 240 seconds for running/failed. Timeout errors carry id/host for box.get; never retry create blindly. - pub fn create(&self, p: Create) -> Result { - self.create_box(p) - } - /// List boxes known to one service host. - pub fn list(&self, p: List) -> Result { - http::json( - &host(p.host.as_deref())?, - Method::Get, - "/containers", - None, - 30, - ) - } - /// Fetch current metadata; expired/deleted IDs yield a clear service 404. - pub fn get(&self, p: Id) -> Result { - get(&resolve(&p.id, p.host.as_deref())?, &p.id) - } - /// Fetch and archive the full build log; old services fall back to their tail with a warning. - pub fn log(&self, p: Id) -> Result { - log(&resolve(&p.id, p.host.as_deref())?, &p.id) - } - /// Reset remaining lifetime to ttl_secs from now. - pub fn extend(&self, p: Extend) -> Result { - if p.ttl_secs == 0 { - return Err(error("ttl_secs must be positive")); - } - http::json( - &resolve(&p.id, p.host.as_deref())?, - Method::Post, - &format!("{}/extend", base(&p.id)?), - Some(json!({"ttl_secs":p.ttl_secs})), - 30, - ) - } - /// Destroy a box. Unknown IDs error even though upstream delete is idempotent. - pub fn delete(&self, p: Id) -> Result { - let h = resolve(&p.id, p.host.as_deref())?; - get(&h, &p.id)?; - // Best-effort byte preservation must never make explicit cleanup impossible. - if let Err(e) = log(&h, &p.id) { - eprintln!( - "box {} build log not saved before deletion: {}", - p.id, e.message - ); - } - http::json(&h, Method::Delete, &base(&p.id)?, None, 30) - } - /// Run a shell string or argv command as root inside the box. - pub fn exec(&self, p: Exec) -> Result { - match &p.cmd { - Command::Shell(s) if s.is_empty() => return Err(error("cmd must not be empty")), - Command::Argv(a) if a.is_empty() => return Err(error("argv must not be empty")), - _ => {} - } - let mut result = execute( - &resolve(&p.id, p.host.as_deref())?, - &p.id, - serde_json::to_value(p.cmd)?, - p.stdin, - p.timeout_secs.unwrap_or(60), - )?; - excerpt::apply( - &mut result, - p.inline_bytes.unwrap_or(excerpt::DEFAULT_BYTES), - ); - Ok(result) - } - /// Stream text or a world file to a box, enforcing the service's 64 MiB cap. - pub fn put_file(&self, p: PutFile) -> Result { - let h = resolve(&p.id, p.host.as_deref())?; - let bytes = match (p.text, p.from_vfs) { - (Some(text), None) => { - transfer::put(&h, &p.id, &p.path, &mut text.as_bytes(), text.len() as u64)? - } - (None, Some(path)) => { - let mut f = File::open(path)?; - let len = f.metadata()?.len(); - transfer::put(&h, &p.id, &p.path, &mut f, len)? - } - _ => return Err(error("provide exactly one of text and from_vfs")), - }; - Ok(FileResult { - bytes, - text: None, - to_vfs: None, - }) - } - /// Download into VFS without returning file contents; inline text is capped at 64 KiB. - pub fn get_file(&self, p: GetFile) -> Result { - transfer::get_file(&resolve(&p.id, p.host.as_deref())?, p) - } - /// Tar a world directory and stream it to the box. Merges into to_dir. - pub fn put_tree(&self, p: PutTree) -> Result { - transfer::put_tree(&resolve(&p.id, p.host.as_deref())?, p) - } - /// Stream a tar from a box and unpack into a new world directory. - pub fn get_tree(&self, p: GetTree) -> Result { - transfer::get_tree(&resolve(&p.id, p.host.as_deref())?, p) - } - /// Create a node/npm/git/Chromium/fontconfig box with Playwright environment defaults. - pub fn node_box(&self, p: NodeBox) -> Result { - self.create_box(Create { - config: Config { - flake: None, - nixos: Some(Nixos::Text(NODE_MODULE.into())), - system: None, - }, - ttl_secs: p.ttl_secs, - owner: Some("box.node_box".into()), - host: None, - }) - } -} - -#[cfg(test)] -mod tests { - use super::*; - #[test] - fn retention_deadline_scales_without_a_byte_cap() { - assert_eq!(archive_budget_ns(Some(0), Some(0)), 60_000_000_000); - assert_eq!(archive_budget_ns(Some(256 * 1024), Some(1)), 62_000_000_000); - assert_eq!(archive_budget_ns(None, Some(0)), 300_000_000_000); - assert_eq!( - archive_budget_ns(Some(u64::MAX), Some(u64::MAX)), - 1_800_000_000_000 - ); - } -} diff --git a/userland/box/src/main.rs b/userland/box/src/main.rs deleted file mode 100644 index 37506a8..0000000 --- a/userland/box/src/main.rs +++ /dev/null @@ -1,12 +0,0 @@ -//! The world box command. All network operations use standard wasi:http. -use clap::Parser; -fn main() { - let code = match box_cli::cli::run(box_cli::cli::Args::parse()) { - Ok(code) => code, - Err(error) => { - eprintln!("box: {error}"); - 1 - } - }; - std::process::exit(code); -} diff --git a/userland/box/src/retention.rs b/userland/box/src/retention.rs deleted file mode 100644 index bc190ab..0000000 --- a/userland/box/src/retention.rs +++ /dev/null @@ -1,93 +0,0 @@ -//! Append-only diagnostic files, independent of resumable state. -use std::io::{self, Write}; -use std::sync::atomic::{AtomicU64, Ordering}; -static NEXT: AtomicU64 = AtomicU64::new(0); - -pub fn date() -> String { - let days = std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .unwrap_or_default() - .as_secs() - / 86400; - date_from_days(days as i64) -} -fn date_from_days(days: i64) -> String { - // Gregorian civil date from Unix days (400-year eras). - let z = days + 719468; - let era = z / 146097; - let doe = z - era * 146097; - let yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; - let y = yoe + era * 400; - let doy = doe - (365 * yoe + yoe / 4 - yoe / 100); - let mp = (5 * doy + 2) / 153; - let d = doy - (153 * mp + 2) / 5 + 1; - let m = mp + if mp < 10 { 3 } else { -9 }; - format!("{:04}-{m:02}-{d:02}", y + i64::from(m <= 2)) -} - -pub fn create(name: &str, extension: &str) -> io::Result<(String, std::fs::File)> { - let dir = format!("/logs/box/{}", date()); - std::fs::create_dir_all(&dir)?; - let name: String = name - .chars() - .map(|c| { - if c.is_ascii_alphanumeric() || c == '-' { - c - } else { - '_' - } - }) - .collect(); - let mut path = format!("{dir}/{name}.{extension}"); - loop { - match std::fs::OpenOptions::new() - .write(true) - .create_new(true) - .open(&path) - { - Ok(f) => return Ok((path, f)), - Err(e) if e.kind() == io::ErrorKind::AlreadyExists => { - path = format!( - "{dir}/{name}-{}-{}.{extension}", - crate::pid(), - NEXT.fetch_add(1, Ordering::Relaxed) - ); - } - Err(e) => return Err(e), - } - } -} - -pub fn save(area: &str, name: &str, bytes: &[u8]) -> io::Result { - let dir = format!("/logs/{area}/{}", date()); - std::fs::create_dir_all(&dir)?; - loop { - let path = format!( - "{dir}/{name}-{}-{}.log", - crate::pid(), - NEXT.fetch_add(1, Ordering::Relaxed) - ); - match std::fs::OpenOptions::new() - .write(true) - .create_new(true) - .open(&path) - { - Ok(mut f) => { - f.write_all(bytes)?; - return Ok(path); - } - Err(e) if e.kind() == io::ErrorKind::AlreadyExists => continue, - Err(e) => return Err(e), - } - } -} -#[cfg(test)] -mod tests { - use super::*; - #[test] - fn archive_calendar_dates() { - assert_eq!(date_from_days(0), "1970-01-01"); - assert_eq!(date_from_days(19782), "2024-02-29"); - assert_eq!(date_from_days(20635), "2026-07-01"); - } -} diff --git a/userland/box/src/transfer.rs b/userland/box/src/transfer.rs deleted file mode 100644 index 17ecc41..0000000 --- a/userland/box/src/transfer.rs +++ /dev/null @@ -1,379 +0,0 @@ -//! Bounded streaming transfers. Payloads stay in HTTP/VFS, not RPC responses. -use super::*; - -pub fn file_path(id: &str, path: &str) -> Result { - if !path.starts_with('/') || path == "/" { - return Err(error("expected an absolute file path inside the box")); - } - let mut u = url::Url::parse("http://box.invalid").map_err(|e| error(e.to_string()))?; - { - let mut segments = u.path_segments_mut().map_err(|_| error("bad file path"))?; - segments.clear().push("containers").push(id).push("files"); - for s in path[1..].split('/') { - segments.push(s); - } - } - Ok(u.path().into()) -} -pub fn put(h: &str, id: &str, path: &str, source: &mut dyn Read, len: u64) -> Result { - if len > MAX_FILE { - return Err(error("service file limit is 64 MiB; split larger files")); - } - let mut body = http::request( - h, - Method::Put, - &file_path(id, path)?, - Some((source, len)), - 300, - )?; - let ok: OkResult = serde_json::from_reader(&mut body)?; - if !ok.ok { - return Err(error("service file write did not succeed")); - } - Ok(len) -} -fn size(h: &str, id: &str, path: &str) -> Result { - // stat only regular files: service otherwise returns directory listings or - // can silently truncate at 64 MiB. Keep flags and user paths separate. - let out = checked( - h, - id, - json!([ - "sh", - "-c", - "[ -f \"$1\" ] && stat -Lc %s -- \"$1\"", - "sh", - path - ]), - )?; - let n: u64 = out - .trim() - .parse() - .map_err(|_| error("invalid file size from box"))?; - if n > MAX_FILE { - return Err(error("service file limit is 64 MiB; split larger files")); - } - Ok(n) -} -fn download(h: &str, id: &str, path: &str, out: &mut dyn Write, expected: u64) -> Result { - let mut body = http::request(h, Method::Get, &file_path(id, path)?, None, 300)?; - let n = std::io::copy(&mut (&mut body).take(MAX_FILE + 1), out)?; - if n != expected { - return Err(error(format!( - "file changed or response truncated: expected {expected} bytes, got {n}" - ))); - } - Ok(n) -} - -/// Private disk spools, removed on both success and error. Not persistent state. -struct Spool { - dir: std::path::PathBuf, -} -impl Spool { - fn new() -> Result { - static NEXT: std::sync::atomic::AtomicU32 = std::sync::atomic::AtomicU32::new(0); - let dir = std::path::PathBuf::from(format!( - "/var/lib/box/transfers/{}-{}", - crate::pid(), - NEXT.fetch_add(1, std::sync::atomic::Ordering::Relaxed) - )); - std::fs::create_dir_all(dir.parent().ok_or_else(|| error("no spool parent"))?)?; - std::fs::create_dir(&dir)?; - Ok(Self { dir }) - } - fn path(&self) -> std::path::PathBuf { - self.dir.join("archive.tar") - } -} -impl Drop for Spool { - fn drop(&mut self) { - let _ = std::fs::remove_dir_all(&self.dir); - } -} - -pub fn get_file(h: &str, p: GetFile) -> Result { - let len = size(h, &p.id, &p.path)?; - if let Some(dest) = &p.to_vfs { - let target = Path::new(dest); - let parent = target - .parent() - .filter(|p| !p.as_os_str().is_empty()) - .unwrap_or(Path::new(".")); - std::fs::create_dir_all(parent)?; - let temp = parent.join(format!(".box-download-{}", crate::pid())); - // Use create_new: never truncate an unrelated temporary file. - let mut f = File::options().write(true).create_new(true).open(&temp)?; - let result = (|| -> Result<()> { - download(h, &p.id, &p.path, &mut f, len)?; - f.flush()?; - drop(f); - std::fs::rename(&temp, target)?; - Ok(()) - })(); - if result.is_err() { - let _ = std::fs::remove_file(&temp); - } - result?; - Ok(FileResult { - bytes: len, - text: None, - to_vfs: p.to_vfs, - }) - } else { - if len > 65536 { - return Err(error( - "inline file limit is 64 KiB; use to_vfs to stream larger files", - )); - } - let mut data = Vec::new(); - download(h, &p.id, &p.path, &mut data, len)?; - Ok(FileResult { - bytes: len, - text: Some( - String::from_utf8(data).map_err(|_| error("file is not UTF-8; use to_vfs"))?, - ), - to_vfs: None, - }) - } -} -fn quote(s: &str) -> String { - format!("'{}'", s.replace('\'', "'\\''")) -} -fn dir(s: &str) -> Result<()> { - if !s.starts_with('/') { - return Err(error("box directory must be absolute")); - } - Ok(()) -} -fn remote_tmp() -> String { - format!("/tmp/sausage-box-{}.tar", crate::pid()) -} -fn cleanup(h: &str, id: &str, path: &str) { - if let Err(e) = checked(h, id, json!(["rm", "-f", "--", path])) { - eprintln!("box transfer cleanup: {e}"); - } -} - -// tar::Header::set_metadata panics on wasm32-wasip2. Construct portable -// headers explicitly; WASI does not expose Unix executable mode bits. -fn append_tree(tar: &mut tar::Builder, source: &Path, name: &Path) -> Result<()> { - let metadata = std::fs::symlink_metadata(source)?; - let payload = if metadata.is_file() { - metadata.len() - } else { - 0 - }; - if tar - .get_ref() - .metadata()? - .len() - .saturating_add(payload) - .saturating_add(4096) - > MAX_FILE - { - return Err(error("tree tar exceeds 64 MiB service limit")); - } - let mut header = tar::Header::new_gnu(); - header.set_mtime( - metadata - .modified() - .ok() - .and_then(|t| t.duration_since(std::time::UNIX_EPOCH).ok()) - .map(|d| d.as_secs()) - .unwrap_or(0), - ); - header.set_uid(0); - header.set_gid(0); - if metadata.is_dir() { - header.set_entry_type(tar::EntryType::Directory); - header.set_size(0); - header.set_mode(0o755); - header.set_cksum(); - tar.append_data(&mut header, name, std::io::empty())?; - let mut entries = std::fs::read_dir(source)?.collect::>>()?; - entries.sort_by_key(|e| e.file_name()); - for entry in entries { - append_tree(tar, &entry.path(), &name.join(entry.file_name()))?; - } - } else if metadata.is_file() { - if metadata.len() > MAX_FILE { - return Err(error("tree exceeds 64 MiB service limit")); - } - header.set_entry_type(tar::EntryType::Regular); - header.set_size(metadata.len()); - header.set_mode(0o644); - header.set_cksum(); - tar.append_data(&mut header, name, File::open(source)?)?; - } else if metadata.file_type().is_symlink() { - header.set_entry_type(tar::EntryType::Symlink); - header.set_size(0); - header.set_mode(0o777); - header.set_cksum(); - tar.append_link(&mut header, name, std::fs::read_link(source)?)?; - } else { - return Err(error(format!( - "cannot copy special file {}", - source.display() - ))); - } - Ok(()) -} - -pub fn put_tree(h: &str, p: PutTree) -> Result { - dir(&p.to_dir)?; - if !Path::new(&p.from_vfs_dir).is_dir() { - return Err(error("from_vfs_dir is not a directory")); - } - let spool = Spool::new()?; - let f = File::create(spool.path())?; - let mut tar = tar::Builder::new(f); - tar.follow_symlinks(false); - append_tree(&mut tar, Path::new(&p.from_vfs_dir), Path::new("."))?; - let mut output = tar.into_inner()?; - output.flush()?; - drop(output); - let mut f = File::open(spool.path())?; - let len = f.metadata()?.len(); - let remote = remote_tmp(); - let result = (|| -> Result<()> { - put(h, &p.id, &remote, &mut f, len)?; - checked( - h, - &p.id, - json!([ - "sh", - "-c", - format!( - "mkdir -p -- {0} && tar -xf {1} -C {0}", - quote(&p.to_dir), - quote(&remote) - ) - ]), - )?; - Ok(()) - })(); - cleanup(h, &p.id, &remote); - result?; - Ok(OkResult { ok: true }) -} -// tar's generic unpack attempts unsupported Unix filesystem operations on -// WASI. Copy contents explicitly, avoiding chmod/utime. Symlink creation is -// unsupported by the world VFS and must fail without publishing a partial tree. -fn unpack_tree(file: File, root: &Path) -> Result<()> { - let mut archive = tar::Archive::new(file); - let mut hardlinks = Vec::new(); - let mut expanded = 0u64; - for entry in archive.entries()? { - let mut entry = entry?; - let name = entry.path()?.into_owned(); - let safe = |p: &Path| { - p.components().all(|c| { - matches!( - c, - std::path::Component::Normal(_) | std::path::Component::CurDir - ) - }) - }; - if !safe(&name) { - return Err(error("archive has a path outside the destination")); - } - let path = root.join(&name); - // Do not accidentally write through an earlier archive symlink. - for parent in name.ancestors().skip(1) { - if std::fs::symlink_metadata(root.join(parent)) - .is_ok_and(|m| m.file_type().is_symlink()) - { - return Err(error("archive writes through a symlink directory")); - } - } - if let Some(parent) = path.parent() { - std::fs::create_dir_all(parent)?; - } - let kind = entry.header().entry_type(); - if kind.is_dir() { - std::fs::create_dir_all(&path)?; - } else if kind.is_file() { - expanded = expanded.saturating_add(entry.size()); - if expanded > MAX_FILE { - return Err(error("expanded tree exceeds 64 MiB transfer limit")); - } - let mut out = File::options().write(true).create_new(true).open(&path)?; - std::io::copy(&mut entry, &mut out)?; - } else if kind.is_symlink() { - return Err(error( - "world VFS does not support creating symlinks; export a dereferenced tar/tree from the box instead", - )); - } else if kind.is_hard_link() { - let target = entry - .link_name()? - .ok_or_else(|| error("archive hardlink has no target"))? - .into_owned(); - if !safe(&target) { - return Err(error("archive hardlink target is outside destination")); - } - hardlinks.push((path, root.join(target))); - } else { - return Err(error("archive contains an unsupported special file")); - } - } - // Materialize hardlinks as independent files: VFS has no hardlink contract. - for (path, target) in hardlinks { - let metadata = std::fs::symlink_metadata(&target)?; - if !metadata.is_file() { - return Err(error("archive hardlink target is not a regular file")); - } - expanded = expanded.saturating_add(metadata.len()); - if expanded > MAX_FILE { - return Err(error("expanded tree exceeds 64 MiB transfer limit")); - } - let mut out = File::options().write(true).create_new(true).open(path)?; - std::io::copy(&mut File::open(target)?, &mut out)?; - } - Ok(()) -} - -pub fn get_tree(h: &str, p: GetTree) -> Result { - dir(&p.from_dir)?; - let dest = Path::new(&p.to_vfs_dir); - if dest.try_exists()? { - return Err(error("to_vfs_dir already exists; choose a new directory")); - } - let spool = Spool::new()?; - let remote = remote_tmp(); - let result = (|| -> Result<()> { - checked( - h, - &p.id, - json!(["tar", "-cf", remote, "-C", p.from_dir, "."]), - )?; - let len = size(h, &p.id, &remote)?; - let mut f = File::create(spool.path())?; - download(h, &p.id, &remote, &mut f, len)?; - drop(f); - // Stage alongside destination so rename is atomic and cannot cross mounts. - let parent = dest - .parent() - .filter(|p| !p.as_os_str().is_empty()) - .unwrap_or(Path::new(".")); - std::fs::create_dir_all(parent)?; - let staging = parent.join(format!(".box-tree-{}", crate::pid())); - std::fs::create_dir(&staging)?; - let unpack = (|| -> Result<()> { - unpack_tree(File::open(spool.path())?, &staging)?; - // Recheck to avoid accidentally replacing an existing empty directory. - if dest.try_exists()? { - return Err(error("destination appeared during transfer")); - } - std::fs::rename(&staging, dest)?; - Ok(()) - })(); - if unpack.is_err() { - let _ = std::fs::remove_dir_all(staging); - } - unpack - })(); - cleanup(h, &p.id, &remote); - result?; - Ok(OkResult { ok: true }) -} diff --git a/userland/box/test.nu b/userland/box/test.nu deleted file mode 100644 index 2b623c8..0000000 --- a/userland/box/test.nu +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env nu -# Real service acceptance tests. Every created box is removed, including failures. -def check [condition: bool, message: string] { - if not $condition { error make {msg: $message} } - print $'ok - ($message)' -} -def call [component: path, root: path, args: list] { - ^wasmtime run -S http -S cli-exit-with-code=y --dir $'($root)::/' $component ...$args | complete -} -def require [] { - let result = $in - if $result.exit_code != 0 { error make {msg: $'box failed: ($result.stderr)'} } - $result -} -def main [component: path = '/home/surma/src/gitea.surma.technology/surma/sausage/target/p1-tools/wasm32-wasip2/release/box.wasm'] { - let component = ($component | path expand) - let root = (^mktemp -d /tmp/box-test-XXXXXXXX | str trim) - mkdir ($root | path join project sub) - '{"scripts":{"test":"node sub/test.js"}}' | save ($root | path join project package.json) - 'const fs = require("node:fs"); require("node:assert/strict").equal(2 + 2, 4); fs.writeFileSync("result.txt", "npm test passed\n");' | save ($root | path join project sub test.js) - 'binary-safe file payload' | save ($root | path join input.txt) - let created = (call $component $root [create --ttl 600]) - let id = if $created.stdout =~ 'tc-[a-z0-9]{6}' { $created.stdout | str trim } else { $created.stderr | parse --regex '(?Ptc-[a-z0-9]{6})' | get id | first | default '' } - if $id == '' { error make {msg: $'create returned no recoverable id: ($created.stderr); test files: ($root)'} } - let outcome = try { - $created | require | ignore - check ($id =~ '^tc-[a-z0-9]{6}$') 'create returns id' - let inventory = (call $component $root [ls] | require) - check ($inventory.stdout | str contains $id) 'ls contains box' - let exec = (call $component $root [exec $id -- sh -c 'printf hello; printf problem >&2; exit 7']) - check ($exec.exit_code == 7 and $exec.stdout == 'hello' and ($exec.stderr | str contains 'problem')) 'exec preserves both streams and exit 7' - call $component $root [put $id /input.txt /tmp/file.txt] | require | ignore - call $component $root [get $id /tmp/file.txt /returned.txt] | require | ignore - check ((open --raw ($root | path join returned.txt)) == (open --raw ($root | path join input.txt))) 'file put/get round trip' - call $component $root [put $id /project /work] | require | ignore - call $component $root [get $id /work /tree] | require | ignore - check ((open --raw ($root | path join tree sub test.js)) == (open --raw ($root | path join project sub test.js))) 'tree round trip retains subfolder' - let npm = (call $component $root [exec $id --timeout 120 -- sh -c 'cd /work && npm test'] | require) - check ($npm.stdout | str contains 'node sub/test.js') 'npm test runs in box' - call $component $root [get $id /work/result.txt /result.txt] | require | ignore - check ((open --raw ($root | path join result.txt)) == "npm test passed\n") 'Node result returns to world' - let large = (call $component $root [exec $id -- node -e 'process.stdout.write(Buffer.alloc(1200003,255)); process.stderr.write("raw stderr");'] | require) - check (($large.stdout | str length --utf-8-bytes) < 16600) 'large binary inline output stays bounded' - let archive = ($large.stderr | parse --regex 'box stdout archive: (?P[^\n]+)' | get path | first) - let bytes = (open --raw ($root | path join ($archive | str trim --left --char '/'))) - check (($bytes | bytes length) == 1200003) 'full binary archive retains byte total' - let repeated = (call $component $root [exec $id -- sh -c 'printf collision-check'] | require) - check ($repeated.stdout == 'collision-check') 'later exec returns output' - check ((open --raw ($root | path join ($archive | str trim --left --char '/'))) == $bytes) 'later archive leaves earlier output intact' - let log = (call $component $root [logs $id] | require) - check ($log.stderr | str contains 'box build archive:') 'logs retains build archive' - let wit = (^wasm-tools component wit $component | complete) - check ($wit.exit_code == 0) 'component WIT inspection' - print $wit.stdout - let imports = ($wit.stdout | lines | where {|line| $line | str trim | str starts-with 'import ' }) - check ($imports | all {|line| $line | str trim | str starts-with 'import wasi:' }) 'component imports only WASI interfaces' - null - } catch {|failure| $failure } - let removed = (call $component $root [rm $id]) - print $removed.stderr - check ($removed.exit_code == 0) $'rm removes ($id)' - let after = (call $component $root [ls] | require) - check (not ($after.stdout | str contains $id)) 'removed box absent from ls' - if $outcome != null { error make {msg: $'acceptance failed: ($outcome); retained evidence: ($root)'} } - print $'PASS; world files and archives: ($root)' -}