Metadata-Version: 2.4
Name: sealnet
Version: 1.4.0
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Rust
Classifier: Operating System :: MacOS
Classifier: Operating System :: POSIX :: Linux
Classifier: Operating System :: Microsoft :: Windows
Classifier: Topic :: Security :: Cryptography
Requires-Dist: httpx>=0.27
Summary: SEAL: hand large files and secrets between agents and people without the content passing through the chat, the model or the SEAL server.
Keywords: seal,e2ee,end-to-end-encryption,file-sharing,secrets,agents,mcp
Author: SEAL
Requires-Python: >=3.9
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
Project-URL: Documentation, https://seal.net/docs
Project-URL: Homepage, https://seal.net

# sealnet

SEAL is how agents and people hand each other large files and secrets without the content passing through the chat, the model or the SEAL server.

```bash
pip install sealnet
```

```python
import sealnet

sent = sealnet.send("dump.sql")                  # up to 1 GB free; the key rides in the link's fragment
print(sent.share_url)                            # give this to the person

files = sealnet.open(link, to="downloads")       # streamed to disk, 0600, named only after the digest matched
keys = sealnet.keygen()                          # an X25519 identity: public_key is your address
sealnet.send("report.pdf", to=their_address)     # only their key opens it, and it lands in their inbox

box = sealnet.inbox(secret_key=keys.secret_key, wait=60)   # what was sent to your address
files = sealnet.open(box.items[0], secret_key=keys.secret_key, to="downloads")
sealnet.dismiss(box.items[0], secret_key=keys.secret_key)

ask = sealnet.request("Brave API key", public_key=keys.public_key, kind="secret",
                      where_url="https://api.search.brave.com/app/keys")
print(ask.url, ask.words)                        # the person answers on this page; the words match theirs
files = sealnet.wait(ask.id, secret_key=keys.secret_key, to="secrets")   # a path, never the value

sealnet.revoke(sent.seal_id, sent.owner_token)

ask = sealnet.pair(secret_key=keys.secret_key, name="Report bot")   # connect to a person's SEAL inbox
print(ask.url, ask.words)                        # they open it on the device with their inbox
owner = sealnet.wait_pair(ask.id, secret_key=keys.secret_key)
sealnet.send("report.pdf", owner=owner.address, secret_key=keys.secret_key)   # also in their inbox to manage
sealnet.request("Brave API key", public_key=keys.public_key, to=owner.address)  # waits in their inbox
```

Inside an event loop use `sealnet.aio`, the same functions as coroutines.

- Everything is encrypted on this machine by the SEAL Rust core, built into this wheel as `sealnet.seal_crypto`; the server stores ciphertext.
- Files stream both ways: memory stays at one part on the way up and one segment on the way down, whatever the size.
- `keygen().secret_key` is the same value as `SEAL_SEED` of the `seal` CLI and of `sealnet-mcp`: one key gives one address in every client.
- `send(..., secret=True)` marks a secret (30 minutes, one open unless said otherwise); `open` reports `secret=True` so a receiving agent saves it and never prints it.
- Nothing is sent anywhere but the SEAL API you point it at: no telemetry, no update checks.
- `Request.emoji` and `InboxItem.sender`, the fingerprint of releases before 1.4, stay until 2.0; use `words` and `sender_words`.

Errors are `sealnet.SealError` with a stable `code` (`seal_revoked`, `otp_required`, `integrity_check_failed`, `payment_required`, …).

Documentation: https://seal.net/docs

