diff --git a/.claude/rules/skills.md b/.claude/rules/skills.md
index ded26de98b2..1dc797dda0e 100644
--- a/.claude/rules/skills.md
+++ b/.claude/rules/skills.md
@@ -31,16 +31,19 @@ activation:
tags:
- "devops"
max_context_tokens: 2000
-metadata:
- openclaw:
- requires:
- bins: [docker, kubectl]
- env: [KUBECONFIG]
+requires:
+ bins: [docker, kubectl]
+ env: [KUBECONFIG]
---
# Skill instructions here...
```
+Only the top-level `requires:` block is supported. The legacy nested shape
+`metadata.openclaw.requires` is unsupported and ignored by the current parser,
+so older external skills must be migrated instead of relying on silent
+compatibility.
+
## Selection Pipeline
1. **Gating** -- Check binary/env/config requirements; skip skills whose prerequisites are missing
diff --git a/.dockerignore b/.dockerignore
index 32b9468cabd..09a7c89ec53 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -5,4 +5,3 @@ target/
*.md
!CLAUDE.md
node_modules/
-tools-src/
diff --git a/.githooks/pre-commit b/.githooks/pre-commit
index 9b9913d2d10..5a833d4d2fc 100755
--- a/.githooks/pre-commit
+++ b/.githooks/pre-commit
@@ -24,7 +24,7 @@ if $NEEDS_CHECK; then
fi
# i18n parity: when any language pack changes, all languages must stay in sync.
-if echo "$STAGED" | grep -qE '^src/channels/web/static/i18n/.*\.js$'; then
+if echo "$STAGED" | grep -qE '^crates/ironclaw_gateway/static/i18n/.*\.js$'; then
echo "pre-commit: checking i18n parity..."
if ! ./scripts/check-i18n-parity.sh; then
echo ""
diff --git a/.github/ISSUE_TEMPLATE/qa-bug.yml b/.github/ISSUE_TEMPLATE/qa-bug.yml
new file mode 100644
index 00000000000..ef1d912a642
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/qa-bug.yml
@@ -0,0 +1,94 @@
+name: QA Bug Report
+description: Bug found during QA testing on staging or hosted environments
+title: "[QA] "
+labels: ["qa-bug"]
+body:
+ - type: dropdown
+ id: environment
+ attributes:
+ label: Environment
+ description: Where was this bug found?
+ options:
+ - hosted-staging (crab shack)
+ - hosted-production
+ - local (cloned ironclaw)
+ - railway-staging
+ validations:
+ required: true
+
+ - type: input
+ id: version
+ attributes:
+ label: Version / Commit Hash
+ description: Paste the commit hash from staging at time of discovery (run `git rev-parse HEAD` or find it on the Railway deploy)
+ placeholder: "e.g. abcdef1"
+ validations:
+ required: true
+
+ - type: input
+ id: qa-date
+ attributes:
+ label: QA Test Date
+ description: Date you discovered this (YYYY-MM-DD)
+ placeholder: "e.g. 2026-04-12"
+ validations:
+ required: true
+
+ - type: input
+ id: feature-area
+ attributes:
+ label: Feature Area
+ description: What part of the app? (e.g. Google Suite extension, Telegram pairing, auth flow)
+ placeholder: "e.g. Extensions → Google Suite install"
+ validations:
+ required: true
+
+ - type: textarea
+ id: steps
+ attributes:
+ label: Steps to Reproduce
+ description: Exact steps — numbered, specific, no summaries
+ placeholder: |
+ 1. Open extensions tab
+ 2. Click "Install Google Suite"
+ 3. Fill in credentials and click Save
+ 4. ...
+ validations:
+ required: true
+
+ - type: textarea
+ id: expected
+ attributes:
+ label: Expected Behavior
+ description: What should happen?
+ validations:
+ required: true
+
+ - type: textarea
+ id: actual
+ attributes:
+ label: Actual Behavior
+ description: What actually happened? Include the exact error message/text.
+ placeholder: "Error: 'Failed to authenticate with Google: invalid_grant' shown in red toast"
+ validations:
+ required: true
+
+ - type: textarea
+ id: logs
+ attributes:
+ label: Logs / Screenshots
+ description: Paste relevant logs, error output, or attach screenshots. Drag files here.
+ validations:
+ required: false
+
+ - type: checkboxes
+ id: checklist
+ attributes:
+ label: Pre-submit checklist
+ options:
+ - label: Title is specific (not "fix Google Suite" but "Google Suite install throws invalid_grant on OAuth step")
+ required: true
+ - label: Commit hash is filled in
+ required: true
+ - label: Steps are numbered and reproducible
+ required: true
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
index 9c6bfacb5ee..9601165fa41 100644
--- a/.github/workflows/docker.yml
+++ b/.github/workflows/docker.yml
@@ -85,6 +85,13 @@ jobs:
echo "tags=${TAGS}" >> "$GITHUB_OUTPUT"
echo "worker_tags=${WORKER_TAGS}" >> "$GITHUB_OUTPUT"
+ # Staging builds get pre-bundled WASM extensions
+ if [[ "${EVENT_NAME}" == "schedule" || "${INPUT_TAG}" == "staging" ]]; then
+ echo "target=runtime-staging" >> "$GITHUB_OUTPUT"
+ else
+ echo "target=runtime" >> "$GITHUB_OUTPUT"
+ fi
+
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
@@ -100,6 +107,7 @@ jobs:
context: .
push: true
tags: ${{ steps.tags.outputs.tags }}
+ target: ${{ steps.tags.outputs.target }}
platforms: linux/amd64
cache-from: type=gha
cache-to: type=gha,mode=max
@@ -115,6 +123,36 @@ jobs:
cache-from: type=gha,scope=worker
cache-to: type=gha,mode=max,scope=worker
+ - name: Create releases-manager app token
+ id: app-token
+ continue-on-error: true
+ uses: actions/create-github-app-token@fee1f7d63c2ff003460e3d139729b119787bc349 # v2
+ with:
+ app-id: ${{ secrets.GH_RELEASES_MANAGER_APP_ID }}
+ private-key: ${{ secrets.GH_RELEASES_MANAGER_APP_PRIVATE_KEY }}
+ owner: nearai
+ repositories: ironclaw-dind
+
+ - name: Trigger ironclaw-dind Build & Push
+ if: steps.app-token.outcome == 'success'
+ continue-on-error: true
+ env:
+ GH_TOKEN: ${{ steps.app-token.outputs.token }}
+ EVENT_NAME: ${{ github.event_name }}
+ INPUT_TAG: ${{ inputs.tag }}
+ VERSION: ${{ steps.version.outputs.version }}
+ run: |
+ if [[ "${EVENT_NAME}" == "workflow_call" && -n "${VERSION}" ]]; then
+ gh api repos/nearai/ironclaw-dind/dispatches \
+ --method POST \
+ -f event_type="ironclaw_image_published" \
+ -f client_payload[version]="${VERSION}"
+ elif [[ "${EVENT_NAME}" == "schedule" ]] || [[ "${INPUT_TAG}" == "staging" ]]; then
+ gh api repos/nearai/ironclaw-dind/dispatches \
+ --method POST \
+ -f event_type="ironclaw_image_published"
+ fi
+
- name: Summary
run: |
{
diff --git a/Cargo.lock b/Cargo.lock
index b819442268c..dabcba57f8c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4,9 +4,9 @@ version = 4
[[package]]
name = "addr2line"
-version = "0.24.2"
+version = "0.26.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
+checksum = "59317f77929f0e679d39364702289274de2f0f0b22cbf50b2b8cff2169a0b27a"
dependencies = [
"gimli",
]
@@ -210,15 +210,6 @@ version = "1.0.102"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
-[[package]]
-name = "ar_archive_writer"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7eb93bbb63b9c227414f6eb3a0adfddca591a8ce1e9b60661bb08969b87e340b"
-dependencies = [
- "object 0.37.3",
-]
-
[[package]]
name = "arbitrary"
version = "1.4.2"
@@ -1083,6 +1074,15 @@ version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af"
+[[package]]
+name = "bitmaps"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2"
+dependencies = [
+ "typenum",
+]
+
[[package]]
name = "bitvec"
version = "1.0.1"
@@ -1781,32 +1781,53 @@ dependencies = [
"libc",
]
+[[package]]
+name = "cranelift-assembler-x64"
+version = "0.130.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "046d4b584c3bb9b5eb500c8f29549bec36be11000f1ba2a927cef3d1a9875691"
+dependencies = [
+ "cranelift-assembler-x64-meta",
+]
+
+[[package]]
+name = "cranelift-assembler-x64-meta"
+version = "0.130.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9b194a7870becb1490366fc0ae392ccd188065ff35f8391e77ac659db6fb977"
+dependencies = [
+ "cranelift-srcgen",
+]
+
[[package]]
name = "cranelift-bforest"
-version = "0.115.1"
+version = "0.130.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88c1d02b72b6c411c0a2e92b25ed791ad5d071184193c08a34aa0fdcdf000b72"
+checksum = "bb6a4ab44c6b371e661846b97dab687387a60ac4e2f864e2d4257284aad9e889"
dependencies = [
"cranelift-entity",
+ "wasmtime-internal-core",
]
[[package]]
name = "cranelift-bitset"
-version = "0.115.1"
+version = "0.130.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "720b93bd86ebbb23ebfb2db1ed44d54b2ecbdbb2d034d485bc64aa605ee787ab"
+checksum = "b8b7a44150c2f471a94023482bda1902710746e4bed9f9973d60c5a94319b06d"
dependencies = [
"serde",
"serde_derive",
+ "wasmtime-internal-core",
]
[[package]]
name = "cranelift-codegen"
-version = "0.115.1"
+version = "0.130.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aed3d2d9914d30b460eedd7fd507720203023997bef71452ce84873f9c93537c"
+checksum = "01b06598133b1dd76758b8b95f8d6747c124124aade50cea96a3d88b962da9fa"
dependencies = [
"bumpalo",
+ "cranelift-assembler-x64",
"cranelift-bforest",
"cranelift-bitset",
"cranelift-codegen-meta",
@@ -1815,79 +1836,93 @@ dependencies = [
"cranelift-entity",
"cranelift-isle",
"gimli",
- "hashbrown 0.14.5",
+ "hashbrown 0.16.1",
+ "libm",
"log",
+ "pulley-interpreter",
"regalloc2",
"rustc-hash 2.1.2",
"serde",
"smallvec",
- "target-lexicon 0.12.16",
+ "target-lexicon",
+ "wasmtime-internal-core",
]
[[package]]
name = "cranelift-codegen-meta"
-version = "0.115.1"
+version = "0.130.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "888c188d32263ec9e048873ff0b68c700933600d553f4412417916828be25f8e"
+checksum = "6190e2e7bcf0a678da2f715363d34ed530fedf7a2f0ab75edaefef72a70465ff"
dependencies = [
+ "cranelift-assembler-x64-meta",
"cranelift-codegen-shared",
+ "cranelift-srcgen",
+ "heck",
+ "pulley-interpreter",
]
[[package]]
name = "cranelift-codegen-shared"
-version = "0.115.1"
+version = "0.130.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ddd5f4114d04ce7e073dd74e2ad16541fc61970726fcc8b2d5644a154ee4127"
+checksum = "f583cf203d1aa8b79560e3b01f929bdacf9070b015eec4ea9c46e22a3f83e4a0"
[[package]]
name = "cranelift-control"
-version = "0.115.1"
+version = "0.130.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92cc4c98d6a4256a1600d93ccd3536f3e77da9b4ca2c279de786ac22876e67d6"
+checksum = "803159df35cc398ae54473c150b16d6c77e92ab2948be638488de126a3328fbc"
dependencies = [
"arbitrary",
]
[[package]]
name = "cranelift-entity"
-version = "0.115.1"
+version = "0.130.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "760af4b5e051b5f82097a27274b917e3751736369fa73660513488248d27f23d"
+checksum = "3109e417257082d88087f5bcce677525bdaa8322b88dd7f175ed1a1fd41d546c"
dependencies = [
"cranelift-bitset",
"serde",
"serde_derive",
+ "wasmtime-internal-core",
]
[[package]]
name = "cranelift-frontend"
-version = "0.115.1"
+version = "0.130.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0bf77ec0f470621655ec7539860b5c620d4f91326654ab21b075b83900f8831"
+checksum = "14db6b0e0e4994c581092df78d837be2072578f7cb2528f96a6cf895e56dee63"
dependencies = [
"cranelift-codegen",
"log",
"smallvec",
- "target-lexicon 0.12.16",
+ "target-lexicon",
]
[[package]]
name = "cranelift-isle"
-version = "0.115.1"
+version = "0.130.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b665d0a6932c421620be184f9fc7f7adaf1b0bc2fa77bb7ac5177c49abf645b"
+checksum = "ec66ea5025c7317383699778282ac98741d68444f956e3b1d7b62f12b7216e67"
[[package]]
name = "cranelift-native"
-version = "0.115.1"
+version = "0.130.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb2e75d1bd43dfec10924798f15e6474f1dbf63b0024506551aa19394dbe72ab"
+checksum = "373ade56438e6232619d85678477d0a88a31b3581936e0503e61e96b546b0800"
dependencies = [
"cranelift-codegen",
"libc",
- "target-lexicon 0.12.16",
+ "target-lexicon",
]
+[[package]]
+name = "cranelift-srcgen"
+version = "0.130.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef53619d3cd5c78fd998c6d9420547af26b72e6456f94c2a8a2334cb76b42baa"
+
[[package]]
name = "crc"
version = "3.4.0"
@@ -2355,33 +2390,13 @@ dependencies = [
"dirs-sys-next",
]
-[[package]]
-name = "dirs"
-version = "4.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
-dependencies = [
- "dirs-sys 0.3.7",
-]
-
[[package]]
name = "dirs"
version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e"
dependencies = [
- "dirs-sys 0.5.0",
-]
-
-[[package]]
-name = "dirs-sys"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
-dependencies = [
- "libc",
- "redox_users 0.4.6",
- "winapi",
+ "dirs-sys",
]
[[package]]
@@ -2758,6 +2773,12 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
+[[package]]
+name = "fixedbitset"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
+
[[package]]
name = "flagset"
version = "0.4.7"
@@ -2972,25 +2993,17 @@ dependencies = [
"slab",
]
-[[package]]
-name = "fxhash"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
-dependencies = [
- "byteorder",
-]
-
[[package]]
name = "fxprof-processed-profile"
-version = "0.6.0"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "27d12c0aed7f1e24276a241aadc4cb8ea9f83000f34bc062b7cc2d51e3b0fabd"
+checksum = "25234f20a3ec0a962a61770cfe39ecf03cb529a6e474ad8cff025ed497eda557"
dependencies = [
"bitflags 2.11.0",
"debugid",
- "fxhash",
+ "rustc-hash 2.1.2",
"serde",
+ "serde_derive",
"serde_json",
]
@@ -3099,11 +3112,12 @@ dependencies = [
[[package]]
name = "gimli"
-version = "0.31.1"
+version = "0.33.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
+checksum = "19e16c5073773ccf057c282be832a59ee53ef5ff98db3aeff7f8314f52ffc196"
dependencies = [
- "fallible-iterator 0.3.0",
+ "fnv",
+ "hashbrown 0.16.1",
"indexmap 2.13.0",
"stable_deref_trait",
]
@@ -3189,7 +3203,6 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
dependencies = [
"ahash 0.8.12",
"allocator-api2",
- "serde",
]
[[package]]
@@ -3201,7 +3214,6 @@ dependencies = [
"allocator-api2",
"equivalent",
"foldhash 0.1.5",
- "serde",
]
[[package]]
@@ -3213,6 +3225,8 @@ dependencies = [
"allocator-api2",
"equivalent",
"foldhash 0.2.0",
+ "serde",
+ "serde_core",
]
[[package]]
@@ -3717,6 +3731,20 @@ dependencies = [
"icu_properties",
]
+[[package]]
+name = "im-rc"
+version = "15.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af1955a75fa080c677d3972822ec4bad316169ab1cfc6c257a942c2265dbe5fe"
+dependencies = [
+ "bitmaps",
+ "rand_core 0.6.4",
+ "rand_xoshiro",
+ "sized-chunks",
+ "typenum",
+ "version_check",
+]
+
[[package]]
name = "image"
version = "0.25.10"
@@ -3862,13 +3890,14 @@ dependencies = [
"cron",
"crossterm 0.29.0",
"deadpool-postgres",
- "dirs 6.0.0",
+ "dirs",
"dotenvy",
"ed25519-dalek",
"eventsource-stream",
"flate2",
"fs4",
"futures",
+ "glob",
"hex",
"hkdf",
"hmac",
@@ -3880,6 +3909,7 @@ dependencies = [
"insta",
"ironclaw_common",
"ironclaw_engine",
+ "ironclaw_gateway",
"ironclaw_safety",
"ironclaw_skills",
"ironclaw_tui",
@@ -3927,7 +3957,7 @@ dependencies = [
"tokio-test",
"tokio-tungstenite 0.26.2",
"tokio-util",
- "toml",
+ "toml 0.8.23",
"tower 0.5.3",
"tower-http 0.6.8",
"tracing",
@@ -3936,7 +3966,7 @@ dependencies = [
"url",
"urlencoding",
"uuid",
- "wasmparser 0.220.1",
+ "wasmparser 0.245.1",
"wasmtime",
"wasmtime-wasi",
"webpki-roots 0.26.11",
@@ -3948,8 +3978,10 @@ dependencies = [
name = "ironclaw_common"
version = "0.1.0"
dependencies = [
+ "chrono-tz",
"serde",
"serde_json",
+ "tracing",
]
[[package]]
@@ -3958,6 +3990,8 @@ version = "0.1.0"
dependencies = [
"async-trait",
"chrono",
+ "cron",
+ "ironclaw_common",
"ironclaw_skills",
"monty",
"pretty_assertions",
@@ -3971,6 +4005,16 @@ dependencies = [
"uuid",
]
+[[package]]
+name = "ironclaw_gateway"
+version = "0.1.0"
+dependencies = [
+ "serde",
+ "serde_json",
+ "thiserror 2.0.18",
+ "tracing",
+]
+
[[package]]
name = "ironclaw_safety"
version = "0.2.0"
@@ -5036,25 +5080,16 @@ dependencies = [
[[package]]
name = "object"
-version = "0.36.7"
+version = "0.38.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
+checksum = "271638cd5fa9cca89c4c304675ca658efc4e64a66c716b7cfe1afb4b9611dbbc"
dependencies = [
"crc32fast",
- "hashbrown 0.15.5",
+ "hashbrown 0.16.1",
"indexmap 2.13.0",
"memchr",
]
-[[package]]
-name = "object"
-version = "0.37.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe"
-dependencies = [
- "memchr",
-]
-
[[package]]
name = "once_cell"
version = "1.21.4"
@@ -5288,6 +5323,16 @@ dependencies = [
"sha2",
]
+[[package]]
+name = "petgraph"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db"
+dependencies = [
+ "fixedbitset",
+ "indexmap 2.13.0",
+]
+
[[package]]
name = "pgvector"
version = "0.4.1"
@@ -5706,16 +5751,6 @@ dependencies = [
"syn 2.0.117",
]
-[[package]]
-name = "psm"
-version = "0.1.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3852766467df634d74f0b2d7819bf8dc483a0eb2e3b0f50f756f9cfe8b0d18d8"
-dependencies = [
- "ar_archive_writer",
- "cc",
-]
-
[[package]]
name = "ptr_meta"
version = "0.1.4"
@@ -5759,13 +5794,25 @@ dependencies = [
[[package]]
name = "pulley-interpreter"
-version = "28.0.1"
+version = "43.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8324e531de91a3c25021a30fb7862d39cc516b61fbb801176acb5ff279ea887b"
+checksum = "010dec3755eb61b2f1051ecb3611b718460b7a74c131e474de2af20a845938af"
dependencies = [
"cranelift-bitset",
"log",
- "sptr",
+ "pulley-macros",
+ "wasmtime-internal-core",
+]
+
+[[package]]
+name = "pulley-macros"
+version = "43.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad360c32e85ca4b083ac0e2b6856e8f11c3d5060dafa7d5dc57b370857fa3018"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.117",
]
[[package]]
@@ -5796,7 +5843,7 @@ version = "0.28.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e368e7ddfdeb98c9bca7f8383be1648fd84ab466bf2bc015e94008db6d35611e"
dependencies = [
- "target-lexicon 0.13.5",
+ "target-lexicon",
]
[[package]]
@@ -6013,6 +6060,15 @@ dependencies = [
"getrandom 0.3.4",
]
+[[package]]
+name = "rand_xoshiro"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa"
+dependencies = [
+ "rand_core 0.6.4",
+]
+
[[package]]
name = "rangemap"
version = "1.7.1"
@@ -6188,7 +6244,7 @@ dependencies = [
"time",
"tokio",
"tokio-postgres",
- "toml",
+ "toml 0.8.23",
"url",
"walkdir",
]
@@ -6209,9 +6265,9 @@ dependencies = [
[[package]]
name = "regalloc2"
-version = "0.11.2"
+version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc06e6b318142614e4a48bc725abbf08ff166694835c43c9dae5a9009704639a"
+checksum = "952ddbfc6f9f64d006c3efd8c9851a6ba2f2b944ba94730db255d55006e0ffda"
dependencies = [
"allocator-api2",
"bumpalo",
@@ -6997,6 +7053,15 @@ dependencies = [
"serde",
]
+[[package]]
+name = "serde_spanned"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26"
+dependencies = [
+ "serde_core",
+]
+
[[package]]
name = "serde_urlencoded"
version = "0.7.1"
@@ -7040,6 +7105,19 @@ dependencies = [
"syn 2.0.117",
]
+[[package]]
+name = "serde_yaml"
+version = "0.9.34+deprecated"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
+dependencies = [
+ "indexmap 2.13.0",
+ "itoa",
+ "ryu",
+ "serde",
+ "unsafe-libyaml",
+]
+
[[package]]
name = "serde_yml"
version = "0.0.12"
@@ -7101,15 +7179,6 @@ dependencies = [
"lazy_static",
]
-[[package]]
-name = "shellexpand"
-version = "2.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4"
-dependencies = [
- "dirs 4.0.0",
-]
-
[[package]]
name = "shlex"
version = "1.3.0"
@@ -7192,6 +7261,16 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e"
+[[package]]
+name = "sized-chunks"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e"
+dependencies = [
+ "bitmaps",
+ "typenum",
+]
+
[[package]]
name = "slab"
version = "0.4.12"
@@ -7257,12 +7336,6 @@ dependencies = [
"der",
]
-[[package]]
-name = "sptr"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a"
-
[[package]]
name = "stable_deref_trait"
version = "1.2.1"
@@ -7517,12 +7590,6 @@ dependencies = [
"xattr",
]
-[[package]]
-name = "target-lexicon"
-version = "0.12.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
-
[[package]]
name = "target-lexicon"
version = "0.13.5"
@@ -7983,11 +8050,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
dependencies = [
"serde",
- "serde_spanned",
+ "serde_spanned 0.6.9",
"toml_datetime 0.6.11",
"toml_edit 0.22.27",
]
+[[package]]
+name = "toml"
+version = "0.9.12+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863"
+dependencies = [
+ "indexmap 2.13.0",
+ "serde_core",
+ "serde_spanned 1.1.1",
+ "toml_datetime 0.7.5+spec-1.1.0",
+ "toml_parser",
+ "toml_writer",
+ "winnow 0.7.15",
+]
+
[[package]]
name = "toml_datetime"
version = "0.6.11"
@@ -7997,6 +8079,15 @@ dependencies = [
"serde",
]
+[[package]]
+name = "toml_datetime"
+version = "0.7.5+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347"
+dependencies = [
+ "serde_core",
+]
+
[[package]]
name = "toml_datetime"
version = "1.1.0+spec-1.1.0"
@@ -8014,7 +8105,7 @@ checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
dependencies = [
"indexmap 2.13.0",
"serde",
- "serde_spanned",
+ "serde_spanned 0.6.9",
"toml_datetime 0.6.11",
"toml_write",
"winnow 0.7.15",
@@ -8047,6 +8138,12 @@ version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
+[[package]]
+name = "toml_writer"
+version = "1.1.1+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db"
+
[[package]]
name = "tonic"
version = "0.11.0"
@@ -8490,6 +8587,12 @@ dependencies = [
"subtle",
]
+[[package]]
+name = "unsafe-libyaml"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861"
+
[[package]]
name = "untrusted"
version = "0.9.0"
@@ -8704,13 +8807,24 @@ dependencies = [
]
[[package]]
-name = "wasm-encoder"
-version = "0.221.3"
+name = "wasm-compose"
+version = "0.245.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc8444fe4920de80a4fe5ab564fff2ae58b6b73166b89751f8c6c93509da32e5"
+checksum = "5fd23d12cc95c451c1306db5bc63075fbebb612bb70c53b4237b1ce5bc178343"
dependencies = [
- "leb128",
- "wasmparser 0.221.3",
+ "anyhow",
+ "heck",
+ "im-rc",
+ "indexmap 2.13.0",
+ "log",
+ "petgraph",
+ "serde",
+ "serde_derive",
+ "serde_yaml",
+ "smallvec",
+ "wasm-encoder 0.245.1",
+ "wasmparser 0.245.1",
+ "wat",
]
[[package]]
@@ -8758,33 +8872,6 @@ dependencies = [
"web-sys",
]
-[[package]]
-name = "wasmparser"
-version = "0.220.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d07b6a3b550fefa1a914b6d54fc175dd11c3392da11eee604e6ffc759805d25"
-dependencies = [
- "ahash 0.8.12",
- "bitflags 2.11.0",
- "hashbrown 0.14.5",
- "indexmap 2.13.0",
- "semver",
- "serde",
-]
-
-[[package]]
-name = "wasmparser"
-version = "0.221.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d06bfa36ab3ac2be0dee563380147a5b81ba10dd8885d7fbbc9eb574be67d185"
-dependencies = [
- "bitflags 2.11.0",
- "hashbrown 0.15.5",
- "indexmap 2.13.0",
- "semver",
- "serde",
-]
-
[[package]]
name = "wasmparser"
version = "0.244.0"
@@ -8804,135 +8891,166 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4f08c9adee0428b7bddf3890fc27e015ac4b761cc608c822667102b8bfd6995e"
dependencies = [
"bitflags 2.11.0",
+ "hashbrown 0.16.1",
"indexmap 2.13.0",
"semver",
+ "serde",
]
[[package]]
name = "wasmprinter"
-version = "0.221.3"
+version = "0.245.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7343c42a97f2926c7819ff81b64012092ae954c5d83ddd30c9fcdefd97d0b283"
+checksum = "5f41517a3716fbb8ccf46daa9c1325f760fcbff5168e75c7392288e410b91ac8"
dependencies = [
"anyhow",
"termcolor",
- "wasmparser 0.221.3",
+ "wasmparser 0.245.1",
]
[[package]]
name = "wasmtime"
-version = "28.0.1"
+version = "43.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edd30973c65eceb0f37dfcc430d83abd5eb24015fdfcab6912f52949287e04f0"
+checksum = "ce205cd643d661b5ba5ba4717e13730262e8cdbc8f2eacbc7b906d45c1a74026"
dependencies = [
"addr2line",
- "anyhow",
"async-trait",
"bitflags 2.11.0",
"bumpalo",
"cc",
"cfg-if",
"encoding_rs",
+ "futures",
"fxprof-processed-profile",
"gimli",
- "hashbrown 0.14.5",
- "indexmap 2.13.0",
"ittapi",
"libc",
- "libm",
"log",
"mach2",
"memfd",
- "object 0.36.7",
+ "object",
"once_cell",
- "paste",
"postcard",
- "psm",
"pulley-interpreter",
"rayon",
- "rustix 0.38.44",
+ "rustix 1.1.4",
"semver",
"serde",
"serde_derive",
"serde_json",
"smallvec",
- "sptr",
- "target-lexicon 0.12.16",
- "wasm-encoder 0.221.3",
- "wasmparser 0.221.3",
- "wasmtime-asm-macros",
- "wasmtime-cache",
- "wasmtime-component-macro",
- "wasmtime-component-util",
- "wasmtime-cranelift",
+ "target-lexicon",
+ "tempfile",
+ "wasm-compose",
+ "wasm-encoder 0.245.1",
+ "wasmparser 0.245.1",
"wasmtime-environ",
- "wasmtime-fiber",
- "wasmtime-jit-debug",
- "wasmtime-jit-icache-coherence",
- "wasmtime-slab",
- "wasmtime-versioned-export-macros",
- "wasmtime-winch",
+ "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",
+ "wasmtime-internal-winch",
"wat",
- "windows-sys 0.59.0",
+ "windows-sys 0.61.2",
]
[[package]]
-name = "wasmtime-asm-macros"
-version = "28.0.1"
+name = "wasmtime-environ"
+version = "43.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6c21dd30d1f3f93ee390ac1a7ec304ecdbfdab6390e1add41a1f52727b0992b"
+checksum = "0b8b78abf3677d4a0a5db82e5015b4d085ff3a1b8b472cbb8c70d4b769f019ce"
dependencies = [
- "cfg-if",
+ "anyhow",
+ "cpp_demangle",
+ "cranelift-bforest",
+ "cranelift-bitset",
+ "cranelift-entity",
+ "gimli",
+ "hashbrown 0.16.1",
+ "indexmap 2.13.0",
+ "log",
+ "object",
+ "postcard",
+ "rustc-demangle",
+ "semver",
+ "serde",
+ "serde_derive",
+ "sha2",
+ "smallvec",
+ "target-lexicon",
+ "wasm-encoder 0.245.1",
+ "wasmparser 0.245.1",
+ "wasmprinter",
+ "wasmtime-internal-component-util",
+ "wasmtime-internal-core",
]
[[package]]
-name = "wasmtime-cache"
-version = "28.0.1"
+name = "wasmtime-internal-cache"
+version = "43.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cabd563cfbfe75c5bf514081f624ca8d18391a37520d8c794abce702474e688c"
+checksum = "8e4fd4103ba413c0da2e636f73490c6c8e446d708cbde7573703941bc3d6a448"
dependencies = [
- "anyhow",
- "base64 0.21.7",
+ "base64 0.22.1",
"directories-next",
"log",
"postcard",
- "rustix 0.38.44",
+ "rustix 1.1.4",
"serde",
"serde_derive",
"sha2",
- "toml",
- "windows-sys 0.59.0",
+ "toml 0.9.12+spec-1.1.0",
+ "wasmtime-environ",
+ "windows-sys 0.61.2",
"zstd",
]
[[package]]
-name = "wasmtime-component-macro"
-version = "28.0.1"
+name = "wasmtime-internal-component-macro"
+version = "43.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f948a6ef3119d52c9f12936970de28ddf3f9bea04bc65571f4a92d2e5ab38f4"
+checksum = "0d3d6914f34be2f9d78d8ee9f422e834dfc204e71ccce697205fae95fed87892"
dependencies = [
"anyhow",
"proc-macro2",
"quote",
"syn 2.0.117",
- "wasmtime-component-util",
- "wasmtime-wit-bindgen",
- "wit-parser 0.221.3",
+ "wasmtime-internal-component-util",
+ "wasmtime-internal-wit-bindgen",
+ "wit-parser 0.245.1",
]
[[package]]
-name = "wasmtime-component-util"
-version = "28.0.1"
+name = "wasmtime-internal-component-util"
+version = "43.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9275aa01ceaaa2fa6c0ecaa5267518d80b9d6e9ae7c7ea42f4c6e073e6a69ef"
+checksum = "3751b0616b914fdd87fe1bf804694a078f321b000338e6476bc48a4d6e454f21"
[[package]]
-name = "wasmtime-cranelift"
-version = "28.0.1"
+name = "wasmtime-internal-core"
+version = "43.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0701a44a323267aae4499672dae422b266cee3135a23b640972ec8c0e10a44a2"
+checksum = "22632b187e1b0716f1b9ac57ad29013bed33175fcb19e10bb6896126f82fac67"
dependencies = [
"anyhow",
+ "hashbrown 0.16.1",
+ "libm",
+ "serde",
+]
+
+[[package]]
+name = "wasmtime-internal-cranelift"
+version = "43.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b3ca07b3e0bb3429674b173b5800577719d600774dd81bff58f775c0aaa64ee"
+dependencies = [
"cfg-if",
"cranelift-codegen",
"cranelift-control",
@@ -8940,93 +9058,77 @@ dependencies = [
"cranelift-frontend",
"cranelift-native",
"gimli",
- "itertools 0.12.1",
+ "itertools 0.14.0",
"log",
- "object 0.36.7",
+ "object",
+ "pulley-interpreter",
"smallvec",
- "target-lexicon 0.12.16",
- "thiserror 1.0.69",
- "wasmparser 0.221.3",
+ "target-lexicon",
+ "thiserror 2.0.18",
+ "wasmparser 0.245.1",
"wasmtime-environ",
- "wasmtime-versioned-export-macros",
-]
-
-[[package]]
-name = "wasmtime-environ"
-version = "28.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "264c968c1b81d340355ece2be0bc31a10f567ccb6ce08512c3b7d10e26f3cbe5"
-dependencies = [
- "anyhow",
- "cpp_demangle",
- "cranelift-bitset",
- "cranelift-entity",
- "gimli",
- "indexmap 2.13.0",
- "log",
- "object 0.36.7",
- "postcard",
- "rustc-demangle",
- "semver",
- "serde",
- "serde_derive",
- "smallvec",
- "target-lexicon 0.12.16",
- "wasm-encoder 0.221.3",
- "wasmparser 0.221.3",
- "wasmprinter",
- "wasmtime-component-util",
+ "wasmtime-internal-core",
+ "wasmtime-internal-unwinder",
+ "wasmtime-internal-versioned-export-macros",
]
[[package]]
-name = "wasmtime-fiber"
-version = "28.0.1"
+name = "wasmtime-internal-fiber"
+version = "43.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78505221fd5bd7b07b4e1fa2804edea49dc231e626ad6861adc8f531812973e6"
+checksum = "20c8b2c9704eb1f33ead025ec16038277ccb63d0a14c31e99d5b765d7c36da55"
dependencies = [
- "anyhow",
"cc",
"cfg-if",
- "rustix 0.38.44",
- "wasmtime-asm-macros",
- "wasmtime-versioned-export-macros",
- "windows-sys 0.59.0",
+ "libc",
+ "rustix 1.1.4",
+ "wasmtime-environ",
+ "wasmtime-internal-versioned-export-macros",
+ "windows-sys 0.61.2",
]
[[package]]
-name = "wasmtime-jit-debug"
-version = "28.0.1"
+name = "wasmtime-internal-jit-debug"
+version = "43.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0cec0a8e5620ae71bfcaaec78e3076be5b6ebf869f4e6191925d73242224a915"
+checksum = "d950310d07391d34369f62c48336ebb14eacbd4d6f772bb5f349c24e838e0664"
dependencies = [
- "object 0.36.7",
- "rustix 0.38.44",
- "wasmtime-versioned-export-macros",
+ "cc",
+ "object",
+ "rustix 1.1.4",
+ "wasmtime-internal-versioned-export-macros",
]
[[package]]
-name = "wasmtime-jit-icache-coherence"
-version = "28.0.1"
+name = "wasmtime-internal-jit-icache-coherence"
+version = "43.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9bedb677ca1b549d98f95e9e1f9251b460090d99a2c196a0614228c064bf2e59"
+checksum = "3606662c156962d096be3127b8b8ae8ee2f8be3f896dad29259ff01ddb64abfd"
dependencies = [
- "anyhow",
"cfg-if",
"libc",
- "windows-sys 0.59.0",
+ "wasmtime-internal-core",
+ "windows-sys 0.61.2",
]
[[package]]
-name = "wasmtime-slab"
-version = "28.0.1"
+name = "wasmtime-internal-unwinder"
+version = "43.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "564905638c132c275d365c1fa074f0b499790568f43148d29de84ccecfb5cb31"
+checksum = "75eef0747e52dc545b075f64fd0e0cc237ae738e641266b1970e07e2d744bc32"
+dependencies = [
+ "cfg-if",
+ "cranelift-codegen",
+ "log",
+ "object",
+ "wasmtime-environ",
+]
[[package]]
-name = "wasmtime-versioned-export-macros"
-version = "28.0.1"
+name = "wasmtime-internal-versioned-export-macros"
+version = "43.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e91092e6cf77390eeccee273846a9327f3e8f91c3c6280f60f37809f0e62d29"
+checksum = "d8b0a5dab02a8fb527f547855ecc0e05f9fdc3d5bd57b8b080349408f9a6cece"
dependencies = [
"proc-macro2",
"quote",
@@ -9034,12 +9136,41 @@ dependencies = [
]
[[package]]
-name = "wasmtime-wasi"
-version = "28.0.1"
+name = "wasmtime-internal-winch"
+version = "43.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8007342bd12ff400293a817973f7ecd6f1d9a8549a53369a9c1af357166f1f1e"
+dependencies = [
+ "cranelift-codegen",
+ "gimli",
+ "log",
+ "object",
+ "target-lexicon",
+ "wasmparser 0.245.1",
+ "wasmtime-environ",
+ "wasmtime-internal-cranelift",
+ "winch-codegen",
+]
+
+[[package]]
+name = "wasmtime-internal-wit-bindgen"
+version = "43.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a8e04b9a4c68ad018b330a4f4914b82b01dc3582d715ce21a93564c7f26b19f"
+checksum = "7900c3e3c1d6e475bc225d73b02d6d5484815f260022e6964dca9558e50dd01a"
dependencies = [
"anyhow",
+ "bitflags 2.11.0",
+ "heck",
+ "indexmap 2.13.0",
+ "wit-parser 0.245.1",
+]
+
+[[package]]
+name = "wasmtime-wasi"
+version = "43.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed3e3ddcfad69e9eb025bd19bff70dad45bafe1d6eacd134c0ffdfc4c161d045"
+dependencies = [
"async-trait",
"bitflags 2.11.0",
"bytes",
@@ -9052,44 +9183,29 @@ dependencies = [
"futures",
"io-extras",
"io-lifetimes",
- "rustix 0.38.44",
+ "rustix 1.1.4",
"system-interface",
- "thiserror 1.0.69",
+ "thiserror 2.0.18",
"tokio",
"tracing",
"url",
"wasmtime",
+ "wasmtime-wasi-io",
"wiggle",
- "windows-sys 0.59.0",
-]
-
-[[package]]
-name = "wasmtime-winch"
-version = "28.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b111d909dc604c741bd8ac2f4af373eaa5c68c34b5717271bcb687688212cef8"
-dependencies = [
- "anyhow",
- "cranelift-codegen",
- "gimli",
- "object 0.36.7",
- "target-lexicon 0.12.16",
- "wasmparser 0.221.3",
- "wasmtime-cranelift",
- "wasmtime-environ",
- "winch-codegen",
+ "windows-sys 0.61.2",
]
[[package]]
-name = "wasmtime-wit-bindgen"
-version = "28.0.1"
+name = "wasmtime-wasi-io"
+version = "43.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f38f7a5eb2f06f53fe943e7fb8bf4197f7cf279f1bc52c0ce56e9d3ffd750a4"
+checksum = "3ca5dd3b9f04a851c422d05f333366722742da46bff9369ae0191f32cf83565a"
dependencies = [
- "anyhow",
- "heck",
- "indexmap 2.13.0",
- "wit-parser 0.221.3",
+ "async-trait",
+ "bytes",
+ "futures",
+ "tracing",
+ "wasmtime",
]
[[package]]
@@ -9206,39 +9322,37 @@ dependencies = [
[[package]]
name = "wiggle"
-version = "28.0.1"
+version = "43.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b23e3dc273d1e35cab9f38a5f76487aeeedcfa6a3fb594e209ee7b6f8b41dcc"
+checksum = "cc1b1135efc8e5a008971897bea8d41ca56d8d501d4efb807842ae0a1c78f639"
dependencies = [
- "anyhow",
- "async-trait",
"bitflags 2.11.0",
- "thiserror 1.0.69",
+ "thiserror 2.0.18",
"tracing",
"wasmtime",
+ "wasmtime-environ",
"wiggle-macro",
]
[[package]]
name = "wiggle-generate"
-version = "28.0.1"
+version = "43.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8738c5a7ef3a9de0fae10f8b84091a2aa4e059d8fef23de202ab689812b6bc6e"
+checksum = "a7bc2b0d50ec8773b44fbfe1da6cb5cc44a92deaf8483233dcf0831e6db33172"
dependencies = [
- "anyhow",
"heck",
"proc-macro2",
"quote",
- "shellexpand",
"syn 2.0.117",
+ "wasmtime-environ",
"witx",
]
[[package]]
name = "wiggle-macro"
-version = "28.0.1"
+version = "43.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e882267ac583e013a38a5aaeb83a49b219456ba3aa6e6772440f7213b176e8ff"
+checksum = "2d6c7d44ea552e1fbfdcd7a2cd83f5c2d1e803d5b1a11e3462c06888b77f455f"
dependencies = [
"proc-macro2",
"quote",
@@ -9279,19 +9393,21 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "winch-codegen"
-version = "28.0.1"
+version = "43.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6232f40a795be2ce10fc761ed3b403825126a60d12491ac556ea104a932fd18a"
+checksum = "eb9f45f7172a2628c8317766e427babc0a400f9d10b1c0f0b0617c5ed5b79de6"
dependencies = [
- "anyhow",
+ "cranelift-assembler-x64",
"cranelift-codegen",
"gimli",
"regalloc2",
"smallvec",
- "target-lexicon 0.12.16",
- "wasmparser 0.221.3",
- "wasmtime-cranelift",
+ "target-lexicon",
+ "thiserror 2.0.18",
+ "wasmparser 0.245.1",
"wasmtime-environ",
+ "wasmtime-internal-core",
+ "wasmtime-internal-cranelift",
]
[[package]]
@@ -9695,9 +9811,9 @@ dependencies = [
[[package]]
name = "wit-parser"
-version = "0.221.3"
+version = "0.244.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "896112579ed56b4a538b07a3d16e562d101ff6265c46b515ce0c701eef16b2ac"
+checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
dependencies = [
"anyhow",
"id-arena",
@@ -9708,16 +9824,17 @@ dependencies = [
"serde_derive",
"serde_json",
"unicode-xid",
- "wasmparser 0.221.3",
+ "wasmparser 0.244.0",
]
[[package]]
name = "wit-parser"
-version = "0.244.0"
+version = "0.245.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
+checksum = "330698718e82983499419494dd1e3d7811a457a9bf9f69734e8c5f07a2547929"
dependencies = [
"anyhow",
+ "hashbrown 0.16.1",
"id-arena",
"indexmap 2.13.0",
"log",
@@ -9726,7 +9843,7 @@ dependencies = [
"serde_derive",
"serde_json",
"unicode-xid",
- "wasmparser 0.244.0",
+ "wasmparser 0.245.1",
]
[[package]]
diff --git a/Cargo.toml b/Cargo.toml
index 0af78649186..4130032581a 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,10 +1,11 @@
[workspace]
-members = [".", "crates/ironclaw_common", "crates/ironclaw_safety", "crates/ironclaw_skills", "crates/ironclaw_engine", "crates/ironclaw_tui"]
+members = [".", "crates/ironclaw_common", "crates/ironclaw_safety", "crates/ironclaw_skills", "crates/ironclaw_engine", "crates/ironclaw_gateway", "crates/ironclaw_tui"]
exclude = [
"channels-src/discord",
"channels-src/telegram",
"channels-src/slack",
"channels-src/whatsapp",
+ "tools-src/composio",
"tools-src/github",
"tools-src/gmail",
"tools-src/google-calendar",
@@ -116,6 +117,7 @@ ironclaw_common = { path = "crates/ironclaw_common", version = "0.1.0" }
# Safety/sanitization
ironclaw_engine = { path = "crates/ironclaw_engine", version = "0.1.0" }
+ironclaw_gateway = { path = "crates/ironclaw_gateway", version = "0.1.0" }
ironclaw_safety = { path = "crates/ironclaw_safety", version = "0.2.0" }
ironclaw_skills = { path = "crates/ironclaw_skills", version = "0.1.0" }
ironclaw_tui = { path = "crates/ironclaw_tui", version = "0.1.0", optional = true }
@@ -128,6 +130,7 @@ serde_yml = "0.0.12"
# Filesystem paths
dirs = "6"
fs4 = "0.6"
+glob = "0.3"
# Semantic versioning
semver = "1"
@@ -147,9 +150,9 @@ open = "5"
pgvector = { version = "0.4", features = ["postgres"], optional = true }
# WASM sandbox for untrusted tool execution
-wasmtime = { version = "28", features = ["component-model"] }
-wasmtime-wasi = "28" # WASI support for component model
-wasmparser = "0.220" # WASM binary parsing for validation
+wasmtime = { version = "43.0.1", features = ["component-model"] }
+wasmtime-wasi = "43.0.1" # WASI support for component model
+wasmparser = "0.245.1" # WASM binary parsing for validation
# Cryptography for secrets management
aes-gcm = "0.10"
@@ -226,7 +229,7 @@ tempfile = "3"
insta = "1.46.3"
[features]
-default = ["postgres", "libsql", "html-to-markdown"]
+default = ["postgres", "libsql", "html-to-markdown", "tui"]
postgres = [
"dep:deadpool-postgres",
"dep:tokio-postgres",
diff --git a/Dockerfile b/Dockerfile
index 89b9366597b..9c015e83317 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -32,6 +32,7 @@ COPY tests/ tests/
COPY migrations/ migrations/
COPY registry/ registry/
COPY channels-src/ channels-src/
+COPY tools-src/ tools-src/
COPY wit/ wit/
COPY providers.json providers.json
@@ -59,13 +60,59 @@ COPY tests/ tests/
COPY migrations/ migrations/
COPY registry/ registry/
COPY channels-src/ channels-src/
+COPY tools-src/ tools-src/
COPY wit/ wit/
COPY providers.json providers.json
+COPY profiles/ profiles/
RUN cargo build --profile dist --bin ironclaw
-# Stage 5: Minimal runtime
-FROM debian:bookworm-slim
+# Stage 4b: Build all WASM extensions from source (only used by runtime-staging)
+FROM builder AS wasm-builder
+ARG CACHE_BUST
+
+RUN apt-get update && apt-get install -y --no-install-recommends jq && rm -rf /var/lib/apt/lists/*
+RUN echo "cache-bust=${CACHE_BUST}"
+
+RUN set -eux; \
+ mkdir -p /app/wasm-bundles/tools /app/wasm-bundles/channels; \
+ for manifest in registry/tools/*.json registry/channels/*.json; do \
+ [ -f "$manifest" ] || continue; \
+ kind=$(jq -r '.kind' "$manifest"); \
+ ext_name=$(jq -r '.name' "$manifest"); \
+ source_dir=$(jq -r '.source.dir' "$manifest"); \
+ caps_file=$(jq -r '.source.capabilities' "$manifest"); \
+ crate_name=$(jq -r '.source.crate_name' "$manifest"); \
+ [ -d "$source_dir" ] || continue; \
+ # Telegram is embedded in the binary at build time; skip it
+ [ "$ext_name" = "telegram" ] && continue; \
+ echo "=== Building $ext_name from $source_dir ==="; \
+ if [ -f "$source_dir/Cargo.lock" ]; then \
+ CARGO_TARGET_DIR=/app/target cargo build --locked --release --target wasm32-wasip2 \
+ --manifest-path "$source_dir/Cargo.toml" || { echo "WARN: build failed for $ext_name"; continue; }; \
+ else \
+ CARGO_TARGET_DIR=/app/target cargo build --release --target wasm32-wasip2 \
+ --manifest-path "$source_dir/Cargo.toml" || { echo "WARN: build failed for $ext_name"; continue; }; \
+ fi; \
+ wasm_artifact=$(echo "${crate_name}" | tr '-' '_'); \
+ raw_wasm="/app/target/wasm32-wasip2/release/${wasm_artifact}.wasm"; \
+ [ -f "$raw_wasm" ] || continue; \
+ dest_dir="/app/wasm-bundles/tools"; \
+ [ "$kind" = "channel" ] && dest_dir="/app/wasm-bundles/channels"; \
+ wasm-tools component new "$raw_wasm" -o "$dest_dir/${ext_name}.wasm" 2>/dev/null \
+ || cp "$raw_wasm" "$dest_dir/${ext_name}.wasm"; \
+ wasm-tools strip "$dest_dir/${ext_name}.wasm" -o "$dest_dir/${ext_name}.wasm.tmp" 2>/dev/null \
+ && mv "$dest_dir/${ext_name}.wasm.tmp" "$dest_dir/${ext_name}.wasm" \
+ || true; \
+ [ -f "$source_dir/$caps_file" ] && cp "$source_dir/$caps_file" "$dest_dir/${ext_name}.capabilities.json"; \
+ echo " -> $dest_dir/${ext_name}.wasm"; \
+ done; \
+ count=$(find /app/wasm-bundles -name '*.wasm' | wc -l); \
+ echo "Built $count WASM extensions"; \
+ [ "$count" -gt 0 ] || { echo "ERROR: No WASM extensions were built"; exit 1; }
+
+# Stage 5a: Shared runtime base
+FROM debian:bookworm-slim AS runtime-base
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates \
@@ -80,10 +127,19 @@ RUN useradd -m -d /home/ironclaw -u 1000 ironclaw \
&& mkdir -p /home/ironclaw/.ironclaw \
&& chown -R ironclaw:ironclaw /home/ironclaw
WORKDIR /home/ironclaw
-USER ironclaw
EXPOSE 3000
ENV RUST_LOG=ironclaw=info
ENTRYPOINT ["ironclaw"]
+
+# Stage 5b: Staging runtime (with pre-built WASM extensions)
+FROM runtime-base AS runtime-staging
+COPY --from=wasm-builder --chown=ironclaw:ironclaw /app/wasm-bundles/tools/ /home/ironclaw/.ironclaw/tools/
+COPY --from=wasm-builder --chown=ironclaw:ironclaw /app/wasm-bundles/channels/ /home/ironclaw/.ironclaw/channels/
+USER ironclaw
+
+# Stage 5c: Production runtime (default — no pre-bundled extensions)
+FROM runtime-base AS runtime
+USER ironclaw
diff --git a/crates/ironclaw_common/Cargo.toml b/crates/ironclaw_common/Cargo.toml
index 6e7db5a42df..2308ff9c417 100644
--- a/crates/ironclaw_common/Cargo.toml
+++ b/crates/ironclaw_common/Cargo.toml
@@ -13,5 +13,7 @@ repository = "https://github.com/nearai/ironclaw"
dist = false
[dependencies]
+chrono-tz = "0.10"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
+tracing = "0.1"
diff --git a/crates/ironclaw_common/src/lib.rs b/crates/ironclaw_common/src/lib.rs
index c297342d65e..852374dfd4f 100644
--- a/crates/ironclaw_common/src/lib.rs
+++ b/crates/ironclaw_common/src/lib.rs
@@ -1,9 +1,11 @@
//! Shared types and utilities for the IronClaw workspace.
mod event;
+mod timezone;
mod util;
pub use event::{AppEvent, PlanStepDto, ToolDecisionDto};
+pub use timezone::{ValidTimezone, deserialize_option_lenient};
pub use util::truncate_preview;
/// Maximum worker agent loop iterations. Used by the orchestrator (server-side
diff --git a/crates/ironclaw_common/src/timezone.rs b/crates/ironclaw_common/src/timezone.rs
new file mode 100644
index 00000000000..4eea97421af
--- /dev/null
+++ b/crates/ironclaw_common/src/timezone.rs
@@ -0,0 +1,166 @@
+//! Validated IANA timezone type.
+
+use serde::{Deserialize, Serialize};
+
+/// A validated IANA timezone.
+///
+/// Wraps `chrono_tz::Tz` and guarantees the timezone string was valid at
+/// construction time. Use `ValidTimezone::parse()` to create — it returns
+/// `None` for empty or unrecognized timezone strings.
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub struct ValidTimezone(chrono_tz::Tz);
+
+impl ValidTimezone {
+ /// Parse an IANA timezone string. Returns `None` for empty or invalid input.
+ pub fn parse(s: &str) -> Option {
+ let trimmed = s.trim();
+ if trimmed.is_empty() {
+ return None;
+ }
+ trimmed.parse::().ok().map(Self)
+ }
+
+ /// The underlying `chrono_tz::Tz` value.
+ pub fn tz(&self) -> chrono_tz::Tz {
+ self.0
+ }
+
+ /// The IANA name (e.g. "America/New_York").
+ pub fn name(&self) -> &str {
+ self.0.name()
+ }
+}
+
+impl std::fmt::Display for ValidTimezone {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ f.write_str(self.name())
+ }
+}
+
+impl Serialize for ValidTimezone {
+ fn serialize(&self, serializer: S) -> Result {
+ self.name().serialize(serializer)
+ }
+}
+
+impl<'de> Deserialize<'de> for ValidTimezone {
+ fn deserialize>(deserializer: D) -> Result {
+ let s = String::deserialize(deserializer)?;
+ Self::parse(&s)
+ .ok_or_else(|| serde::de::Error::custom(format!("invalid IANA timezone: '{s}'")))
+ }
+}
+
+/// Lenient deserializer for `Option`.
+///
+/// Use with `#[serde(default, deserialize_with = "...")]` on fields that may
+/// contain invalid timezone strings from historical data. Invalid or empty
+/// values deserialize as `None` instead of failing the whole record. Each
+/// drop is logged at `debug!` so a typo in fresh user config is at least
+/// observable in the logs even though the record loads.
+pub fn deserialize_option_lenient<'de, D: serde::Deserializer<'de>>(
+ deserializer: D,
+) -> Result
+ if !body_injections.is_empty() {
+ let body_block = body_injections.join("\n");
+ if let Some(pos) = result.rfind("") {
+ result.insert_str(pos, &format!("\n{}\n", body_block));
+ }
+ }
+
+ result
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::layout::*;
+ use crate::widget::*;
+
+ const MINIMAL_HTML: &str =
+ "