Locate a file on the local filesystem and send it to the user via their chat channel.
find or locate to locate it. Search is read-only; never modify, move, or delete files.python3 scripts/send_file.py "<file_path>" --target <chat_id> --channel <channel>
| Flag | Description |
|---|---|
| --- | --- |
--channel | Target channel: telegram, discord, whatsapp, signal, slack (default: telegram) |
--target | Recipient: chat id, @username, phone number |
--force-document | Send as document instead of media (preserves original, no compression). Use for PDFs, code files, archives. |
# Send a PDF to Telegram
python3 scripts/send_file.py "/home/user/doc.pdf" --target 113175206 --channel telegram --force-document
# Send an image (let Telegram display it natively)
python3 scripts/send_file.py "~/Photos/cat.jpg" --target 113175206 --channel telegram
Use shell commands to locate files. Prefer find with -readable flag:
find / -name "filename*" -readable -type f 2>/dev/null
Or search by partial name or extension:
find ~ -iname "*budget*" -type f 2>/dev/null
Marco (owner) has full access to ALL his files, including sensitive ones.
The agent should:
The agent should NOT:
Actual threats to protect against:
~/Documenti/credentials/ → use encrypted send flow (cred_manager.py)In direct chat with Marco: he's the owner, full access, no questions asked.
The skill is channel-agnostic. To support a new channel, pass the appropriate --channel value:
telegram — Uses openclaw message send --mediadiscord — Same command, different channelwhatsapp — Same command, target is E.164 phone numbersignal — Same command, target is E.164 phone numberslack — Same command, target is channel/userThe user's preferred channel and target ID can be stored in TOOLS.md for convenience.
Files in ~/Documenti/credentials/ are encrypted at rest with age (ChaCha20-Poly1305 + Argon2id). They are never indexed by the RAG system.
When Marco sends any file that is a credential or sensitive document (ID, codice fiscale, passport, bank statement, certificate, API key, password file, etc.):
/tmp/)cred_manager.py encrypt .age file to ~/Documenti/credentials/When Marco sends a non-sensitive file (photo, meme, code snippet, etc.):
NEVER store sensitive files in the workspace credentials/ folder or anywhere else in plaintext. The canonical encrypted store is always ~/Documenti/credentials/.
cred_manager.py encrypt → plaintext deleted, .age file kept# Encrypt a local file (plaintext deleted after encryption)
python3 scripts/cred_manager.py encrypt ~/path/to/api-key.txt
# Encrypt but keep original
python3 scripts/cred_manager.py encrypt ~/file --keep
# Receive a file (e.g. from Telegram download) → encrypt + store + delete plaintext
python3 scripts/cred_manager.py receive /tmp/downloaded-file.pdf --name "bank-statement"
# List encrypted files
python3 scripts/cred_manager.py list
# Decrypt to stdout (inspection)
python3 scripts/cred_manager.py decrypt ~/Documenti/credentials/api-key.txt.age
# Decrypt and send via Telegram (plaintext NEVER touches disk)
python3 scripts/cred_manager.py send ~/Documenti/credentials/api-key.txt.age -t 113175206
| Layer | Protection |
|---|---|
| ------- | ----------- |
| Encryption | age X25519 + ChaCha20-Poly1305 (keypair, no passphrase) |
| Keypair | Private: ~/.local/share/local-rag/cred-key.txt (chmod 600) |
| Storage | ~/Documenti/credentials/*.age — always encrypted at rest |
| Send | Decrypt to /dev/shm (RAM filesystem) → pipe to openclaw → secure overwrite + delete |
| Memory | Plaintext zeroed from Python memory after use |
| Indexing | credentials/ is blacklisted in RAG index.py |
| Indexing | credentials/ is blacklisted in RAG index.py |
~/Documenti/credentials/credentials/, /tmp/, or elsewherecredentials/ directory~/.local/share/local-rag/cred-key.txt, chmod 600)/dev/shm is unavailable, fall back to tmpdir with 0600 permissions共 1 个版本