Avatar
Analysis
The avatar’s purpose is clear, but review it carefully because it exposes a provider API key to the browser, requests OpenClaw operator read/write access, persists a device key, and renders agent output as raw HTML.
Findings (6)
Artifact-based informational review of SKILL.md, metadata, install specs, static scan signals, and capability signals. ClawScan does not execute the skill or run runtime probes.
Checks for instructions or behavior that redirect the agent, misuse tools, execute unexpected code, cascade across systems, exploit user trust, or continue outside the intended task.
detailContentEl.innerHTML = window.marked.parse(detail);
The browser renders agent-generated detail text as HTML without a sanitizer shown in the artifacts, so malicious or poisoned response content could become active page content.
const KEYPAIR_PATH = './device-key.json'; ... writeFileSync(KEYPAIR_PATH, JSON.stringify({ privateDer: privDer.toString('base64'), publicRaw: publicKeyRaw.toString('base64') }))Startup creates a stable device identity keypair on disk; this is not hidden from the code, but it persists credential-like material across runs.
"bin": { "openclaw-avatar": "dist/cli.js" }, ... "simli-client": "latest"The skill is installed as a global npm CLI and one runtime dependency is unpinned as `latest`, which can change between installs.
await fetch('/api/send-slack', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ text }) });The client can send generated detail text to Slack when configured and triggered; this is disclosed and purpose-aligned, but it externalizes potentially sensitive response content.
Checks whether tool use, credentials, dependencies, identity, account access, or inter-agent boundaries are broader than the stated purpose.
/** Get configuration safe to send to the client (no secrets) */ ... simliApiKey: config.secrets.simliApiKey
A value loaded from SIMLI_API_KEY is explicitly included in the client configuration sent to the browser, despite being treated as a secret in environment configuration.
role: 'operator', scopes: ['operator.read', 'operator.write'], ... auth: { token } ... method: 'chat.send'The avatar connects to the OpenClaw gateway with operator read/write scopes and optional OPENCLAW_TOKEN, then sends chat requests into the agent session.
