Milestone M9 implementation adds web access tools with security controls. New crate: crates/tools/web WebFetch Features: - HTTP client using reqwest - Domain allowlist/blocklist filtering * Empty allowlist = allow all domains (except blocked) * Non-empty allowlist = only allow specified domains * Blocklist always takes precedence - Redirect detection and blocking * Redirects to unapproved domains are blocked * Manual redirect policy (no automatic following) * Returns error message with redirect URL - Response capture with metadata * Status code, content, content-type * Original URL preserved WebSearch Features: - Pluggable provider trait using async-trait - SearchProvider trait for implementing search APIs - StubSearchProvider for testing - SearchResult structure with title, URL, snippet - Provider name identification Security Features: - Case-insensitive domain matching - Host extraction from URLs - Relative redirect URL resolution - Domain validation before requests - Explicit approval required for cross-domain redirects Tests added (9 new tests): Unit tests: 1. domain_filtering_allowlist - Verifies allowlist-only mode 2. domain_filtering_blocklist - Verifies blocklist takes precedence 3. domain_filtering_case_insensitive - Verifies case handling Integration tests with wiremock: 4. webfetch_domain_whitelist_only - Tests allowlist enforcement 5. webfetch_redirect_to_unapproved_domain - Blocks bad redirects 6. webfetch_redirect_to_approved_domain - Detects good redirects 7. webfetch_blocklist_overrides_allowlist - Blocklist priority 8. websearch_pluggable_provider - Provider pattern works 9. webfetch_successful_request - Basic fetch operation All 84 tests passing (up from 75). Note: CLI integration deferred - infrastructure is complete and tested. Future work will add CLI commands for web-fetch and web-search with domain configuration. Dependencies: reqwest 0.12, async-trait 0.1, wiremock 0.6 (test) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
20 lines
472 B
TOML
20 lines
472 B
TOML
[package]
|
|
name = "tools-web"
|
|
version = "0.1.0"
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
rust-version.workspace = true
|
|
|
|
[dependencies]
|
|
reqwest = { version = "0.12", features = ["json"] }
|
|
tokio = { version = "1.39", features = ["macros"] }
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
color-eyre = "0.6"
|
|
url = "2.5"
|
|
async-trait = "0.1"
|
|
|
|
[dev-dependencies]
|
|
tokio = { version = "1.39", features = ["macros", "rt-multi-thread"] }
|
|
wiremock = "0.6"
|