Chummy
49fcc7a2c4
test: deepen and complete project-wide test coverage ( #297 )
...
* test: deepen coverage for health doctor provider and tunnels
* test: add broad trait and module re-export coverage
2026-02-16 05:58:24 -05:00
Chummy
85fc12bcf7
feat(browser): add optional rust-native backend via fantoccini
...
* feat(browser): add optional rust-native automation backend
* style: align channels module with stable rustfmt
* fix(browser): switch rust-native backend to fantoccini
Replace headless_chrome with fantoccini to satisfy license checks and keep browser-native optional. Adds native_webdriver_url wiring, migrates native backend session/actions to WebDriver, updates docs/config defaults, and keeps backend auto-resolution behavior intact.
* test(config): serialize env override tests with lock
Prevent flaky CI failures caused by concurrent environment variable mutation across config env-override tests.
* style: apply rustfmt 1.92 for CI parity
* chore(ci): sync lockfile and rustfmt with current main
Resolve feature table drift after rebasing onto latest main, refresh Cargo.lock for browser-native fantoccini, and apply rustfmt 1.92 formatting required by CI.
2026-02-16 05:25:27 -05:00
Chummy
9d29f30a31
fix(channels): execute tool calls in channel runtime ( #302 )
...
* fix(channels): execute tool calls in channel runtime (#302 )
* chore(fmt): align repo formatting with rustfmt 1.92
2026-02-16 05:07:01 -05:00
Argenis
0383a82a6f
feat(security): Add Phase 1 security features
...
* test: add comprehensive recovery tests for agent loop
Add recovery test coverage for all edge cases and failure scenarios
in the agentic loop, addressing the missing test coverage for
recovery use cases.
Tool Call Parsing Edge Cases:
- Empty tool_result tags
- Empty tool_calls arrays
- Whitespace-only tool names
- Empty string arguments
History Management:
- Trimming without system prompt
- Role ordering consistency after trim
- Only system prompt edge case
Arguments Parsing:
- Invalid JSON string fallback
- None arguments handling
- Null value handling
JSON Extraction:
- Empty input handling
- Whitespace only input
- Multiple JSON objects
- JSON arrays
Tool Call Value Parsing:
- Missing name field
- Non-OpenAI format
- Empty tool_calls array
- Missing tool_calls field fallback
- Top-level array format
Constants Validation:
- MAX_TOOL_ITERATIONS bounds (prevent runaway loops)
- MAX_HISTORY_MESSAGES bounds (prevent memory bloat)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(security): Add Phase 1 security features - sandboxing, resource limits, audit logging
Phase 1 security enhancements with zero impact on the quick setup wizard:
- ✅ Pluggable sandbox trait system (traits.rs)
- ✅ Landlock sandbox support (Linux kernel 5.13+)
- ✅ Firejail sandbox support (Linux user-space)
- ✅ Bubblewrap sandbox support (Linux/macOS user namespaces)
- ✅ Docker sandbox support (container isolation)
- ✅ No-op fallback (application-layer security only)
- ✅ Auto-detection logic (detect.rs)
- ✅ Audit logging with HMAC signing support (audit.rs)
- ✅ SecurityConfig schema (SandboxConfig, ResourceLimitsConfig, AuditConfig)
- ✅ Feature-gated implementation (sandbox-landlock, sandbox-bubblewrap)
- ✅ 1,265 tests passing
Key design principles:
- Silent auto-detection: no new prompts in wizard
- Graceful degradation: works on all platforms
- Feature flags: zero overhead when disabled
- Pluggable architecture: swap sandbox backends via config
- Backward compatible: existing configs work unchanged
Config usage:
```toml
[security.sandbox]
enabled = false # Explicitly disable
backend = "auto" # auto, landlock, firejail, bubblewrap, docker, none
[security.resources]
max_memory_mb = 512
max_cpu_time_seconds = 60
[security.audit]
enabled = true
log_path = "audit.log"
sign_events = false
```
Security documentation:
- docs/sandboxing.md: Sandbox implementation strategies
- docs/resource-limits.md: Resource limit approaches
- docs/audit-logging.md: Audit logging specification
- docs/security-roadmap.md: 3-phase implementation plan
- docs/frictionless-security.md: Zero-impact wizard design
- docs/agnostic-security.md: Platform/hardware agnostic approach
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 04:14:16 -05:00
Argenis
1140a7887d
feat: add HTTP request tool for API interactions
...
Implements #210 - Add http_request tool that enables the agent to make
HTTP requests to external APIs.
Features:
- Supports GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS methods
- JSON request/response handling
- Configurable timeout (default: 30s)
- Configurable max response size (default: 1MB)
- Security: domain allowlist, blocks local/private IPs (SSRF protection)
- Headers support with auth token redaction
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 03:44:42 -05:00
Argenis
0e0b3644a8
feat(config): add Lark/Feishu channel config support
...
* feat(config): add Lark/Feishu channel config support
- Add LarkConfig struct with app_id, app_secret, encrypt_key, verification_token, allowed_users, use_feishu fields
- Add lark field to ChannelsConfig
- Export LarkConfig in config/mod.rs
- Add 5 tests for LarkConfig serialization/deserialization
Related to #164
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: apply cargo fmt formatting
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 00:16:04 -05:00
Argenis
c8ca6ff059
feat: agent-to-agent handoff and delegation
...
* feat: add agent-to-agent delegation tool
Add `delegate` tool enabling multi-agent workflows where a primary agent
can hand off subtasks to specialized sub-agents with different
provider/model configurations.
- New `DelegateAgentConfig` in config schema with provider, model,
system_prompt, api_key, temperature, and max_depth fields
- `delegate` tool with recursion depth limits to prevent infinite loops
- Agents configured via `[agents.<name>]` TOML sections
- Sub-agents use `ReliableProvider` with fallback API key support
- Backward-compatible: empty agents map when section is absent
Closes #218
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: encrypt agent API keys and tighten delegation input validation
Address CodeRabbit review comments on PR #224 :
1. Agent API key encryption (schema.rs):
- Config::load_or_init() now decrypts agents.*.api_key via SecretStore
- Config::save() encrypts plaintext agent API keys before writing
- Updated doc comment to document encryption behavior
- Added tests for encrypt-on-save and plaintext-when-disabled
2. Delegation input validation (delegate.rs):
- Added "additionalProperties": false to schema
- Added "minLength": 1 for agent and prompt fields
- Trim agent/prompt/context inputs, reject empty after trim
- Added tests for blank agent, blank prompt, whitespace trimming
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(delegate): replace mutable depth counter with immutable field
- Replace `current_depth: Arc<AtomicU32>` with `depth: u32` set at
construction time, eliminating TOCTOU race and cancel/panic safety
issues from fetch_add/fetch_sub pattern
- When sub-agents get their own tool registry, construct via
`with_depth(agents, key, parent.depth + 1)` for proper propagation
- Add tokio::time::timeout (120s) around provider calls to prevent
indefinite blocking from misbehaving sub-agent providers
- Rename misleading test whitespace_agent_name_not_found →
whitespace_agent_name_trimmed_and_found
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* style: fix rustfmt formatting issues
Fixed all formatting issues reported by cargo fmt to pass CI lint checks.
- Line length adjustments
- Chain formatting consistency
- Trailing whitespace cleanup
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Edvard <ecschoye@stud.ntnu.no>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 23:56:42 -05:00
Chummy
b0e1e32819
feat(config): make config writes atomic with rollback-safe replacement ( #190 )
...
* feat(runtime): add Docker runtime MVP and runtime-aware command builder
* feat(security): add shell risk classification, approval gates, and action throttling
* feat(gateway): add per-endpoint rate limiting and webhook idempotency
* feat(config): make config writes atomic with rollback-safe replacement
---------
Co-authored-by: chumyin <chumyin@users.noreply.github.com>
2026-02-15 12:18:45 -05:00
Argenis
1cfc63831c
feat(providers): add multi-model router for task-based provider routing
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 11:40:58 -05:00
argenis de la rosa
76074cb789
fix: run Docker container as non-root user ( closes #34 )
...
- Switch to gcr.io/distroless/cc-debian12:nonroot
- Add explicit USER 65534:65534 directive
- Add Docker security CI job verifying non-root UID, :nonroot base, and USER directive
- Document CIS Docker Benchmark compliance in SECURITY.md
- Add tests and edge cases for container security
2026-02-14 13:16:33 -05:00
argenis de la rosa
ec2d5cc93d
feat: enhance agent personality, tool guidance, and memory hygiene
...
- Expand communication style presets (professional, expressive, custom)
- Enrich SOUL.md with human-like tone and emoji-awareness guidance
- Add crash recovery and sub-task scoping guidance to AGENTS.md scaffold
- Add 'Use when / Don't use when' guidance to TOOLS.md and runtime prompts
- Implement memory hygiene system with configurable archiving and retention
- Add MemoryConfig options: hygiene_enabled, archive_after_days, purge_after_days, conversation_retention_days
- Archive old daily memory and session files to archive subdirectories
- Purge old archives and prune stale SQLite conversation rows
- Add comprehensive tests for new features
2026-02-14 11:28:39 -05:00
argenis de la rosa
3d91c40970
refactor: simplify CLI commands and update architecture docs
...
1. Simplify CLI:
- Make 'onboard' quick setup default (remove --quick)
- Add --interactive flag for full wizard
- Make 'status' detailed by default (remove --verbose)
- Remove 'tools list/test' and 'integrations list' commands
- Add 'channel doctor' command
2. Update Docs:
- Update architecture.svg with Channel allowlists, Browser allowlist, and latest stats
- Update README.md with new command usage and browser/channel config details
3. Polish:
- Browser tool integration
- Channel allowlist logic (empty = deny all)
2026-02-14 05:17:16 -05:00
argenis de la rosa
f8befafe4d
feat: add Composio tool provider + encrypted secret store + wizard integration
...
- src/tools/composio.rs: ComposioTool implementing Tool trait
- list/execute/connect actions via Composio API (1000+ OAuth apps)
- 60s timeout, proper error handling, JSON schema for LLM
- 12 tests covering schema, validation, serde, error paths
- src/security/secrets.rs: SecretStore for encrypted credential storage
- XOR cipher with random 32-byte key stored in ~/.zeroclaw/.secret_key
- enc: prefix for encrypted values, plaintext passthrough (backward compat)
- Key file created with 0600 permissions (Unix)
- 16 tests: roundtrip, unicode, long secrets, corrupt hex, permissions
- src/config/schema.rs: ComposioConfig + SecretsConfig structs
- Composio: enabled (default: false), api_key, entity_id
- Secrets: encrypt (default: true)
- Both with serde(default) for backward compatibility
- 8 new config tests
- src/onboard/wizard.rs: new Step 5 'Tool Mode & Security'
- Sovereign (local only) vs Composio (managed OAuth) selection
- Encrypted secret storage toggle (default: on)
- 7-step wizard (was 6)
- src/tools/mod.rs: all_tools() now accepts optional composio_key
- src/agent/loop_.rs: wires Composio key from config into tool registry
- README.md: Composio integration + encrypted secrets documentation
1017 tests, 0 clippy warnings, cargo fmt clean.
2026-02-14 02:41:29 -05:00
argenis de la rosa
b2aff60722
security: pass all 4 checklist items — gateway not public, pairing required, filesystem scoped, tunnel access
...
Security checklist from @anshnanda / @ledger_eth:
✅ Gateway not public — default bind 127.0.0.1, refuses 0.0.0.0 without
tunnel or explicit allow_public_bind=true in config
✅ Pairing required — one-time 6-digit code printed on startup, exchanged
for bearer token via POST /pair, enforced on all /webhook requests
✅ Filesystem scoped (no /) — workspace_only=true by default, null byte
injection blocked, 14 system dirs + 4 sensitive dotfiles in forbidden
list, is_resolved_path_allowed() for symlink escape prevention
✅ Access via Tailscale/SSH tunnel — tunnel system integrated, gateway
refuses public bind without active tunnel
New files:
src/security/pairing.rs — PairingGuard with OTP generation, constant-time
code comparison, bearer token issuance, token persistence
Changed files:
src/config/schema.rs — GatewayConfig (require_pairing, allow_public_bind,
paired_tokens), expanded AutonomyConfig forbidden_paths
src/config/mod.rs — export GatewayConfig
src/gateway/mod.rs — public bind guard, pairing enforcement on /webhook,
/pair endpoint, /health no longer leaks version/memory info
src/security/policy.rs — null byte blocking, is_resolved_path_allowed(),
expanded forbidden_paths (14 system dirs + 4 dotfiles)
src/security/mod.rs — export pairing module
src/onboard/wizard.rs — wire gateway config
935 tests passing (up from 905), 0 clippy warnings, cargo fmt clean
2026-02-14 00:39:51 -05:00
argenis de la rosa
390cbc0a6c
feat: agnostic tunnel system — bring your own tunnel provider
...
New Tunnel trait + 5 implementations:
- NoneTunnel: local-only, no external exposure (default)
- CloudflareTunnel: wraps cloudflared binary, extracts public URL
- TailscaleTunnel: tailscale serve (tailnet) or funnel (public)
- NgrokTunnel: wraps ngrok binary, supports custom domains
- CustomTunnel: user-provided command with {port}/{host} placeholders
Config schema:
- [tunnel] section with provider selector
- Provider-specific sub-configs: cloudflare, tailscale, ngrok, custom
- Backward compatible (serde default = "none")
Gateway integration:
- Tunnel starts automatically on 'zeroclaw gateway'
- Prints public URL on success, falls back to local on failure
20 new tests (factory, constructors, NoneTunnel async start/health)
649 tests passing, 0 clippy warnings, cargo fmt clean
2026-02-13 16:25:01 -05:00
argenis de la rosa
05cb353f7f
feat: initial release — ZeroClaw v0.1.0
...
- 22 AI providers (OpenRouter, Anthropic, OpenAI, Mistral, etc.)
- 7 channels (CLI, Telegram, Discord, Slack, iMessage, Matrix, Webhook)
- 5-step onboarding wizard with Project Context personalization
- OpenClaw-aligned system prompt (SOUL.md, IDENTITY.md, USER.md, AGENTS.md, etc.)
- SQLite memory backend with auto-save
- Skills system with on-demand loading
- Security: autonomy levels, command allowlists, cost limits
- 532 tests passing, 0 clippy warnings
2026-02-13 12:19:14 -05:00