Security
The permission model, secrets, and what goes out over the wire.
- Permissive by default + always-on guardrails: allows almost everything, but denies
.envreads and catastrophic shell commands (rm -rf /,mkfs,dd of=/dev/…, fork bombs) and asks before working outside the project dir or force-pushing. Real isolation via documented containers. - Allow / ask / deny policy keyed by tool with glob patterns and
default/strict/read-only/yolomodes — set via~/.config/luxe/permissions.json, a tighten-only project.luxe/permissions.json, or--permission-mode/--read-only/--yolo/--trust-project. In the TUI anaskshows a prompt with four answers — once, this session, always (written to the globalpermissions.json, so it survives a restart), or reject — and an “always” for a path outside the project approves that directory, not just the one file. Headless/loop auto-allow but still enforce everydeny. - Secrets:
0600auth file (written atomically, under a cross-process lock, never clobbering what it doesn’t understand), env vars,$ENV/!commandresolution; keys held assecrecy::SecretString(zeroized on drop) with redactedDebug/Serialize, and secret-shaped strings scrubbed from tool output, transcripts, and logs. OAuth tokens refresh once under that same lock, so concurrent turns can’t lose a rotating refresh token. - Terms-respecting sign-in: subscription OAuth only where the provider permits third-party clients (ChatGPT Codex, GitHub Copilot, OpenRouter). Anthropic and Google are API-key only — their terms forbid harness use of a subscription, and the wizard says so rather than shipping a flow that gets your account actioned.
- SSRF-guarded
web_fetch+screenshot mode=url(blocks localhost/private/metadata/file://, pins DNS). No telemetry, no phone-home — only optional outbound calls are the LLM provider, theweb_*tools, and the models.dev metadata refresh. - Rust with
unsafe_code = "forbid", a lean dependency tree, and acargo-deny+--lockedCI supply-chain gate.