* feat: add screenshot and image_info vision tools Add two new tools for visual capabilities: - `screenshot`: captures screen using platform-native commands (screencapture on macOS, gnome-screenshot/scrot/import on Linux), returns file path + base64-encoded PNG data - `image_info`: reads image metadata (format, dimensions, size) from header bytes without external deps, optionally returns base64 data for future multimodal provider support Both tools are registered in the tool registry and agent system prompt. Includes 24 inline tests covering format detection, dimension extraction, schema validation, and execution edge cases. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: resolve unused variable warning after rebase Prefix unused `resolved_key` with underscore to suppress compiler warning introduced by upstream changes. Update Cargo.lock. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: address review comments on vision tools Security fixes: - Fix JPEG parser infinite loop on malformed zero-length segments - Add workspace path restriction to ImageInfoTool (prevents arbitrary file exfiltration via include_base64) - Quote paths in Linux screenshot shell commands to prevent injection - Add autonomy-level check in ScreenshotTool::execute Robustness: - Add file size guard in read_and_encode before loading into memory - Wire resolve_api_key through all provider match arms (was dead code) - Gate screenshot_command_exists test on macOS/Linux only - Infer MIME type from file extension instead of hardcoding image/png Tests: - Add JPEG dimension extraction test - Add JPEG malformed zero-length segment test Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: argenis de la rosa <theonlyhennygod@gmail.com>
108 lines
3.6 KiB
TOML
108 lines
3.6 KiB
TOML
[package]
|
|
name = "zeroclaw"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
authors = ["theonlyhennygod"]
|
|
license = "MIT"
|
|
description = "Zero overhead. Zero compromise. 100% Rust. The fastest, smallest AI assistant."
|
|
repository = "https://github.com/theonlyhennygod/zeroclaw"
|
|
readme = "README.md"
|
|
keywords = ["ai", "agent", "cli", "assistant", "chatbot"]
|
|
categories = ["command-line-utilities", "api-bindings"]
|
|
|
|
[dependencies]
|
|
# CLI - minimal and fast
|
|
clap = { version = "4.5", features = ["derive"] }
|
|
|
|
# Async runtime - feature-optimized for size
|
|
tokio = { version = "1.42", default-features = false, features = ["rt-multi-thread", "macros", "time", "net", "io-util", "sync", "process", "io-std", "fs", "signal"] }
|
|
|
|
# HTTP client - minimal features
|
|
reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls", "blocking", "multipart", "stream"] }
|
|
|
|
# Serialization
|
|
serde = { version = "1.0", default-features = false, features = ["derive"] }
|
|
serde_json = { version = "1.0", default-features = false, features = ["std"] }
|
|
|
|
# Config
|
|
directories = "5.0"
|
|
toml = "0.8"
|
|
shellexpand = "3.1"
|
|
|
|
# Logging - minimal
|
|
tracing = { version = "0.1", default-features = false }
|
|
tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt", "ansi"] }
|
|
|
|
# Observability - Prometheus metrics
|
|
prometheus = { version = "0.13", default-features = false }
|
|
|
|
# Base64 encoding (screenshots, image data)
|
|
base64 = "0.22"
|
|
|
|
# Error handling
|
|
anyhow = "1.0"
|
|
thiserror = "2.0"
|
|
|
|
# UUID generation
|
|
uuid = { version = "1.11", default-features = false, features = ["v4", "std"] }
|
|
|
|
# Authenticated encryption (AEAD) for secret store
|
|
chacha20poly1305 = "0.10"
|
|
|
|
# HMAC for webhook signature verification
|
|
hmac = "0.12"
|
|
sha2 = "0.10"
|
|
hex = "0.4"
|
|
|
|
# Async traits
|
|
async-trait = "0.1"
|
|
|
|
# Memory / persistence
|
|
rusqlite = { version = "0.32", features = ["bundled"] }
|
|
chrono = { version = "0.4", default-features = false, features = ["clock", "std", "serde"] }
|
|
cron = "0.12"
|
|
|
|
# Interactive CLI prompts
|
|
dialoguer = { version = "0.11", features = ["fuzzy-select"] }
|
|
console = "0.15"
|
|
|
|
# Discord WebSocket gateway
|
|
tokio-tungstenite = { version = "0.24", features = ["rustls-tls-webpki-roots"] }
|
|
futures-util = { version = "0.3", default-features = false, features = ["sink"] }
|
|
hostname = "0.4.2"
|
|
lettre = { version = "0.11.19", default-features = false, features = ["builder", "smtp-transport", "rustls-tls"] }
|
|
mail-parser = "0.11.2"
|
|
rustls = "0.23"
|
|
rustls-pki-types = "1.14.0"
|
|
tokio-rustls = "0.26.4"
|
|
webpki-roots = "1.0.6"
|
|
|
|
# HTTP server (gateway) — replaces raw TCP for proper HTTP/1.1 compliance
|
|
axum = { version = "0.7", default-features = false, features = ["http1", "json", "tokio", "query"] }
|
|
tower = { version = "0.5", default-features = false }
|
|
tower-http = { version = "0.6", default-features = false, features = ["limit", "timeout"] }
|
|
http-body-util = "0.1"
|
|
|
|
# OpenTelemetry — OTLP trace + metrics export
|
|
opentelemetry = { version = "0.31", default-features = false, features = ["trace", "metrics"] }
|
|
opentelemetry_sdk = { version = "0.31", default-features = false, features = ["trace", "metrics"] }
|
|
opentelemetry-otlp = { version = "0.31", default-features = false, features = ["trace", "metrics", "http-proto", "reqwest-blocking-client"] }
|
|
|
|
[profile.release]
|
|
opt-level = "z" # Optimize for size
|
|
lto = true # Link-time optimization
|
|
codegen-units = 1 # Better optimization
|
|
strip = true # Remove debug symbols
|
|
panic = "abort" # Reduce binary size
|
|
|
|
[profile.dist]
|
|
inherits = "release"
|
|
opt-level = "z"
|
|
lto = "fat"
|
|
codegen-units = 1
|
|
strip = true
|
|
panic = "abort"
|
|
|
|
[dev-dependencies]
|
|
tokio-test = "0.4"
|
|
tempfile = "3.14"
|