Commit graph

455 commits

Author SHA1 Message Date
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
Chummy
3fd901a5ec
fix(build): reduce release-build memory pressure on low-RAM devices (#303) 2026-02-16 23:40:40 +08:00
Chummy
23b0f360c2
fix(composio): align v3 execute path and honor configured entity_id (#322) 2026-02-16 23:40:37 +08:00
Chummy
a403b5f5b1
feat(onboard): add provider model refresh command with TTL cache (#323) 2026-02-16 23:40:33 +08:00
Chummy
80da3e64e9
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.\n\nCo-authored-by: Edvard <ecschoye@stud.ntnu.no>\nCo-authored-by: stawky <stakeswky@gmail.com>
2026-02-16 23:38:29 +08:00
Chummy
826f3836c7 fix(test): adapt lark schema assertions to current config fields 2026-02-16 22:57:45 +08:00
stawky
760728d038 feat(channels): add Lark/Feishu IM channel support
Implement Lark/Feishu as a new channel for ZeroClaw (Issue #164).

- Add LarkChannel with Channel trait impl (name, listen, send)
- listen: HTTP server (axum) for event callback with URL verification
  (challenge response) and im.message.receive_v1 text message parsing
- send: POST /open-apis/im/v1/messages with tenant_access_token auth
- get_tenant_access_token with caching and auto-refresh on 401
- Allowlist filtering by open_id (same pattern as other channels)
- Add LarkConfig to schema (app_id, app_secret, verification_token, port, allowed_users)
- Register lark in channel list, doctor, and start_channels
- 18 unit tests: config serde, allowlist, channel name, message parsing,
  edge cases (unicode, missing fields, invalid JSON, wrong event type)
- Fix pre-existing SchedulerConfig compile error on main
2026-02-16 22:54:45 +08:00
Will Sarg
f0373f2db1
docs(agents): clarify branch lifecycle and worktree workflow (#344) 2026-02-16 09:37:28 -05:00
Chummy
c842ece12c
feat(onboard): refresh model discovery and canonicalize provider aliases (#341)
* feat(onboard): add model refresh command with ttl cache

* fix(onboard): refresh curated models and canonicalize provider aliases

* fix(channels): align agent_turn call signature

* fix(channels): call run_tool_call_loop for stable channel runtime
2026-02-16 22:32:30 +08:00
Chummy
0995c57776
Merge pull request #321 from stakeswky/feat/model-failover-auth-rotation
feat(providers): model failover chain + API key rotation
2026-02-16 22:27:32 +08:00
Chummy
dea02a6915
Merge pull request #318 from zeroclaw-labs/fix/issue-309-composio-v3-endpoint
fix: update Composio API endpoint from v2 to v3
2026-02-16 22:26:40 +08:00
Will Sarg
b61d33aa1c
feat(dev): add local dockerized ci workflow (#342) 2026-02-16 09:10:39 -05:00
Chummy
8bcb5efa8a fix(ci): align reliable provider tests with ChatResponse 2026-02-16 22:06:40 +08:00
Chummy
f2c73bacf8
Merge pull request #343 from zeroclaw-labs/chore-codeowner-route-ci-docs
chore(codeowners): route ci/docs surfaces to @chumyin
2026-02-16 22:00:57 +08:00
Chummy
1c3f4ec804
`chore(codeowners): route ci/docs surfaces to @chumyin
add route ci/docs surfaces to @chumyin to view directly.
2026-02-16 21:59:38 +08:00
stawky
9a5db46cf7 feat(providers): model failover chain + API key rotation
- Add model_fallbacks and api_keys to ReliabilityConfig
- Implement per-model fallback chain in ReliableProvider
- Add API key rotation on auth failures (401/403)
- Add retry-after header parsing and exponential backoff
- Integrate failover into chat_with_system and chat_with_history
- 20 unit tests covering failover, rotation, and retry logic
2026-02-16 21:59:35 +08:00
Chummy
ef41f2ab10 chore(fmt): format composio conflict-resolution tests 2026-02-16 21:54:19 +08:00
Chummy
fa9cdabbcb
Merge pull request #340 from chumyin/fix/agent-turn-provider-name-signature
fix(agent): align channel agent_turn signature with provider label
2026-02-16 21:51:17 +08:00
Chummy
593dbb3641 fix(agent): align agent_turn signature with channel provider label 2026-02-16 21:48:49 +08:00
argenis de la rosa
58693ae5a1 fix: update Composio API endpoint from v2 to v3
Fixes #309 - Composio v2 endpoint has been discontinued. Updated to v3
endpoint which is the current supported version.

Composio v2 API is no longer available, causing all Composio tool
executions to fail. This updates the base URL to use v3.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 21:40:22 +08:00