Commit graph

474 commits

Author SHA1 Message Date
fettpl
882defef12 security(browser): harden SSRF blocking and block file:// URLs
- Block file:// URLs which bypassed all SSRF and domain-allowlist
  controls, enabling arbitrary local file exfiltration via browser
- Harden is_private_host() to match http_request.rs coverage:
  multicast, broadcast, reserved (240/4), shared address space
  (100.64/10), documentation IPs, benchmarking IPs
- Add .localhost subdomain and .local mDNS TLD blocking
- Extract is_non_global_v4() and is_non_global_v6() helpers

Closes #361

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 17:49:21 +01:00
Chummy
c11c569ddd
Merge pull request #377 from fettpl/fix/352-ssrf-ip-blocking
fix(security): block multicast/broadcast/reserved IPs in SSRF protection
2026-02-17 00:47:46 +08:00
Chummy
def9fe4e23
Merge pull request #390 from zeroclaw-labs/docs/agents-supersede-template
docs(agents): add superseded-PR title/body template
2026-02-17 00:47:24 +08:00
Chummy
44ef48f3c6 docs(agents): add superseded-PR title/body template 2026-02-17 00:46:01 +08:00
fettpl
ac5cce4ec5 ops: add resource limits to docker-compose.yml
Add CPU and memory constraints to prevent runaway resource consumption:
- Limits: 2 CPUs, 2 GB memory
- Reservations: 0.5 CPUs, 512 MB memory

Closes #360

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 17:43:00 +01:00
reidliu41
6bb9bc47c0 feat(provider): add Qwen/DashScope provider with multi-region support
- Add Alibaba Qwen as an OpenAI-compatible provider via DashScope API
- Support three regional endpoints: China (Beijing), Singapore, and US (Virginia)
- All regions share a single `DASHSCOPE_API_KEY` environment variable

| Config Value | Region | Base URL |
|---|---|---|
| `qwen` / `dashscope` | China (Beijing) | `dashscope.aliyuncs.com/compatible-mode/v1` |
| `qwen-intl` / `dashscope-intl` | Singapore | `dashscope-intl.aliyuncs.com/compatible-mode/v1` |
| `qwen-us` / `dashscope-us` | US (Virginia) | `dashscope-us.aliyuncs.com/compatible-mode/v1` |
2026-02-17 00:42:53 +08:00
fettpl
38f6339a83 ci: pin Docker base images to SHA256 digests
Pin all FROM images in Dockerfile and dev/ci/Dockerfile to their
current SHA256 manifest digests for reproducible builds.

- rust:1.93-slim-trixie → @sha256:9663b80a...
- busybox:latest → busybox:1.37@sha256:b3255e7d...
- debian:trixie-slim → @sha256:f6e2cfac...
- gcr.io/distroless/cc-debian13:nonroot → @sha256:84fcd3c2...
- rust:1.92-slim → @sha256:bf3368a9...

Closes #359

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 17:42:05 +01:00
Chummy
02decd309f fix(security): tighten SSRF IP classification for docs ranges 2026-02-17 00:41:48 +08:00
ehu shubham shaw
de3ec87d16
Ehu shubham shaw contribution --> Hardware support (#306)
* feat: add ZeroClaw firmware for ESP32 and Nucleo

* Introduced new firmware for ZeroClaw on ESP32 and Nucleo-F401RE, enabling JSON-over-serial communication for GPIO control.
* Added `zeroclaw-esp32` with support for commands like `gpio_read` and `gpio_write`, along with capabilities reporting.
* Implemented `zeroclaw-nucleo` firmware with similar functionality for STM32, ensuring compatibility with existing ZeroClaw protocols.
* Updated `.gitignore` to include new firmware targets and added necessary dependencies in `Cargo.toml` for both platforms.
* Created README files for both firmware projects detailing setup, build, and usage instructions.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* feat: enhance hardware peripheral support and documentation

- Added `Peripheral` trait implementation in `src/peripherals/` to manage hardware boards (STM32, RPi GPIO).
- Updated `AGENTS.md` to include new extension points for peripherals and their configuration.
- Introduced comprehensive documentation for adding boards and tools, including a quick start guide and supported boards.
- Enhanced `Cargo.toml` to include optional dependencies for PDF extraction and peripheral support.
- Created new datasheets for Arduino Uno, ESP32, and Nucleo-F401RE, detailing pin aliases and GPIO usage.
- Implemented new tools for hardware memory reading and board information retrieval in the agent loop.

This update significantly improves the integration and usability of hardware peripherals within the ZeroClaw framework.

* feat: add ZeroClaw firmware for ESP32 and Nucleo

* Introduced new firmware for ZeroClaw on ESP32 and Nucleo-F401RE, enabling JSON-over-serial communication for GPIO control.
* Added `zeroclaw-esp32` with support for commands like `gpio_read` and `gpio_write`, along with capabilities reporting.
* Implemented `zeroclaw-nucleo` firmware with similar functionality for STM32, ensuring compatibility with existing ZeroClaw protocols.
* Updated `.gitignore` to include new firmware targets and added necessary dependencies in `Cargo.toml` for both platforms.
* Created README files for both firmware projects detailing setup, build, and usage instructions.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* feat: enhance hardware peripheral support and documentation

- Added `Peripheral` trait implementation in `src/peripherals/` to manage hardware boards (STM32, RPi GPIO).
- Updated `AGENTS.md` to include new extension points for peripherals and their configuration.
- Introduced comprehensive documentation for adding boards and tools, including a quick start guide and supported boards.
- Enhanced `Cargo.toml` to include optional dependencies for PDF extraction and peripheral support.
- Created new datasheets for Arduino Uno, ESP32, and Nucleo-F401RE, detailing pin aliases and GPIO usage.
- Implemented new tools for hardware memory reading and board information retrieval in the agent loop.

This update significantly improves the integration and usability of hardware peripherals within the ZeroClaw framework.

* feat: Introduce hardware auto-discovery and expanded configuration options for agents, hardware, and security.

* chore: update dependencies and improve probe-rs integration

- Updated `Cargo.lock` to remove specific version constraints for several dependencies, including `zerocopy`, `syn`, and `strsim`, allowing for more flexibility in version resolution.
- Upgraded `bincode` and `bitfield` to their latest versions, enhancing serialization and memory management capabilities.
- Updated `Cargo.toml` to reflect the new version of `probe-rs` from `0.24` to `0.30`, improving hardware probing functionality.
- Refactored code in `src/hardware` and `src/tools` to utilize the new `SessionConfig` for session management in `probe-rs`, ensuring better compatibility and performance.
- Cleaned up documentation in `docs/datasheets/nucleo-f401re.md` by removing unnecessary lines.

* fix: apply cargo fmt

* docs: add hardware architecture diagram.

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 11:40:10 -05:00
Chummy
b36f23784a
fix(build): harden rustls dependency path for Linux builds (#275) 2026-02-17 00:39:28 +08:00
fettpl
4aaa0444c9 ci: whitelist lxc-ci self-hosted runner label for actionlint
Add actionlint.yaml config to declare lxc-ci as a known custom label
for self-hosted runners, fixing the actionlint CI check.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 17:39:14 +01:00
fettpl
91ae151548 style: fix rustfmt formatting in SSRF tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 17:35:30 +01:00
Chummy
3234159c6c
chore(clippy): clear warning backlog and harden conversions (#383) 2026-02-17 00:32:33 +08:00
Chummy
a91516df7a
Merge pull request #368 from fettpl/fix/349-email-bounded-seen-set
fix(channels): bound email seen_messages set to prevent memory leak
2026-02-17 00:32:29 +08:00
fettpl
9df5a07640 ci: pin all GitHub Actions to full SHA digests
Pin every third-party GitHub Action to its current commit SHA with a
version comment, eliminating supply chain risk from mutable version
tags. Mutable tags (v4, v2, etc.) can be force-pushed by upstream
maintainers; SHA digests are immutable.

18 unique actions pinned across 9 workflow files.

Closes #357

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 17:32:18 +01:00
Chummy
53844f7207
feat(memory): lucid memory integration with optional backends (#285) 2026-02-17 00:31:50 +08:00
Chummy
04bf94443f
feat(browser): add optional computer-use sidecar backend (#335) 2026-02-17 00:31:45 +08:00
Chummy
db0904c8a4
Merge pull request #384 from zeroclaw-labs/chore/agents-supersede-coauthor
docs(agents): require co-author trailers when superseding PRs
2026-02-17 00:31:18 +08:00
Chummy
dc17a0575c docs(agents): require co-author attribution for superseded PR integrations 2026-02-17 00:29:21 +08:00
fettpl
e6ad48df48 fix(security): stop leaking serde parse details in gateway error responses
Replace the dynamic error message in the webhook JSON parsing error
path with a static message. Previously, the raw JsonRejection error
from axum/serde was interpolated into the HTTP response, potentially
exposing internal parsing details to unauthenticated callers.

The detailed error is now logged server-side via tracing::warn for
debugging, while the client receives a generic "Invalid JSON body"
message.

Closes #356

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 17:27:07 +01:00
fettpl
c54bfe3814 fix(security): move record_action before canonicalize in file_read
Move the rate limit budget consumption (record_action) to immediately
after the path allowlist check but before canonicalization. Previously,
an attacker could probe whether arbitrary paths exist via canonicalize
errors without consuming any rate limit budget, since record_action
was only called after the file size check.

Now every request that passes the basic path validation consumes rate
limit budget, regardless of whether the file exists.

Closes #354

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 17:21:52 +01:00
fettpl
5af74d1d20 fix(gateway): add periodic sweep to SlidingWindowRateLimiter
Add a sweep mechanism that removes stale IP entries from the rate
limiter's HashMap every 5 minutes. Previously, IPs that made a single
request and never returned would accumulate indefinitely, causing
unbounded memory growth proportional to unique client IPs.

The sweep runs inline during allow() calls — no background task needed.
A last_sweep timestamp ensures the full-map scan only happens once per
sweep interval, keeping amortized overhead minimal.

Closes #353

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 17:20:12 +01:00
fettpl
7db71de043 fix(channels): bound email seen_messages set to prevent memory leak
Replace unbounded HashSet<String> with a BoundedSeenSet that evicts
the oldest message IDs (FIFO) when the 100k capacity is reached. This
prevents memory growth proportional to email volume over the process
lifetime, capping the set at ~100k entries regardless of runtime.

Closes #349

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 00:19:03 +08:00
Chummy
7f4c688145
Merge pull request #374 from zeroclaw-labs/rewrite/coauthor-80da
chore(meta): fix co-author trailers for scheduled-task integration commit
2026-02-17 00:18:56 +08:00
fettpl
dd74e29f71 fix(security): block multicast/broadcast/reserved IPs in SSRF protection
Rewrite is_private_or_local_host() to use std::net::IpAddr for robust
IP classification instead of manual octet matching. Now blocks all
non-globally-routable address ranges:

- Multicast (224.0.0.0/4, ff00::/8)
- Broadcast (255.255.255.255)
- Reserved (240.0.0.0/4)
- Documentation (192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24)
- Benchmarking (198.18.0.0/15)
- IPv6 unique-local (fc00::/7) and link-local (fe80::/10)
- IPv4-mapped IPv6 (::ffff:x.x.x.x) with recursive v4 checks

Closes #352

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 17:18:17 +01:00
Chummy
6d856990c2 chore(meta): anchor co-author history rewrite to current main 2026-02-17 00:17:29 +08:00
Chummy
602ec1507c Merge pull request #331 from stakeswky/feat/lark-channel
feat(channels): add Lark/Feishu IM channel support
2026-02-17 00:14:35 +08:00
Chummy
703e701e31 Merge pull request #367 from fettpl/fix/348-http-header-sanitization
fix(tools): use original headers for HTTP requests, redact only in display
2026-02-17 00:14:34 +08:00
Will Sarg
6fd8b523b9 ci: route trusted docker and release publish jobs to self-hosted (#371) 2026-02-17 00:14:34 +08:00
fettpl
d5ca9a4a5c fix(main): remove duplicate ModelCommands enum definition
A duplicate ModelCommands enum was introduced in a recent merge,
causing E0119/E0428 compile errors on CI (Rust 1.92).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 00:14:34 +08:00
Will Sarg
a7d19b332e ci: route trusted security and workflow checks to self-hosted (#370) 2026-02-17 00:14:34 +08:00
fettpl
444d80e178 fix(tools): use original headers for HTTP requests, redact only in display
sanitize_headers was replacing sensitive header values with
***REDACTED*** before passing them to the actual HTTP request,
breaking any authenticated API call. Split into parse_headers
(preserves original values for the request) and
redact_headers_for_display (returns redacted copy for output/logging).

Closes #348

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 00:14:34 +08:00
Will Sarg
8e23cbc596 ci: route trusted pushes to self-hosted runner (#369) 2026-02-17 00:14:34 +08:00
cd slash
e349067f70 fix(providers): correct Fireworks AI base URL to include /v1 path (#346)
The Fireworks API endpoint requires /v1/chat/completions, but the
base URL was missing the /v1 path segment, causing 404 errors and
triggering a broken responses fallback.

Fix: Add /v1 to base URL so correct endpoint is built:
  https://api.fireworks.ai/inference/v1/chat/completions
2026-02-17 00:14:34 +08:00
Chummy
22714271fd feat(cost): add budget tracking core and harden storage reliability (#292) 2026-02-17 00:14:34 +08:00
Chummy
fac1b780cd fix(onboard): refresh MiniMax defaults and endpoint (#299) 2026-02-17 00:14:34 +08:00
Chummy
a85fcf43c3 fix(build): reduce release-build memory pressure on low-RAM devices (#303) 2026-02-17 00:14:34 +08:00
Chummy
fe1fb04278 fix(composio): align v3 execute path and honor configured entity_id (#322) 2026-02-17 00:14:34 +08:00
Chummy
e9fa267c84 feat(onboard): add provider model refresh command with TTL cache (#323) 2026-02-17 00:14:34 +08:00
Chummy
d7cca4b150 feat: unify scheduled tasks from #337 and #338 with security-first integration
Unifies scheduled task capabilities and consolidates overlapping implementations from #337 and #338 into a single security-first integration path.

Co-authored-by: Edvard <ecschoye@users.noreply.github.com>
Co-authored-by: stawky <stakeswky@users.noreply.github.com>
2026-02-17 00:14:34 +08:00
Chummy
639032c952
Merge pull request #331 from stakeswky/feat/lark-channel
feat(channels): add Lark/Feishu IM channel support
2026-02-17 00:08:05 +08:00
Chummy
2eb1c82a9b
Merge pull request #367 from fettpl/fix/348-http-header-sanitization
fix(tools): use original headers for HTTP requests, redact only in display
2026-02-17 00:06:21 +08:00
Will Sarg
9d21e2b28c
ci: route trusted docker and release publish jobs to self-hosted (#371) 2026-02-16 11:00:25 -05:00
fettpl
60e72a6ed5 fix(main): remove duplicate ModelCommands enum definition
A duplicate ModelCommands enum was introduced in a recent merge,
causing E0119/E0428 compile errors on CI (Rust 1.92).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 17:00:10 +01:00
fettpl
a871b28f85 fix(tools): use original headers for HTTP requests, redact only in display
sanitize_headers was replacing sensitive header values with
***REDACTED*** before passing them to the actual HTTP request,
breaking any authenticated API call. Split into parse_headers
(preserves original values for the request) and
redact_headers_for_display (returns redacted copy for output/logging).

Closes #348

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 16:59:05 +01:00
Will Sarg
7a66ce15c5
ci: route trusted security and workflow checks to self-hosted (#370) 2026-02-16 10:58:45 -05:00
Will Sarg
13d411cd2b
ci: route trusted pushes to self-hosted runner (#369) 2026-02-16 10:56:53 -05:00
cd slash
5b19502bd9
fix(providers): correct Fireworks AI base URL to include /v1 path (#346)
The Fireworks API endpoint requires /v1/chat/completions, but the
base URL was missing the /v1 path segment, causing 404 errors and
triggering a broken responses fallback.

Fix: Add /v1 to base URL so correct endpoint is built:
  https://api.fireworks.ai/inference/v1/chat/completions
2026-02-16 23:53:34 +08:00
Chummy
e4944a5fc2
feat(cost): add budget tracking core and harden storage reliability (#292) 2026-02-16 23:40:47 +08:00
Chummy
8882746ced
fix(onboard): refresh MiniMax defaults and endpoint (#299) 2026-02-16 23:40:44 +08:00